有关单片机键盘的讨论
时间:10-02
整理:3721RD
点击:
void timer() interrupt 1
{
static uint time1=0;
TH0 = 0xFC;
TL0 = 0x67;
keystart=0xf0;
if(keystart!=0xf0)
{
time1++;
if(time1>=4&&keystart!=0xf0)
{
keystart=0xf0;//为什么这里keystart还要被赋值0xf0呢?(这是我在网上搜的)这样的话后面 的 switch语句就没什么作用了吗(keystart只能为0xf0)
switch(keystart)
{
case 0x70:value=0;break;
case 0xb0:value=4;break;
case 0xd0:value=8;break;
case 0xe0:value=12;break;
default:break;
}
keystart=0x0f;
switch(keystart)
{
case 0x07:value+=0;break;
case 0xb0:value+=1;break;
case 0xd0:value+=2;break;
case 0xe0:value+=3;break;
default:break;
}
time1=0;
a=0;
}
}
}
{
static uint time1=0;
TH0 = 0xFC;
TL0 = 0x67;
keystart=0xf0;
if(keystart!=0xf0)
{
time1++;
if(time1>=4&&keystart!=0xf0)
{
keystart=0xf0;//为什么这里keystart还要被赋值0xf0呢?(这是我在网上搜的)这样的话后面 的 switch语句就没什么作用了吗(keystart只能为0xf0)
switch(keystart)
{
case 0x70:value=0;break;
case 0xb0:value=4;break;
case 0xd0:value=8;break;
case 0xe0:value=12;break;
default:break;
}
keystart=0x0f;
switch(keystart)
{
case 0x07:value+=0;break;
case 0xb0:value+=1;break;
case 0xd0:value+=2;break;
case 0xe0:value+=3;break;
default:break;
}
time1=0;
a=0;
}
}
}
开始状态:高4位必须先变成高电平,低4位变成低电平。
然后,如果对应的位置有按键,高电平会被拉低变成低电平。
keystart的值,会根据按键情况变化。
我的意思是说为什么keystart会再次赋值,第一个if语句不是已经赋值了吗?为什么还要再次赋值?麻烦你认真看下我的程序
keystart=0xf0;由于存在线与关系,keystart值会改变,故进入外层if语句中,time1>=4发挥延时消抖的作用(并且要求time1<5期间keystart的值不等于0xf0,即按键一直处于按下的状态),之后再次给keystart赋值0xf0通过判断低四位得到按下的哪一行按键,然后再次给keystart赋值0x0f判断高四位得到按下的是哪一列按键。最终得到按键信息
参考参考之前的回帖吧
http://bbs.elecfans.com/forum.ph ... amp;fromuid=1362400