本文适合有一定键盘基础且采用中断方式进行数码管显示,并且采取while()函数进行松手检测的同学阅读。
独立键盘的长按和短按(因为矩阵键盘只有四个键,所以可以写四个while函数进行判断),以下只写出S7按键的长短按(通过定时器),并假定1s为长按,其他键可以以此推之:
void scankey()
{unsigned char yi=0; %%长按键只进行一次判定
if(P30==0) %%S7
{
flagnum=0;flag=0;yi=0; %%相应判断条件初始化
while(P30==0)
{if(flag==1&&yi==0){yi=1; } %%%%长按
}
if(flag==0){ } %%%短按
}
if(P31==0) %%S6
{
while(P31==0);
}
if(P32==0) %%S5
{
while(P32==0);
}
if(P33==0) %%S4
{
while(P33==0);
}
}
定时器部分:(假设中断为2ms)if(++flagnum==500){flagnum=0;flag=1;}
矩阵键盘的长按和短按(因为矩阵键盘有多个个键,所以考虑用一个while函数进行判断),以下假定1s为长按:
void scankey()
{unsigned char key,hang,lie,keyvalue,yi=0;
P3=0X0F;P42=0;P44=0;key=P3&0X0F;
if(key!=0x0f)
{
Switch(key)
{ case 0x0e: hang=4;break;
case 0x0d: hang=3;break;
case 0x0b: hang=2;break;
case 0x07: hang=1;break;
}
}
P3=0XF0;P42=1;P44=1;P36=P42;P37=P44;key=P3&0xf0;
If(key!=0xf0)
{
Switch(key)
{
case 0xe0: lie=4;break;
case 0xe0: lie=3;break;
case 0xe0: lie=2;break;
case 0xe0: lie=1;break;
}
Keyvalue=lie*4+hang-1;
P3=0X0F;P42=0;P44=0;key=P3&0X0F; %%松手检测
flagnum=0;flag=0;yi=0;
while(P3!=0X0F)
{if(flag==1&&yi==0){ switch(keyvalue){case : break; } } %%长按
}
If(flag==0){ switch(keyvalue){case : break; } } %%短按
}
}
定时器部分和独立键盘一样,要记住把主函数while(1)里的内容放到按键while中。
写的有点乱,希望对大家有帮助。