[DemoCode下载] 一个改进型的4*4矩阵键盘扫描

[复制链接]
1223|5
 楼主| energyplants 发表于 2016-3-27 20:15 | 显示全部楼层 |阅读模式
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar temp,num,bai,shi,ge;
  5. uchar key[]={0x3f,0x5f,0x6f};
  6. uchar code table[]=
  7. {
  8. 0x3f , 0x06 , 0x5b ,
  9. 0x4f , 0x66 , 0x6d ,
  10. 0x7d , 0x07 , 0x7f ,
  11. 0x6f };
  12. void keyscan();
  13. void delay(uchar z);
  14. void dsp(uchar bai,uchar shi,uchar ge);
  15. void main()
  16. {
  17. while(1)
  18. {
  19.     keyscan();
  20.     dsp(bai,shi,ge);
  21. }
  22. }
  23. void delay(uchar z)
  24. {
  25. uchar x,y;
  26. for(x=100;x--;x>0)
  27.   for(y=z;y--;y>0);
  28. }
  29. void dsp(uchar bai,uchar shi,uchar ge)
  30. {
  31.   
  32.    bai=num/100;
  33.    shi=num%100/10;
  34.    ge=num%10;
  35.    
  36.    P0=0xfb;
  37.    P2=table[bai];
  38.    delay(1);
  39.    P0=0xfd;
  40.    P2=table[shi];
  41.    delay(1);
  42.    P0=0xfe;
  43.    P2=table[ge];
  44.    delay(1);
  45. }
  46. void keyscan()
  47. {   uchar i;
  48. for(i=0;i<3;i++)
  49.    {
  50.      P1=key[i];
  51.      temp=P1;
  52.      temp&=0x0f;
  53.      if(temp!=0x0f) //如果有键按下
  54.      {
  55.       delay(5);
  56.    temp=P1;
  57.       temp&=0x0f;
  58.    if(temp!=0x0f)//确实有键按下
  59.     {
  60.      switch(temp)
  61.      {
  62.       case 0x07:switch(i)
  63.           {
  64.             case 0:num=1;break;
  65.             case 1:num=5;break;
  66.             case 2:num=9;break;
  67.           };
  68.       
  69.       break;

  70.       case 0x0b:switch(i)
  71.           {
  72.             case 0:num=2;break;
  73.             case 1:num=6;break;
  74.             case 2:num=10;break;
  75.           };
  76.       break;

  77.       case 0x0d:switch(i)
  78.           {
  79.             case 0:num=3;break;
  80.             case 1:num=7;break;
  81.             case 2:num=11;break;
  82.           };
  83.       break;

  84.       case 0x0e:switch(i)
  85.           {
  86.             case 0:num=4;break;
  87.             case 1:num=8;break;
  88.             case 2:num=12;break;
  89.           };;
  90.       break;

  91.       while(temp!=0xf0) //松开手后就跳出循环,否则等待松手
  92.       {
  93.       temp=P1;
  94.       temp=temp&0xf0;
  95.       dsp(bai,shi,ge);
  96.       }
  97.      }
  98.         
  99.     }
  100.      }
  101.    }
  102. }  


500days 发表于 2016-3-27 20:51 | 显示全部楼层
这个程序里面也没有看到键盘消抖的程序呢
Beckham_Owen 发表于 2016-3-29 21:01 | 显示全部楼层
在坛子里还有一种更好的方式,都不用延时去消抖
zhuotuzi 发表于 2016-3-29 23:01 | 显示全部楼层
使用中断一般就不需要消除抖动,这里我看楼主用的是延时消除抖动。如果是按键中断判别是这样的,可以按下不做处理,检测松手的动作作为中断处理。
我要上秋晚 发表于 2016-4-14 17:09 | 显示全部楼层
没看出有何改进,使用中断消抖更好,例如中断10次10次值都一样就认为没有抖动
heisexingqisi 发表于 2016-4-14 21:43 | 显示全部楼层
不如全部使用中断,中断可以不用延时防抖。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

123

帖子

2

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