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

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扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版