找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6270|回复: 1
打印 上一主题 下一主题
收起左侧

矩阵键盘控制流水灯(stc89c52rc单片机)

[复制链接]
跳转到指定楼层
楼主
ID:390950 发表于 2018-8-28 20:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
键盘控制流水灯.rar (25.65 KB, 下载次数: 38)


刚开始学单片机,写了个小程序。用p0操作流水灯,用p2读取键盘还不太熟悉,如有谬误麻烦指正,跟我一样的新手可以参考一下
  1. #include <reg52.h>

  2. /*
  3.         R1C1\C2\C3\C4==>LED1\2\3\4
  4.         R2C1\C2\C3\C4==>LED5\6\7\8
  5.         P2==>键盘
  6.         P0==>流水灯
  7. */

  8. //functions
  9. void delayms(unsigned int);
  10. int keyScan();


  11. //VARIABLES        
  12. int a,keyNum;
  13. unsigned char num=0;
  14. unsigned char led;
  15. unsigned char lightUp[]={
  16.         0xfe,0xfd,0xfb,0xf7,
  17.         0xef,0xdf,0xbf,0x7f};

  18. void main()
  19. {
  20.                
  21.         
  22.         led=0xff;        
  23.         while(1) {
  24.                 //light up led
  25.                 P0=led;
  26.                 P2=0xfe;   //row1
  27.                 keyNum=keyScan();
  28.                 if(keyNum==0){
  29.                         P2=0xfd;   //row2
  30.                         keyNum=keyScan();
  31.                         if(keyNum==0){
  32.                                 P2=0xfb;   //row3
  33.                                 keyNum=keyScan();
  34.                                 if(keyNum==0){
  35.                                         P2=0xf7;   //row4
  36.                                         keyNum=keyScan();
  37.                                 }
  38.                         }
  39.                 }
  40.                
  41.                 if((keyNum<=7)&&(keyNum>0)){
  42.                         led=lightUp[keyNum-1];        
  43.                         //delayms(100);
  44.                 }
  45.                
  46.         }
  47.                
  48.         
  49. }
  50. void delayms(unsigned int xms)
  51. {
  52.         unsigned int i,j;
  53.         for(i=0;i<xms;i++)
  54.         {
  55.                 for(j=0;j<110;j++);
  56.         }
  57. }


  58. int keyScan(){
  59.         int key=0;
  60.         unsigned char temp;
  61.         temp=P2&0xf0;
  62.         if(temp!=0xf0){
  63.                 delayms(10);
  64.                 temp=P2&0xf0;
  65.                 if(temp!=0xf0){
  66.                         temp=P2;
  67.                         //LED=0;   //LIT LED
  68.                         switch(temp){
  69.                                 case 0xee:          //search low level column in row1
  70.                                         key=1;
  71.                                         break;
  72.                                 case 0xde:
  73.                                         key=2;
  74.                                         break;
  75.                                 case 0xbe:
  76.                                         key=3;
  77.                                         break;
  78.                                 case 0x7e:
  79.                                         key=4;
  80.                                         break;
  81.                                 case 0xed:          //row2
  82.                                         key=5;
  83.                                         break;
  84.                                 case 0xdd:
  85.                                         key=6;
  86.                                         break;
  87.                                 case 0xbd:
  88.                                         key=7;
  89.                                         break;
  90.                                 case 0x7d:
  91.                                         key=8;
  92.                                         break;
  93.                                 case 0xeb:          //row3
  94.                                         key=9;
  95.                                         break;
  96.                                 case 0xdb:
  97.                                         key=10;
  98.                                         break;
  99.                                 case 0xbb:
  100.                                         key=11;
  101.                                         break;
  102.                                 case 0x7b:
  103.                                         key=12;
  104.                                         break;
  105.                                 case 0xe7:          //row4
  106.                                         key=13;
  107.                                         break;
  108.                                 case 0xd7:
  109.                                         key=14;
  110.                                         break;
  111.                                 case 0xb7:
  112.                                         key=15;
  113.                                         break;
  114.                                 case 0x77:
  115.                                         key=16;
  116.                                         break;
  117.                         }
  118.                 }
  119.                 while(temp!=0xf0){          //wait till release
  120.                         temp=P2;
  121.                         temp=temp&0xf0;
  122.                 }
  123.         }
  124.         return key;
  125. }
复制代码




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:884237 发表于 2021-2-16 11:24 | 只看该作者
你好,keyNum的判断是根据什么的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表