矩阵键盘最后一排扫描不到

[复制链接]
1458|1
 楼主| SaberLion 发表于 2014-3-14 09:52 | 显示全部楼层 |阅读模式
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define MASK 0xf0

  5. uchar code table[] = {0x3f,0x06,0x5b,0x4f,
  6.                                       0x66,0x6d,0x7d,0x07,
  7.                                           0x7f,0x6f,0x77,0x7c,
  8.                                           0x39,0x5e,0x79,0x71,
  9.                                           0xff};            //  段码表
  10. uchar code table2[] = {0xfe,0xfd,0xfb,0xf7};    //  扫描
  11. void delay(uint i);
  12. void display(uchar num);
  13. void keyscan(uchar * num);

  14. int main(void)
  15. {
  16.         uchar num = 16;
  17.                
  18.         while(1)
  19.         {
  20.                 keyscan(&num);
  21.                 display(num);               
  22.         }
  23.         return 0;
  24. }

  25. void keyscan(uchar * num)
  26. {
  27.         uchar temp;
  28.         uint i;

  29.         //   扫描按键并比较
  30.         for(i = 0; i < 4; i++)
  31.         {
  32.                 P2 = table2[i];
  33.                 temp = P2;
  34.                 temp &= MASK;
  35.                 if(temp != MASK)
  36.                 {
  37.                         delay(5);
  38.                         temp = P2;
  39.                         temp &= MASK;
  40.                         if(temp == MASK)
  41.                                 {
  42.                                         continue;
  43.                                         i--;
  44.                                 }
  45.                 }
  46.         switch(temp)
  47.                 {
  48.                         case 0xe0 :
  49.                                 (*num) = 4 * i + 0;
  50.                                 break;
  51.                         case 0xd0 :
  52.                                 (*num) = 4 * i + 1;
  53.                                 break;
  54.                         case 0xb0 :
  55.                                 (*num) = 4 * i + 2;
  56.                                 break;
  57.                         case 0x70 :
  58.                                 (*num) = 4 * i + 3;
  59.                                 break;
  60.                 //        default:
  61.                 //                break;
  62.                 }
  63.         }
  64.         while((P2 & MASK) != MASK);
  65.         delay(5);
  66.         while((P2 & MASK) != MASK);
  67. }       

  68. void delay(uint i)
  69. {
  70.         uint j;

  71.         for(;i > 0; i--)
  72.                 for(j = 0; j < 100; j++)
  73.                         continue;
  74. }

  75. void display(uchar num)
  76. {
  77.         P0 = ~table[num];
  78. }       
数码管是共阳极接法,数码管是单独接的 不用锁存器
键盘是4X4的键盘P2.0~P2.3控制行,2.4~2.7是列

上面这个程序,1~3排按了都有反应,第四排按下之后不一定有反应  (有时候有,排除键盘接触不良)
 楼主| SaberLion 发表于 2014-3-14 13:10 | 显示全部楼层
我如果把4行分开写的话  4行就都能读取到  
for循环的关系?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

59

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部