一、整体思路
- 新建变量,用于存放当前按键值。
- 将P0中前四位置为1111,后四位保持原样。
- 判定SW按键是否按下,延迟10ms消除抖动影响。
- 判定按键值是否改变,如与原数值不同,则保存当前按键值,如无改变则清楚按键值,将变量置为0以消除长按对程序造成的影响。
- 返回最终处理结果。
二、范例
unsigned char uckey_old=0;
void delay_nms(unsigned int uinum)
{
unsigned int i;
while(uinum--)
{
for(i=0;i<628;i++);
}
}
unsigned char uckey_read()
{
unsigned char uckey_value=0;
P0 |=0xf0;
if((P0&0xf0)!=0xf0)
{
delay_nms(10);
if((P0&0xf0)!=0xf0)
{
uckey_value=~P0&0xf0;
}
}
if(uckey_value!=uckey_old)
uckey_value=uckey_old;
else
uckey_value=0;
return uckey_value;
}
三、解析
unsigned char uckey_old=0;
用于保存上一次按键的值。delay_nms
延时函数模块,在前文中有提到。uckey_read
按键读取函数模块。unsigned char uckey_value=0;
用于保存当前按键的数值。P0 |=0xf0;
初始化按键状态,默认为1111 0000。if((P0&0xf0)!=0xf0)
判断按键是否按下。delay_nms(10);
消除抖动,引用延时函数模块,其中10代表10次循环,在延时函数中定义一次循环为1ms,可根据实际情况来做修改,这里延时函数用于等待10ms后再次判断是否按下SW按键,减少误触概率。uckey_value=~P0&0xf0;
读取按键值。-
if(uckey_value!=uckey_old) uckey_value=uckey_old; else uckey_value=0;
此模块用于判断本次按键状态是否与上一个循环相同,如果相同需要清除本次按键值,以消除长按对程序造成的影响。
return uckey_value;
返回本次判断结果,并跳出循环。
没有回复内容