通过使用定时器计数的方法来分辨按键的:短按、长按 
检测到引脚被拉低:按键按下为低电平,没有按下为高电平 
延时10毫秒:滤波 
引脚还是被拉低:确定按键被按下 
设置按键按下标志 
开启定时器,开始计数:定时器中有一个全局变量用于记录计数值 
直到引脚被拉高:按键被释放将为高电平 
关闭定时器 
检测按键按下标志 
检测定时器按键检测时间全局变量是否大于某个值,一般为200ms 
大于则为长按,否则为短按 
 
- typedef enum
 
 - {
 
 -         KEY_SINGLE_PRESSED,
 
 -         KEY_LONG_PRESSED,
 
 -         KEY_DEFAULT_STATUS,
 
 - } key_state_e;
 
  
- uint8_t ylf_key_scan(void)
 
 - {
 
 -         static uint8_t press_flag;
 
  
-         if(!KEY_PIN)
 
 -         {
 
 -                 delay_ms(10);
 
 -                 if (!KEY_PIN)
 
 -                 {
 
 -                         press_flag = 1;
 
 -                         TR0 = 1;           // 定时器0开始计数
 
 -                         while(!KEY_PIN);
 
 -                         TR0 = 0;           // 定时器0计数结束
 
 -                 }
 
 -         }
 
 -         if (press_flag)
 
 -         {
 
 -                 if (KEY_COUNT >= 200)
 
 -                 {        
 
 -                         KEY_COUNT = 0;
 
 -                         press_flag = 0;                        
 
 -                         return KEY_LONG_PRESSED;
 
  
-                 } else {                
 
 -                         KEY_COUNT = 0;
 
 -                         press_flag = 0;        
 
 -                         return KEY_SINGLE_PRESSED;
 
 -                 }
 
 -         }
 
 -         return KEY_DEFAULT_STATUS;
 
 - }
 
  
 
- int main(void)
 
 - {
 
 -         
 
 -         while(1)
 
 -         {
 
 -                 switch(ylf_key_scan())
 
 -                 {
 
 -                 case KEY_SINGLE_PRESSED:
 
 -                         // TO DO
 
 -                         break;
 
 -                 case KEY_LONG_PRESSED:
 
 -                         // TO DO
 
 -                         break;
 
 -                 default:
 
 -                         break;
 
 -                 }
 
 -         }
 
 - }
 
 
  
 
  |