单片机学习小组
直播中

高桂清

7年用户 1033经验值
私信 关注

如何解决STM32扩展按键出现的问题?

如何解决STM32扩展按键出现的问题?

回帖(1)

张飞

2022-1-17 10:59:18
问题描述
由于近期需要做一个项目,想通过四个按键来控制液晶屏显示四个界面的显示,采用的主函数的控制代码如下:


// 四个按键控制四个界面显示
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
即可解决问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分