|
硬件环境采用STM8SF103,电压为3.3V。电路需要注意的是STM8SF103这系列的IO作为输入口时只能是上拉输入和悬浮输入,虽然是弱上拉,在VCC为3.3V电压时,仍然能够被拉升至3.0V左右。 所以按键检测电路IO口一端需要接地,而不是外接上拉。悬浮方式下IO仍然会有0.89V左右电压,读取对应的IO寄存器IDR,仍然处于逻辑高电平状态。
( {6 C' L3 j+ ^4 t2 |. L/ X6 Q
" p/ a) k5 h x: h9 A) y 软件代码相对很简单,只需要将IO口设置成上拉输入即可。采用轮询代码如下: - //初始化只需要设置IO口模式即可。1 i7 c3 H+ c9 O* a3 Y" S2 q
- GPIO_Init(KEY2_PORT,KEY2_PIN,GPIO_MODE_IN_PU_NO_IT);//上拉输入,不产生中断: `: ?4 F' m; L$ G
- //按键检测部分
l, S/ f0 `/ Z3 ` - /*1 {7 j) U5 E5 T8 m# Q
- #defineKEY10
& C% x: ~+ x1 N1 |( H0 d+ n# w, A - #defineKEY1_PORT(GPIOD)
5 C% c/ k0 K: N9 b5 C$ V - #defineKEY1_PIN(GPIO_PIN_4)! V/ y2 _* m' R& p$ k: J
- #defineKEY218 Z6 z1 a) J7 N7 N/ ]7 [ }
- #defineKEY2_PORT(GPIOC)
2 `+ t: p# m9 B% d% g; M l5 _! u8 \ - #defineKEY2_PIN(GPIO_PIN_1)
" n/ V! P. X, u e! |' b! ? - */
8 Q J, D8 K0 `. q - u8CheckKey(u8key); H; |$ X- p# j z5 [8 Q* |! ?6 [
- {
+ y1 g H) i0 P9 t4 u - if(key==KEY1)% S7 |4 ^/ v" R) k2 t
- {8 X; Q0 ^1 e9 u& X
- if(KEY1_PORT->IDR&KEY1_PIN)//检测到有按键了,IO口电压会被拉低
8 Z! T- Q- Q; m" ?1 i - {; O6 J" u! p) P
- delay_5ms();
* P& Y5 l& W" T( i - if(KEY1_PORT->IDR&KEY1_PIN)//仍然存在低电平
9 `' h7 E! A7 k1 t) i1 p& a - {0 J9 {+ c+ z; H9 f$ ]5 N- V
- while(!(KEY1_PORT->IDR&KEY1_PIN));//等待放开
[* `$ E& T1 M+ L6 r - returnKEY1;8 T" G2 X: g- g0 E# B
- }
2 C( q* u. J' w% |' x- s5 I - }
1 U9 U- S3 j- m5 C2 g# \- L - return0;* D! l9 M' I( ]4 I# R
- }elseif(key==KEY2)% `% K& X% W8 G% i! b8 V$ o- c; r
- {8 L2 s" I+ \7 l' c
- if(!(KEY2_PORT->IDR&KEY2_PIN))//检测到有按键了9 ~1 y* s- F( u* e: [1 w
- {: l9 x3 d4 t0 ^2 d
- delay_5ms();2 _+ L% \* F# |3 _" Y) ?, G
- if(!(KEY2_PORT->IDR&KEY2_PIN))//仍然存在低电平$ _: e& t& M2 [1 t
- {
# A$ A2 q$ F. D. h, ^2 V& x5 u8 Y - while(KEY2_PORT->IDR&KEY2_PIN);//等待放开( V2 b( m5 a% E0 E
- returnKEY2;
+ U: U* _. Z! A* |. K& A) j - }; L L# A& l0 C3 {7 W
- }
& \' R# T% D2 l" M o! t4 l - return0;1 z9 `5 J ^5 H$ U# t
- }
+ u4 y* [9 j x( M) V, m! F8 ^ - return0;
$ V8 H6 C! C# G$ o - }
复制代码 ; V& {7 M& ^3 h7 E. b1 X, ]6 U
总结一下,硬件电路将按键IO口的一端接地。软件配置不能使用悬浮输入方式,这种方式电压可能会不稳定。
3 X4 m' G1 @; D# S. G* u: m |