|
STM32扩展按键出现的问题问题描述 由于近期需要做一个项目,想通过四个按键来控制液晶屏显示四个界面的显示,采用的主函数的控制代码如下: 6 a8 s+ O4 n) S4 i0 S! g
- // 四个按键控制四个界面显示8 H" n2 s: }( q4 h" N- P# P! ?
- while(1)
. ^' l& W" C% m! j# C - {
& ]6 _% c7 N( y A2 T. c - if(KEY1 == KEY_ON)
2 } i. _+ E! {( ~: \ - {
+ @4 ?3 t/ G9 K( j) Z - SysTick_Delay_Ms(100);4 J" |* z2 R# o/ M
- JLX19264G_ClearScreen();//清屏( `1 q: U7 e5 a0 @/ j; z
- SysTick_Delay_Ms(100);, w6 H8 @7 [& |. p/ c, ?% U
- display_graphic_192x64(bmp1);//显示图片1
m+ l) m3 n. ^& B8 A1 t4 M - } D" r+ l. s; O, E8 o2 `
- if(KEY2 == KEY_ON)
! S) ~: g h" M! [' Q2 k - {0 L4 W* `- [3 `
- SysTick_Delay_Ms(100);
& K; M4 r N# n& J - JLX19264G_ClearScreen();
3 p0 ?) P3 ? M - SysTick_Delay_Ms(100);
/ w7 S& \! T; l% f- y* x& f) m1 B( _ - display_graphic_192x64(bmp2);7 z% E2 A/ f) [
- }
/ [# p9 X( m% g ?' K3 J" r -
! d& D9 ?& D2 p9 N' d" }% e - if(KEY3 == KEY_ON)
; j0 B! ^: I1 t8 ] - {
# k# v+ p5 g( z6 z% N ]6 A - SysTick_Delay_Ms(100);
: F% E6 V( U* H6 T7 \0 l s - JLX19264G_ClearScreen();
8 `" Q4 Y) Z( Y7 _ - SysTick_Delay_Ms(100);6 c9 j' N1 e; T) ?( _
- display_graphic_192x64(bmp3);" q/ c- ?5 o; Y$ h# r# o9 G/ {
- }
& ^% T' T3 `* ^* @' m' V5 g' H -
4 q6 `( {+ K2 {7 W - if(KEY4 == KEY_ON) W1 F3 K6 J2 y
- {( d( G: o4 P& L- E/ A
- SysTick_Delay_Ms(100);$ t6 V% _' g( s4 R+ F
- JLX19264G_ClearScreen();& ?7 ~" _$ O: U2 ~" Q
- SysTick_Delay_Ms(100);0 G4 y& M9 C7 {' ^( _( F1 u; W
- display_graphic_192x64(bmp4);# {% f' I3 v1 V+ X
- }
% C/ R: R( t+ j4 [ - 3 G+ x9 \3 V* p8 j' s5 b; k" j
- }
复制代码- 按照逻辑,当我按下任意键时显示的应该是对应的画面才对,但实际的效果是当我按下KEY1,出现第一个画面,这时我再按下KEY3,第三个画面并没有显示出来,但是按下KEY2,第二个画面可以显示出来。经过多次按下测试,发现四个按键只能顺序按下才能显示四个画面,也就是:
2 A2 s% \; R: i: k: e$ i! z - KEY1-画面1-KEY2-画面2-KEY3-画面3-KEY4-画面4-KEY1-画面1-....
8 e8 l( ~# w2 J: U w+ S - 这就很奇怪,主函数C语言语法应该不会有错,那么就只可能在按键扫描函数那里出现错误。
复制代码 Z: J/ m) Q6 D1 L
; _& H Q2 o1 D+ J" J4 e( c
* L4 M* v f# n8 X" k
按键扫描函数
6 [: F6 F$ b0 Y3 @! g
- uint16_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
! V6 Q; I$ ~3 K2 P6 y$ s7 l1 V6 C3 @ - {
4 J! |) W+ P4 q. r! ] - /*检测是否有按键按下 */
- p+ B( q7 X: O/ D* J/ r - if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )
7 I: q/ U; u& y; H# c6 K - { $ f! V! f, B: c; a0 F4 f
- /*等待按键释放 */- {. H! b1 h/ @& c
- while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);
$ I2 j3 c4 |4 N) T3 u3 ] - return KEY_ON; , r) D% [: d! l8 f2 g7 n
- }
) N; t) K1 n0 S8 M. X. i - else
7 H, \+ N# a8 ~$ M ~7 b1 u% u# b - return KEY_OFF;
' x3 m; _6 C# n - }
复制代码
) n7 D) V0 \& a ^6 P# [结果发现:按键检测函数也没有什么问题,所以只能进行代码调试了。 + U6 c2 o& B* q% ?7 Y8 P( Y& L
t$ I5 u$ m; \$ T3 V9 q7 R( ^ 解决方法
. z& b$ j& g5 ]& d& R
y4 B% j8 G0 x! a首先判断出主函数的一个while+四个if是没有问题的,接下来就是对按键扫描函数进行调试,在函数中加入printf进行打印信息,看看代码的执行过程:
$ d2 s. \" j+ p: q# X5 z
- uint16_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
, H' i$ k% i3 C; w* @& U - {
- y0 l o. L& F - printf("1");
6 u/ t: Q. W% \2 e/ l - /*检测是否有按键按下 */# a# B9 b& j6 d+ G
- if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )
A5 D- X/ }( k) m4 o& t6 ~ - {
% E8 l" s8 q5 p# g - printf("2");
& L. P( S( r3 K$ P2 _! H - /*等待按键释放 */
" g9 k7 X% K6 u8 M- Y$ c - while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);+ I9 k5 C3 h+ P9 i/ Z2 |
- printf("3");9 J9 f! o9 I4 u8 ]7 V* L2 w9 Z$ I. D
- return KEY_ON;
& T" @: q3 X& H; J) [, Y. m7 | - }5 v8 \) J7 ?% I$ U9 t- `2 c% r
- else
2 J0 f {' x& d0 ^6 z# \6 [0 \ - return KEY_OFF;
' H" ?# @) p8 |5 M) |* Y - }
复制代码 4 k8 A7 q- |, N: Y
测试发现:按KEY1后,串口输出:312,按照正常的逻辑,调用扫描函数,应该打印的是123。所以说明当按键按下时, GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON根本没执行,而是在松开按键时才执行的,这样其实问题就浮现出最根本的面目了,此按键低电平触发 " e. X. {# k7 I. L
解决方法也很简单,将宏定义中4 t' }: i: y& C0 l5 h6 q% z
#define KEY_ON 1' {2 e0 M& w% X2 z" X( i
改成 #define KEY_ON 05 ~. B7 Z# V& V5 U
即可解决问题。
0 i, {5 p9 ~4 r0 ~7 B) ~* ]
) ]$ U& B% a9 d |