1. 程式人生 > >按鍵掃描C語言思路

按鍵掃描C語言思路

按鍵掃描(支援連續按)的一般思路

 u8 KEY_Scan(void)
    {
      if(KEY按下)
     {
           delay_ms(10);//延時10-20ms,防抖。
           if(KEY確實按下)
            {
               return KEY_Value;
             }
          return 無效值;
     }
    }

按鍵掃描(不支援連續按)的一般思路

static 關鍵字

定義一個靜態變數,兼具靜態儲存的區域性變數。和自動變數具有相同的作用域,但當包含這些變數的函式完成工作時,它們並不消失

 u8 KEY_Scan(void)
    {
     static u8 key_up=1;
      if(key_up &&  KEY按下)
      {
        delay_ms(10);//延時,防抖
        key_up=0;//標記這次key已經按下
        if(KEY確實按下)
          {
           return KEY_VALUE;
          }
        }else if(KEY沒有按下)  key_up=1;
       return 沒有按下
    }

static u8 key_up=1; 語句並不是函式的一部分,因為靜態變數和全域性變數在程式調入記憶體是就已經就位了。執行函式是static u8 key_up=1; 看起來是跳過了。key_up的儲存類是空連線的靜態。
函式中 static u8 key_up=1; 定義後,當KET_Scan執行結束後,key_up並不消失,而是保留了賦予的0值,函式下一次執行時仍舊是執行0值

按鍵掃描(兩種模式合二為一)的一般思路

 u8 KEY_Scan(u8 mode)
    {
     static u8 key_up=1;
     if(mode==1) key_up=1;//支援連續按
      if(key_up &&  KEY按下)
      {
        delay_ms(10);//延時,防抖
        key_up=0;//標記這次key已經按下
        if(KEY確實按下)
          {
           return KEY_VALUE;
          }
        }else if(KEY沒有按下)  key_up=1
; return 沒有按下 }

支援連續按時,在if(key_up && KEY按下)判斷語句外,key_up 都會等於1,一直返回KEY_VALUE,
不支援連續按,if(mode==1) key_up=1;失效,按下一次後,key_up=0,不會返回KEY_VALUE。