单片机按键读取函数2——学习笔记论坛——站长专属——冰糖橙之家

单片机按键读取函数2

一、整体思路

  1. 新建变量,用于存放当前按键值。
  2. 将P0中前四位置为1111,后四位保持原样。
  3. 判定SW按键是否按下,延迟10ms消除抖动影响。
  4. 判定按键值是否改变,如与原数值不同,则保存当前按键值,如无改变则清楚按键值,将变量置为0以消除长按对程序造成的影响。
  5. 返回最终处理结果。

二、范例

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;
}

三、解析

  1. unsigned char uckey_old=0;用于保存上一次按键的值。
  2. delay_nms延时函数模块,在前文中有提到。
  3. uckey_read按键读取函数模块。
  4. unsigned char uckey_value=0;用于保存当前按键的数值。
  5. P0 |=0xf0;初始化按键状态,默认为1111 0000。
  6. if((P0&0xf0)!=0xf0)判断按键是否按下。
  7. delay_nms(10);消除抖动,引用延时函数模块,其中10代表10次循环,在延时函数中定义一次循环为1ms,可根据实际情况来做修改,这里延时函数用于等待10ms后再次判断是否按下SW按键,减少误触概率。
  8. uckey_value=~P0&0xf0;读取按键值。
  9. if(uckey_value!=uckey_old)
    	uckey_value=uckey_old;
    else
    	uckey_value=0;

    此模块用于判断本次按键状态是否与上一个循环相同,如果相同需要清除本次按键值,以消除长按对程序造成的影响。

  10. return uckey_value;返回本次判断结果,并跳出循环。
请登录后发表评论

    没有回复内容