|
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
即可解决问题。
|