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

STM32扩展按键出现的问题

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

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


  1. // 四个按键控制四个界面显示
  2. while(1)
  3. {
  4.        if(KEY1 == KEY_ON)
  5.      {
  6.       SysTick_Delay_Ms(100);
  7.       JLX19264G_ClearScreen();//清屏
  8.       SysTick_Delay_Ms(100);
  9.       display_graphic_192x64(bmp1);//显示图片1
  10.      }
  11.        if(KEY2 == KEY_ON)
  12.      {
  13.       SysTick_Delay_Ms(100);
  14.       JLX19264G_ClearScreen();
  15.       SysTick_Delay_Ms(100);
  16.       display_graphic_192x64(bmp2);
  17.      }
  18.    
  19.        if(KEY3 == KEY_ON)
  20.      {
  21.       SysTick_Delay_Ms(100);
  22.       JLX19264G_ClearScreen();
  23.       SysTick_Delay_Ms(100);
  24.       display_graphic_192x64(bmp3);
  25.      }
  26.    
  27.        if(KEY4 == KEY_ON)
  28.      {
  29.       SysTick_Delay_Ms(100);
  30.       JLX19264G_ClearScreen();
  31.       SysTick_Delay_Ms(100);
  32.       display_graphic_192x64(bmp4);
  33.      }
  34.    
  35. }
复制代码
  1. 按照逻辑,当我按下任意键时显示的应该是对应的画面才对,但实际的效果是当我按下KEY1,出现第一个画面,这时我再按下KEY3,第三个画面并没有显示出来,但是按下KEY2,第二个画面可以显示出来。经过多次按下测试,发现四个按键只能顺序按下才能显示四个画面,也就是:
  2. KEY1-画面1-KEY2-画面2-KEY3-画面3-KEY4-画面4-KEY1-画面1-....
  3. 这就很奇怪,主函数C语言语法应该不会有错,那么就只可能在按键扫描函数那里出现错误。
复制代码



按键扫描函数


  1. uint16_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
  2. {  
  3.          /*检测是否有按键按下 */
  4.          if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )  
  5.          {        
  6.          /*等待按键释放 */
  7.           while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);
  8.             return KEY_ON;  
  9.          }
  10.          else
  11.             return KEY_OFF;
  12.          }
复制代码

结果发现:按键检测函数也没有什么问题,所以只能进行代码调试了。



解决方法

首先判断出主函数的一个while+四个if是没有问题的,接下来就是对按键扫描函数进行调试,在函数中加入printf进行打印信息,看看代码的执行过程:


  1. uint16_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
  2. {  
  3.         printf("1");
  4.   /*检测是否有按键按下 */
  5.   if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )  
  6.   {  
  7.           printf("2");
  8.   /*等待按键释放 */
  9.    while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);
  10.            printf("3");
  11.      return KEY_ON;  
  12.   }
  13.   else
  14.      return KEY_OFF;
  15.   }
复制代码

测试发现:按KEY1后,串口输出:312,按照正常的逻辑,调用扫描函数,应该打印的是123。所以说明当按键按下时,

GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON根本没执行,而是在松开按键时才执行的,这样其实问题就浮现出最根本的面目了,此按键低电平触发


解决方法也很简单,将宏定义中
#define KEY_ON 1
改成 #define KEY_ON 0
即可解决问题。



收藏 评论0 发布时间:2020-9-30 09:32

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版