STM32扩展按键出现的问题

STM32扩展按键出现的问题

问题描述

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

// 四个按键控制四个界面显示
 while(1)
 {
       if(KEY1 == KEY_ON)
     {
      SysTick_Delay_Ms(100);
      JLX19264G_ClearScreen();//清屏
      SysTick_Delay_Ms(100);
      display_graphic_192x64(bmp1);//显示图片1
     }
       if(KEY2 == KEY_ON)
     {
      SysTick_Delay_Ms(100);
      JLX19264G_ClearScreen();
      SysTick_Delay_Ms(100);
      display_graphic_192x64(bmp2);
     }
    
       if(KEY3 == KEY_ON)
     {
      SysTick_Delay_Ms(100);
      JLX19264G_ClearScreen();
      SysTick_Delay_Ms(100);
      display_graphic_192x64(bmp3);
     }
    
       if(KEY4 == KEY_ON)
     {
      SysTick_Delay_Ms(100);
      JLX19264G_ClearScreen();
      SysTick_Delay_Ms(100);
      display_graphic_192x64(bmp4);
     }
    
}
按照逻辑,当我按下任意键时显示的应该是对应的画面才对,但实际的效果是当我按下KEY1,出现第一个画面,这时我再按下KEY3,第三个画面并没有显示出来,但是按下KEY2,第二个画面可以显示出来。经过多次按下测试,发现四个按键只能顺序按下才能显示四个画面,也就是:
KEY1-画面1-KEY2-画面2-KEY3-画面3-KEY4-画面4-KEY1-画面1-....
这就很奇怪,主函数C语言语法应该不会有错,那么就只可能在按键扫描函数那里出现错误。

按键扫描函数

uint16_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{  
	 /*检测是否有按键按下 */
	 if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )  
	 { 	
	 /*等待按键释放 */
	  while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);
	    return KEY_ON;  
	 }
	 else
	    return KEY_OFF;
	 }

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

解决方法

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

uint16_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{  
	printf("1");
  /*检测是否有按键按下 */
  if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )  
  {  
  	printf("2");
  /*等待按键释放 */
   while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);
   	printf("3");
     return KEY_ON;  
  }
  else
     return KEY_OFF;
  }

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

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

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

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值