你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32扩展按键出现的问题

[复制链接]
STMCU-管管 发布时间:2020-9-30 09:32
STM32扩展按键出现的问题问题描述

由于近期需要做一个项目,想通过四个按键来控制液晶屏显示四个界面的显示,采用的主函数的控制代码如下:

6 a8 s+ O4 n) S4 i0 S! g

  1. // 四个按键控制四个界面显示8 H" n2 s: }( q4 h" N- P# P! ?
  2. while(1)
    . ^' l& W" C% m! j# C
  3. {
    & ]6 _% c7 N( y  A2 T. c
  4.        if(KEY1 == KEY_ON)
    2 }  i. _+ E! {( ~: \
  5.      {
    + @4 ?3 t/ G9 K( j) Z
  6.       SysTick_Delay_Ms(100);4 J" |* z2 R# o/ M
  7.       JLX19264G_ClearScreen();//清屏( `1 q: U7 e5 a0 @/ j; z
  8.       SysTick_Delay_Ms(100);, w6 H8 @7 [& |. p/ c, ?% U
  9.       display_graphic_192x64(bmp1);//显示图片1
      m+ l) m3 n. ^& B8 A1 t4 M
  10.      }  D" r+ l. s; O, E8 o2 `
  11.        if(KEY2 == KEY_ON)
    ! S) ~: g  h" M! [' Q2 k
  12.      {0 L4 W* `- [3 `
  13.       SysTick_Delay_Ms(100);
    & K; M4 r  N# n& J
  14.       JLX19264G_ClearScreen();
    3 p0 ?) P3 ?  M
  15.       SysTick_Delay_Ms(100);
    / w7 S& \! T; l% f- y* x& f) m1 B( _
  16.       display_graphic_192x64(bmp2);7 z% E2 A/ f) [
  17.      }
    / [# p9 X( m% g  ?' K3 J" r
  18.    
    ! d& D9 ?& D2 p9 N' d" }% e
  19.        if(KEY3 == KEY_ON)
    ; j0 B! ^: I1 t8 ]
  20.      {
    # k# v+ p5 g( z6 z% N  ]6 A
  21.       SysTick_Delay_Ms(100);
    : F% E6 V( U* H6 T7 \0 l  s
  22.       JLX19264G_ClearScreen();
    8 `" Q4 Y) Z( Y7 _
  23.       SysTick_Delay_Ms(100);6 c9 j' N1 e; T) ?( _
  24.       display_graphic_192x64(bmp3);" q/ c- ?5 o; Y$ h# r# o9 G/ {
  25.      }
    & ^% T' T3 `* ^* @' m' V5 g' H
  26.    
    4 q6 `( {+ K2 {7 W
  27.        if(KEY4 == KEY_ON)  W1 F3 K6 J2 y
  28.      {( d( G: o4 P& L- E/ A
  29.       SysTick_Delay_Ms(100);$ t6 V% _' g( s4 R+ F
  30.       JLX19264G_ClearScreen();& ?7 ~" _$ O: U2 ~" Q
  31.       SysTick_Delay_Ms(100);0 G4 y& M9 C7 {' ^( _( F1 u; W
  32.       display_graphic_192x64(bmp4);# {% f' I3 v1 V+ X
  33.      }
    % C/ R: R( t+ j4 [
  34.     3 G+ x9 \3 V* p8 j' s5 b; k" j
  35. }
复制代码
  1. 按照逻辑,当我按下任意键时显示的应该是对应的画面才对,但实际的效果是当我按下KEY1,出现第一个画面,这时我再按下KEY3,第三个画面并没有显示出来,但是按下KEY2,第二个画面可以显示出来。经过多次按下测试,发现四个按键只能顺序按下才能显示四个画面,也就是:
    2 A2 s% \; R: i: k: e$ i! z
  2. KEY1-画面1-KEY2-画面2-KEY3-画面3-KEY4-画面4-KEY1-画面1-....
    8 e8 l( ~# w2 J: U  w+ S
  3. 这就很奇怪,主函数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

  1. uint16_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
    ! V6 Q; I$ ~3 K2 P6 y$ s7 l1 V6 C3 @
  2. {  
    4 J! |) W+ P4 q. r! ]
  3.          /*检测是否有按键按下 */
    - p+ B( q7 X: O/ D* J/ r
  4.          if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )  
    7 I: q/ U; u& y; H# c6 K
  5.          {         $ f! V! f, B: c; a0 F4 f
  6.          /*等待按键释放 */- {. H! b1 h/ @& c
  7.           while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);
    $ I2 j3 c4 |4 N) T3 u3 ]
  8.             return KEY_ON;  , r) D% [: d! l8 f2 g7 n
  9.          }
    ) N; t) K1 n0 S8 M. X. i
  10.          else
    7 H, \+ N# a8 ~$ M  ~7 b1 u% u# b
  11.             return KEY_OFF;
    ' x3 m; _6 C# n
  12.          }
复制代码

) 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

  1. uint16_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
    , H' i$ k% i3 C; w* @& U
  2. {  
    - y0 l  o. L& F
  3.         printf("1");
    6 u/ t: Q. W% \2 e/ l
  4.   /*检测是否有按键按下 */# a# B9 b& j6 d+ G
  5.   if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )  
      A5 D- X/ }( k) m4 o& t6 ~
  6.   {  
    % E8 l" s8 q5 p# g
  7.           printf("2");
    & L. P( S( r3 K$ P2 _! H
  8.   /*等待按键释放 */
    " g9 k7 X% K6 u8 M- Y$ c
  9.    while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);+ I9 k5 C3 h+ P9 i/ Z2 |
  10.            printf("3");9 J9 f! o9 I4 u8 ]7 V* L2 w9 Z$ I. D
  11.      return KEY_ON;  
    & T" @: q3 X& H; J) [, Y. m7 |
  12.   }5 v8 \) J7 ?% I$ U9 t- `2 c% r
  13.   else
    2 J0 f  {' x& d0 ^6 z# \6 [0 \
  14.      return KEY_OFF;
    ' H" ?# @) p8 |5 M) |* Y
  15.   }
复制代码
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
赞 收藏 评论0 发布时间:2020-9-30 09:32

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版