|
硬件环境采用STM8SF103,电压为3.3V。电路需要注意的是STM8SF103这系列的IO作为输入口时只能是上拉输入和悬浮输入,虽然是弱上拉,在VCC为3.3V电压时,仍然能够被拉升至3.0V左右。 所以按键检测电路IO口一端需要接地,而不是外接上拉。悬浮方式下IO仍然会有0.89V左右电压,读取对应的IO寄存器IDR,仍然处于逻辑高电平状态。 软件代码相对很简单,只需要将IO口设置成上拉输入即可。采用轮询代码如下:
4 L5 S9 f x: ]) n N% R+ v- //初始化只需要设置IO口模式即可。, g* O; y! |4 ]& l* b' Y
- GPIO_Init(KEY2_PORT,KEY2_PIN,GPIO_MODE_IN_PU_NO_IT);//上拉输入,不产生中断
+ s+ m- E" [7 x3 t+ c - //按键检测部分9 `( V, c. m' _4 x' o m
- /*
$ @' s& T& L' Y2 N( r - #defineKEY103 _" x% f6 i5 R- w8 o, w
- #defineKEY1_PORT(GPIOD). n/ G' z6 Q7 \! V2 b
- #defineKEY1_PIN(GPIO_PIN_4)
6 a6 q! f( `# W6 D - #defineKEY21
. S2 q, Q( y3 n$ W% F6 F! u - #defineKEY2_PORT(GPIOC)
0 [4 c5 N& k3 j) M4 t - #defineKEY2_PIN(GPIO_PIN_1)
@( I2 O1 L' j7 s9 o+ P8 f$ f - */
- X- {5 Q7 B; H/ w9 l5 C - u8CheckKey(u8key)
* K, x1 w+ U9 U1 e+ L5 \( ?1 ^ - {
* v* P5 O4 k9 G& D4 S+ q - if(key==KEY1)- U; ~) K( V/ U/ Y- F" q9 a
- {
! }6 K( o; L& c$ F, C - if(KEY1_PORT->IDR&KEY1_PIN)//检测到有按键了,IO口电压会被拉低1 e' Q+ ^4 b! X( [1 j, [
- {
+ M) I) ~1 Z" Q F - delay_5ms();
: m/ t& Y% Q! m! t s - if(KEY1_PORT->IDR&KEY1_PIN)//仍然存在低电平( D2 _5 H0 S" A) R9 u$ o
- {
, K2 {8 I& s5 N+ v) R1 T9 t2 { - while(!(KEY1_PORT->IDR&KEY1_PIN));//等待放开
) m$ ^) N! S+ [' G - returnKEY1;
- J7 j, x; c9 N# p9 m x - } @9 @, m2 S \6 P; I& {! o
- }' Y! M# m* F( v5 H
- return0;% c* C! ^# h5 o3 e3 v# I. B; T' `
- }elseif(key==KEY2)* y+ ~4 H: |) E: f Y
- {$ w6 Q+ ~5 `2 A; p6 J
- if(!(KEY2_PORT->IDR&KEY2_PIN))//检测到有按键了) l( q. p. r6 B3 r* y$ q$ a" X
- {( ], M2 c, [, O( c3 t+ f" ~0 L
- delay_5ms();$ b! g) H/ v5 P) |, d) \3 D% I
- if(!(KEY2_PORT->IDR&KEY2_PIN))//仍然存在低电平
- C5 Y+ A- p& \/ W0 y - {1 k1 N1 t; H5 G+ a4 Q7 h/ j% f
- while(KEY2_PORT->IDR&KEY2_PIN);//等待放开
6 K" o) e3 R* F1 E2 j - returnKEY2;: C) j* K2 r7 l
- }6 z3 q7 ^ \* u. W% ~+ }$ e
- }
# S5 ^) y7 \% i- x1 O6 f6 Z - return0;
B& B C D: e. I - }3 ]6 h; X' J: ~9 Q: p" }
- return0;3 _' B d" f1 r K( x
- }
复制代码 7 W8 @2 r [6 r6 {" J* \
总结一下,硬件电路将按键IO口的一端接地。软件配置不能使用悬浮输入方式,这种方式电压可能会不稳定。 2 i0 ]4 j. x) P5 d5 k2 K6 O4 j
|