在stm32工程中,長按和短按的**書寫, 呼叫的讀取按鍵狀態的底層函式。封裝成的按鍵函式**。下面是函式的標頭檔案,和.c檔案的**。使用定時器來掃瞄按鍵。
#define key_on 1
#define key_off 0
#define key_null 0
#define key_short 1
#define key_long 10
#define short_time 200
uint8_t key_state(gpio_typedef* gpiox,uint16_t gpio_pin)
if ( time == 5 ) /* 5 * 1 ms = 5ms 定時時間到 */
else //按鍵鬆開
else if( longtime > short_time ) //長按
else //去抖動
longtime = 0; //清零
}
} return key_value;
}
#define key_press(gpiox,gpio_pin) gpio_readinputdatabit(gpiox,gpio_pin)
#define key_input key_press(gpiox,gpio_pin) //讀取按鍵狀態
#define key_state_0 0 // 按鍵狀態位
#define key_state_1 1
#define key_state_2 2
#define key_state_3 3
#define long_key_time 300 //長按的3秒時間
#define single_key_time 3 // 短按的消抖時間
#define n_key 0 // 無狀態
#define s_key 1 // 單擊
#define l_key 10 // 長按
函式的主體部分,**中按下按鍵讀取到高電平。
unsigned char key_driver(gpio_typedef* gpiox,uint16_t gpio_pin))
break;
case key_state_1: // 按鍵狀態1:軟體消抖(確定按鍵是否有效,而不是誤觸)。按鍵有效的定義:按鍵持續按下超過設定的消抖時間。
if (key_press == key_on)
}
else key_state = key_state_0; // 如果按鍵時間沒有超過,判定為誤觸,按鍵無效,返回 按鍵狀態0,繼續等待按鍵
break;
case key_state_2: // 按鍵狀態2:判定按鍵有效的種類:是單擊,還是長按
if(key_press == key_off) // 如果按鍵在 設定的長按時間 內釋放,則判定為單擊
else
}break;
case key_state_3: // 等待按鍵釋放
if (key_press == key_off)
break;
default: // 特殊情況:key_state是其他值得情況,清零key_state。這種情況一般出現在 沒有初始化key_state,第一次執行這個函式的時候
key_state = key_state_0;
break;
}return key_return; // 返回 按鍵值
}
unsigned char key_handle(gpio_typedef* gpiox,uint16_t gpio_pin)
return key_value;
}
time 這個變數,定義在了定時器檔案中
在main.c中呼叫
int main(void)
else if(key_value == key_long)
}}
這樣可以實現長按不鬆手,首席執行官按的**。以後遇到好的思想會繼續學習,總結下來。
**風格不是特別好,很早之前寫的了,放在這裡了,僅供參考
這個是我寫的按鍵二的部落格,一些思想可以提供學習
STM32獨立按鍵之長按 短按
內容如題 1.獨立按鍵 軟體消抖 晶元引腳初始化為上拉輸入 define key l state ll gpio isinputpinset key l port,key l pin define key r state ll gpio isinputpinset key r port,key r ...
stm32外部中斷按鈕短按長按1 0
key.c define pwmaddkey 0 gpio readinputdatabit gpiob,gpio pin 8 讀取按鍵pwmaddkey 0 b8 define pwmreducekey 0 gpio readinputdatabit gpiob,gpio pin 9 讀取按pwm...
stm32 工業按鍵檢測 STM32按鍵的檢測
stm32的按鍵檢測相對比較簡單,首先按部就班的初始化連線的到的i o,然後寫乙個按鍵掃瞄函式,這個和51微控制器的差不多。以下是乙個比較典型的例子 利用按鍵控制led key.件 ifndef key h define key h include sys.h definekey0 gpio rea...