打印
[DemoCode下载]

一个改进型的4*4矩阵键盘扫描

[复制链接]
987|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
energyplants|  楼主 | 2016-3-27 20:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar temp,num,bai,shi,ge;
uchar key[]={0x3f,0x5f,0x6f};
uchar code table[]=
{
0x3f , 0x06 , 0x5b ,
0x4f , 0x66 , 0x6d ,
0x7d , 0x07 , 0x7f ,
0x6f };
void keyscan();
void delay(uchar z);
void dsp(uchar bai,uchar shi,uchar ge);
void main()
{
while(1)
{
    keyscan();
    dsp(bai,shi,ge);
}
}
void delay(uchar z)
{
uchar x,y;
for(x=100;x--;x>0)
  for(y=z;y--;y>0);
}
void dsp(uchar bai,uchar shi,uchar ge)
{
  
   bai=num/100;
   shi=num%100/10;
   ge=num%10;
   
   P0=0xfb;
   P2=table[bai];
   delay(1);
   P0=0xfd;
   P2=table[shi];
   delay(1);
   P0=0xfe;
   P2=table[ge];
   delay(1);
}
void keyscan()
{   uchar i;
for(i=0;i<3;i++)
   {
     P1=key[i];
     temp=P1;
     temp&=0x0f;
     if(temp!=0x0f) //如果有键按下
     {
      delay(5);
   temp=P1;
      temp&=0x0f;
   if(temp!=0x0f)//确实有键按下
    {
     switch(temp)
     {
      case 0x07:switch(i)
          {
            case 0:num=1;break;
            case 1:num=5;break;
            case 2:num=9;break;
          };
      
      break;

      case 0x0b:switch(i)
          {
            case 0:num=2;break;
            case 1:num=6;break;
            case 2:num=10;break;
          };
      break;

      case 0x0d:switch(i)
          {
            case 0:num=3;break;
            case 1:num=7;break;
            case 2:num=11;break;
          };
      break;

      case 0x0e:switch(i)
          {
            case 0:num=4;break;
            case 1:num=8;break;
            case 2:num=12;break;
          };;
      break;

      while(temp!=0xf0) //松开手后就跳出循环,否则等待松手
      {
      temp=P1;
      temp=temp&0xf0;
      dsp(bai,shi,ge);
      }
     }
        
    }
     }
   }
}  


沙发
500days| | 2016-3-27 20:51 | 只看该作者
这个程序里面也没有看到键盘消抖的程序呢

使用特权

评论回复
板凳
Beckham_Owen| | 2016-3-29 21:01 | 只看该作者
在坛子里还有一种更好的方式,都不用延时去消抖

使用特权

评论回复
地板
zhuotuzi| | 2016-3-29 23:01 | 只看该作者
使用中断一般就不需要消除抖动,这里我看楼主用的是延时消除抖动。如果是按键中断判别是这样的,可以按下不做处理,检测松手的动作作为中断处理。

使用特权

评论回复
5
我要上秋晚| | 2016-4-14 17:09 | 只看该作者
没看出有何改进,使用中断消抖更好,例如中断10次10次值都一样就认为没有抖动

使用特权

评论回复
6
heisexingqisi| | 2016-4-14 21:43 | 只看该作者
不如全部使用中断,中断可以不用延时防抖。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

123

帖子

2

粉丝