矩阵键盘算法优化

今天整理资料,无意间翻出一个大二时写的矩阵键盘扫描和消抖算法。记得当时看了很多嵌入式书籍上的实例代码,前篇一律,不忍直视。故愤起,自己设计了一个;下面的代码是进过抽象的,原理上基本上可以适应所有矩阵键盘需求,也容易扩充功能,有兴趣的童鞋可以看看!

所有的这些消抖函数都是假定有一个定时器周期性的激活消抖程序;为了快速相应以及相对低的计算负荷,可将定时时间定为几毫秒。大多数的开关都少于10MS的抖动时间。50ms的相应就让人感觉是瞬间的,将消抖周期设为20-50ms是非常合理的。

typedef enum{
  FALSE = 0, TRUE  = !FALSE
}bool; 
extern bool RawKeyPressed();    /*外部的读取硬件键盘的函数*/ 
1. 一个简单有效的消抖算法
#define CHECK_MSEC        5     //每5毫秒读一次键盘
#define PRESS_MSEC        10    //按下
#define RELEASE_MSEC      100   //释放
 
void DebounceSwitch(bool *Key_changed, bool *Key_pressed)  /*两个参数的含义分别是:当前抖动状态和按键状态已经确定*/
 {
       static unsigned char  Count = RELEASE_MSEC / CHECK_MSEC;
	bool RawState;
	*Key_changed = flase;
	*Key_pressed  = DebouncedKeyPress;
	RawState = RawKeyPressed();
        if(RawState == RawKeypressed) {
	     if( DebouncedKeyPressed )                                   
		  Count = RELEASE_MSEC / CHECK_MSEC;
	     else
	          Count = PRESS_MSEC / CHECK_MSEC;
	 } else  {
              if(--Count == 0) {                                                     /*有按键按下*/
                   DebouncedKeyPress = RawState;
		   *Key_changed = true;
		   *Key_pressed = DebouncedKeyPress;
		   if(DebounceKeyPress)                                        /*复位定时器*/
		   	  Count = RELEASE_MSEC / CHECK_MSEC;
		   elae
		   	  Count = PRESS_MSEC / CHECK_MSEC;
	    }//end for if( DebouncedKeyPressed )  ```else```
	 }
}

2.继续优化,对上述代码优化并进行扩展,成为同时对多个开关消抖的程序
#define MAX_CHECKS          10      
unsigned char  Debounce_State;                
unsigned char  State[MAX_CHECKS];         //矩阵键盘消抖状态
unsigned char  Index;                                  //游标
void DebounceSwitch()                               /*被定时器调用 */
{
       unsigned char i, j;
	State[Index] = RawKeyPressed();
	++Index;
	j = 0xff;
	for(i=0; i=MAX_CHECKS)
		Index = 0;
 }





你可能感兴趣的:(嵌入式那些事)