本帖最后由 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); // 返回键编码
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>