|
硬件环境采用STM8SF103,电压为3.3V。电路需要注意的是STM8SF103这系列的IO作为输入口时只能是上拉输入和悬浮输入,虽然是弱上拉,在VCC为3.3V电压时,仍然能够被拉升至3.0V左右。 所以按键检测电路IO口一端需要接地,而不是外接上拉。悬浮方式下IO仍然会有0.89V左右电压,读取对应的IO寄存器IDR,仍然处于逻辑高电平状态。
, [' ~$ O" J8 C3 p- V& j
! o' W3 _ N0 C g- `2 z 软件代码相对很简单,只需要将IO口设置成上拉输入即可。采用轮询代码如下: - //初始化只需要设置IO口模式即可。
" L, T/ P" e8 ~) W8 B - GPIO_Init(KEY2_PORT,KEY2_PIN,GPIO_MODE_IN_PU_NO_IT);//上拉输入,不产生中断
+ G, d# z" ?9 o - //按键检测部分
; Z) H! q8 m2 q& Z q: T% d0 J" } - /*
' \: m, B6 o( o- f3 U" O* p- B - #defineKEY10
. S6 G1 R" A1 M- [2 J( | - #defineKEY1_PORT(GPIOD), F; Q. _& r) y3 a/ F
- #defineKEY1_PIN(GPIO_PIN_4)6 W. f9 m h3 O- [% g! y( y
- #defineKEY21
; I8 c7 ?2 Q! C( d f& E3 P - #defineKEY2_PORT(GPIOC)
* y1 p. a# Q: g. L - #defineKEY2_PIN(GPIO_PIN_1)2 _4 N# @! u% U, a& V. \4 m" U. n
- */
+ E" @ _) m, f: f$ D* E7 e( a: T - u8CheckKey(u8key)8 {$ _# z$ e& c5 d8 B {9 k
- {" U" A' p* w( z2 S
- if(key==KEY1) }# i0 B5 T0 K
- {
; y+ P3 s2 {$ @2 s |. Q - if(KEY1_PORT->IDR&KEY1_PIN)//检测到有按键了,IO口电压会被拉低- \% G, U7 q7 w; s+ }: X
- {5 n, q% w0 G) v7 a1 J: y) l
- delay_5ms();
1 V8 c1 A/ |# @+ v; K! Z1 Q* z \2 { - if(KEY1_PORT->IDR&KEY1_PIN)//仍然存在低电平
) r6 e6 b5 N) B5 g0 }# j9 f9 J - {
1 \# K9 n3 A: N# W; s - while(!(KEY1_PORT->IDR&KEY1_PIN));//等待放开
# W, r1 u" n5 G' O2 p - returnKEY1;
7 \, }9 {+ ?) x - }- p% J* g2 z( n% D* a2 o! k6 E
- }( Q: U+ c1 R% M- X6 C
- return0;
7 F, f% C* k$ s- w# h% Q3 v - }elseif(key==KEY2)' c/ r4 c: f4 c: I. {4 H; U' H
- {
3 d F) N1 T+ q+ C4 p! ~ - if(!(KEY2_PORT->IDR&KEY2_PIN))//检测到有按键了9 E5 k+ h2 q% e+ E" N
- {7 ^3 P+ {) ?% v* u; O5 `
- delay_5ms();) I2 @1 y' W0 S+ F3 y; O( D
- if(!(KEY2_PORT->IDR&KEY2_PIN))//仍然存在低电平
6 H- G, f* o. L3 u - {
R# H- O( |* E) v, ?) J7 ~ - while(KEY2_PORT->IDR&KEY2_PIN);//等待放开- c+ d$ z5 Q8 E6 L% F; H Y" Z
- returnKEY2; F: E+ t3 n% L b
- }" H" J! N4 Z- g+ f' {
- }
( J. j" K$ n H! m/ ?* i8 r! Q - return0;
/ W7 D1 e# K6 j% B; H! k5 Q - }
1 [ P" a4 I9 h! u - return0;+ Q, O/ s2 z+ k- v; s2 A3 ^3 }
- }
复制代码 ! @' l, g0 C0 Y. S z; E8 r% i7 m
总结一下,硬件电路将按键IO口的一端接地。软件配置不能使用悬浮输入方式,这种方式电压可能会不稳定。 / e( I" I/ Z: ~" v7 S8 y! v& k
|