问题描述
由于近期需要做一个项目,想通过四个按键来控制液晶屏显示四个界面的显示,采用的主函数的控制代码如下:
// 四个按键控制四个界面显示
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
即可解决问题。
问题描述
由于近期需要做一个项目,想通过四个按键来控制液晶屏显示四个界面的显示,采用的主函数的控制代码如下:
// 四个按键控制四个界面显示
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
即可解决问题。
举报