中级会员
 
- 积分
- 385
- 金钱
- 385
- 注册时间
- 2011-11-21
- 在线时间
- 32 小时
|
对于初学者来说,学会点亮LED灯和按键读取是比较容易的事,往往初学者会在这个基础上有一些其他的想法。比如之前是按下按键0点亮LED0,按下按键1点亮LED1;那么现在想按键按键0使LED0闪烁,即使松开也LED0也继续闪烁,直到按下按键1跳转到LED1闪烁。这个怎么去实现呢?我捣鼓了两天还是没有弄出了,今天弄出来了。我只想通过自己的经历让一些像我这样的人理清下思维。
要使按键0按下LED0闪烁,并且按键0松开LED0仍然闪烁,只要没有其他按键按下,LED0就一直闪烁。我一开始总是在主函数那里想逻辑,怎么跳出LED0闪烁。后来发现问题应该放在按键扫描那里,在按键扫描函数那里定义一个静态变量用来保存按键值,有按键按下时扫描是哪个按键按下并把按键值保存到静态变量中,然后返回这个静态变量,没有按键按下时任然返回这个静态变量就可以了。具体的程序如下:
uint8_t key_scan(void)
{
// static uint8_t keyup = 1;
static uint8_t cKeyState = 0;
HAL_Delay ( 5 );
if ( sw1 == 0 )
cKeyState = sw1_press;
else if ( sw2 == 0 )
cKeyState = sw2_press;
else if ( sw3 == 0 )
cKeyState = sw3_press;
else if ( sw4 == 0 )
cKeyState = sw4_press;
/*
if ( keyup && ( sw1 == 0 || sw2 == 0 || sw3 == 0 || sw4 == 0 ) )
{
HAL_Delay ( 50 );
keyup = 0;
if ( sw1 == 0 )
cKeyState = sw1_press;
else if ( sw2 == 0 )
cKeyState = sw2_press;
else if ( sw3 == 0 )
cKeyState = sw3_press;
else if ( sw4 == 0 )
cKeyState = sw4_press;
}
else if ( sw1 == 1 && sw2 == 1 && sw3 == 1 && sw4 == 1 )
keyup = 1;
*/
return cKeyState;
}
|
|