数码管显示4X4矩阵键盘按键号

2019-07-15 12:19发布

  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. //段码
  5. uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};
  6. //上次按键和当前按键的序号,该矩阵中序号范围0~15,16表示无按键
  7. uchar Pre_KeyNo=16,KeyNo=16;

  8. //延时函数
  9. void DelayMS(uint x)
  10. {
  11.         uchar i;
  12.         while(x--)
  13.                 for(i=0;i<120;i++);
  14. }


  15. //矩阵键盘扫描
  16. void Keys_Scan()
  17. {
  18.         uchar Tmp;
  19.         P1=0x0f;//高四位置0,放入4行
  20.         DelayMS(1);
  21.         Tmp=P1^0x0f;//按键后0f变成0000XXXX,X中一个为0,3个仍为一,通过异或把3个1变成0,唯一的0变成1;
  22.         switch(Tmp)//判断按键发生于0-3列的哪一列
  23.         {
  24.                 case 1:KeyNo=0;break;
  25.                 case 2:KeyNo=1;break;
  26.                 case 4:KeyNo=2;break;
  27.                 case 8:KeyNo=3;break;
  28.                 default:KeyNo=16;//无键按下       
  29.         }
  30.         P1=0xf0;//低4位置0,放入4列
  31.         DelayMS(1);
  32.         Tmp=P1>>4^0x0f;//按键后f0变成XXXX0000,X中有1个为0,3个仍为一,高四位转移到低4位并异或得到改变的值
  33.         switch(Tmp)//对0-3行分别附加起始值0,4,8,12
  34.         {
  35.                 case 1:KeyNo+=0;break;
  36.                 case 2:KeyNo+=4;break;
  37.                 case 4:KeyNo+=8;break;
  38.                 case 8:KeyNo+=12;
  39.         }
  40. }

  41. //主函数
  42. void main()
  43. {
  44.         P0=0xff;
  45.         P1=0x00;
  46.         while(1)
  47.         {
  48.                 P1=0xf0;
  49.                 if(P1!=0xf0) Keys_Scan();//获取键序号
  50.                 if(Pre_KeyNo!=KeyNo)
  51.                 {
  52.                         P0=~DSY_CODE[KeyNo];
  53.                         Pre_KeyNo=KeyNo;
  54.                 }
  55.                 DelayMS(100);
  56.         }
  57. }
复制代码按键功能无法实现,谁能告诉我是怎么回事吗
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。