zengdz 发表于 2012-10-23 16:29:24

怎么做矩阵键盘的连续输入

本帖最后由 zengdz 于 2012-10-23 16:37 编辑

   一个小项目里面有一个充值部分,通过键盘把要输入的数值显示在1602液晶上并且保存下来。但是我用大家常用的那种矩阵键盘扫描方法都不能实现,只显示一个按键输入就可以,但是要连续输入三个数字并且显示,总是有问题,里面应该有不能判断按键次数的问题,但是怎么判断呢?还有一种是中断法,但是没有找到可参考的资料,哪位有相关资料可否提供下,谢了!
下面是我用的那种常用的扫描方法:
void Keycan(void) //按键扫描程序 P34--P37为行线 P30--P33为列线
{
unsigned char r, c;
P3 = 0xF0;      // 发全0行列扫描码,列线输入
if(P3 != 0xF0) // 若有键按下
{
//      delay(10);// 延时去抖动
      r=P3;                   //保存行输入码
          P3=0x0f;           // 发全0行列扫描码,列线输入
          if(P3!=0x0f) // 若有键按下
          {
              c=P3;           //保存列输入码
          }
          Key=(r+c);   //键盘编码
//          delay(10);// 延时去抖动
}
}

/********对扫描到的键盘编码进行转换处理,变成数据键盘S1-S16*******/

unsigned char KeyDeal(unsigned char Key)
{
   unsigned char S;
   if(Key!=0)
{
   
                   switch(Key)
                   {
                   case 0xe7: S=1; break;
                   case 0xeb: S=2; break;
                   case 0xed: S=3; break;
                   case 0xee: S=4; break;
                   case 0xd7: S=5; break;
                   case 0xdb: S=6; break;
                   case 0xdd: S=7; break;
                   case 0xde: S=8; break;
                   case 0xb7: S=9; break;
                   case 0xbb: S=10; break;
                   case 0xbd: S=11; break;
                   case 0xbe: S=12; break;
                   case 0x77: S=13; break;
                   case 0x7b: S=14; break;
                   case 0x7d: S=15; break;
                   case 0x7e: S=16; break;
                   default: break;
                   }
       
}
return (S); // 返回键编码
}

devcang 发表于 2012-10-23 17:22:25

最简单,延时间隔一下,连续检测

zengdz 发表于 2012-10-23 17:30:53

devcang 发表于 2012-10-23 17:22 static/image/common/back.gif
最简单,延时间隔一下,连续检测

能不能简要写几个函数名表示下?

renwocai 发表于 2012-10-23 19:42:15

在这个基础上,用状态机,做松手检测

zengdz 发表于 2012-10-23 23:57:25

参考一个计算器的基本解决了、
页: [1]
查看完整版本: 怎么做矩阵键盘的连续输入