本人電腦的輸入法突然變成繁體中文,儘管顯示中文(簡體,中國),打字竟如是,實在無奈。

單片機上的按鍵一端鏈接高電位,一端鏈接低電位,二者其一鏈接GPIO管脚。按鍵按下,高低電位導通,引起GPIO管脚電位改變。GPIO管脚処電位變化説明按鍵狀態改變,可以透過讀取GPIO引脚電平來獲取當前按鍵狀態。而因爲單片機信號處理存在時延,按鍵狀態的改變不能及時反映到引脚電位變化,有時按鍵已經鬆開,程序認爲其仍在按下,因而需要將之前狀態一并考慮。

1
2
3
4
5
6
7
8
/*
不合理的寫法
*/
bool state = 0, if_press = 0;
state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
// state = GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0);
if(state) if_press = 0;
else if_press = 1;

按鍵狀態結構體定義如下:

1
2
3
4
5
6
7
8
struct Keys {
unsigned char judge_sta;
//多步驟判定中表示步數
bool key_sta;
//GPIO讀取到的電位
bool single_flag;
//最終結果,表示到底按沒按下
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//寫在中斷的囘調函數裏,每隔一個周期自動執行
void HAL_PeriodElapseCallback(TIM_handleTypeDef *htim) {
if(htim -> Instance == TIM3) {
//讀取GPIO電位
key[0].key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);
key[1].key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);
key[2].key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2);
key[3].key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3);
}
for(int i = 0; i < 4; ++i) {
switch(key[i].judge_sta) {
case 0:
//第一步判斷
if(key[i].key_sta == 0)
//如果為按下狀態
key[i].judge_sta = 1;
//下次直接進行第二步判斷
break;

case 1:
if(key[i].key_sta == 0) {
key[i].judge_sta = 2;
key[i].single_flag = 1;
}
else key[i].judge_sta = 0;
break;

case 2:
if(key[i].key_sta == 1) {
key[i].judge_sta = 0;
}
break;


}
}
}