STM8S獨立按鍵IO口設(shè)置及按下事件問題
- GPIO設(shè)置
- 按鍵檢測
- 1 連續(xù)按鍵檢測短按
- 關(guān)鍵代碼
1 GPIO設(shè)置
STM8 I/O 口引腳配置表
Px_DDR | Px_CR1 | Px_CR2 | I/O 方式 | 引腳狀態(tài) |
---|---|---|---|---|
0 | 0 | 0 | 輸入 | 懸浮輸入 |
0 | 0 | 1 | 輸入 | 上拉輸入 |
0 | 1 | 0 | 輸入 | 中斷懸浮輸入 |
0 | 1 | 1 | 輸入 | 中斷上拉輸入 |
1 | 0 | 0 | 輸出 | 開漏輸出 |
1 | 1 | 0 | 輸出 | 推挽輸出 |
1 | x | 1 | 輸出 | 輸出(最快速度為10MHZ) |
對STM8S的IO配置,我們只需要操作五個寄存器就行了:
- 輸出數(shù)據(jù)寄存器 (ODR)
- 輸入數(shù)據(jù)寄存器 (IDR)
- 數(shù)據(jù)方向寄存器 (DDR)
- 控制寄存器1(CR1)
- 控制寄存器2(CR2)
2 按鍵檢測
在做獨立按鍵檢測的時候,設(shè)置成上拉輸入不能實現(xiàn)功能,設(shè)置成中斷懸浮輸入就可以了。
兩次短按鍵之間的時間間隔大約在300ms~600ms之間。一次短按鍵按下的時間大約在14ms~26ms之間;
2.1 連續(xù)按鍵檢測(短按+)
定時器TIM1 + 按鍵 = 連續(xù)按鍵檢測(短按鍵+鍵)
兩個標記:
- 短按+—flag0
- 短按后時間在規(guī)定范圍之內(nèi)—flag1
如果兩個標記都滿足,則開/關(guān)電源;每次按鍵都啟動按鍵計時;
當兩次按鍵的時間間隔在300ms~600ms之間的時候,怎么得到第一次(短按)和第二次()按鍵之間的時間呢?
如果判斷了是短按,則開啟計時,同時將第一次短按flag置一,超過600ms停止計時并清零,等待第二次的按鍵;有了第二次的按鍵之后,在短按置一flag條件中中斷計時,判斷是否在規(guī)定范圍之內(nèi)的時間間隔,是則將flag1置一;并接下來判斷該按鍵是還是短按,如果是,則將flag0置一,滿足flag0、flag1均置一,則是連續(xù)按鍵。
3 關(guān)鍵代碼
/*return = 0 : No Key Press1 : Single Key Press2 : 將作為一次單獨按鍵,并執(zhí)行Single Key Press功能 3 : Double Key Press*/unsigned int Key_Scan(void){unsigned int count = 0;if(0 == KEY){Delay(2);if(0 == KEY){if(1 == keytimesFlag){afterOnceShortPressFlag = 0;if((afterOnceShortPressCount <=30) && (afterOnceShortPressCount > 15)){isSetTimeFlag = 1;}else isSetTimeFlag = 0;}keyFlag = 1;while(!KEY);keyFlag = 0;count = keyCount;keyCount = 0;}else{count = 0;}}if(count >= 200){if(1 == isSetTimeFlag){isSetTimeFlag = 0;keytimesFlag = 0;return 3;}else {keytimesFlag = 0;return 2; }}else if(count >= 4){afterOnceShortPressFlag = 1;afterOnceShortPressCount = 0;keytimesFlag = 1;return 1;}else return 0;}
在定時周期為10ms的定時器中斷函數(shù)里:
@far @interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void){ TIM1_SR1 &=~(0x01); if(1 == keyFlag){++keyCount;}else ;if(1 == afterOnceShortPressFlag){++afterOnceShortPressCount;if(afterOnceShortPressCount > 80){afterOnceShortPressFlag = 0;afterOnceShortPressCount = 0;keytimesFlag = 0;}}else ;}
另參見使用外部中斷鍵識別:使用外部中斷識別鍵
評論