以下按键程序,以前在51用过的,没问题,用到stm8s就不能正常使用了,长按很正常,单击就没有反应了。请大神花点时间帮忙看下,,,,主要是
key_driver()的返回值key_return一直不会返回“单击”长按状态就正常,单击就不正常,用串口看了,偶尔有一个“单击”信息,但是板上就是没有反应,
keyscan()也没有反应
用的是TIM4定时器 10ms轮询的,放在TIM4的中断里处理的
u8 buttonflay(void) //按键状态
{
if(GPIO_ReadInputPin(GPIOA,GPIO_PIN_3)==RESET) return key1_prss; //1
else
if(GPIO_ReadInputPin(GPIOD,GPIO_PIN_3)==RESET) return key2_prss; //2
else
if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_5)==RESET) return key3_prss; //3
else
return RESET; //0
}
u8 key_driver(void)
{
sta
tic u8 key_state = key_state_0, key_time = 0;
u8 key_return = N_key,key_press=SET;
key_press_flay=buttonflay();//读取按键状态
if(key_press_flay!=RESET) //判断按键是否按下
key_press=SET; //有按键按下
else
key_press=RESET; //有按键按下
switch (key_state)
{
case key_state_0: // 按键初始态
if (key_press==SET) key_state = key_state_1; // 键被按下,状态转换到按键消抖和确认状态
break;
case key_state_1: // 按键消抖与确认态
if (key_press==SET)
{
key_time = RESET;
key_state = key_state_2; // 按键仍然处于按下,消抖完成,状态转换到按下键时间的计时状态,但返回的还是无键事件
}
else
key_state = key_state_0; // 按键已抬起,转换到按键初始态。此处完成和实现软件消抖,其实按键的按下和释放都在此消抖的。
break;
case key_state_2:
if(key_press==RESET)
{
key_return = S_key; // 此时按键释放,说明是产生一次短操作,回送S_key
key_state = key_state_0; // 转换到按键初始态
}
else if (++key_time >= 100) // 继续按下,计时加10ms(10ms为本函数循环执行间隔)
{
key_return = L_key; // 按下时间>1000ms,此按键为长按操作,返回长键事件
key_state = key_state_3; // 转换到等待按键释放状态
}
break;
case key_state_3: // 等待按键释放状态,此状态只返回无按键事件
if (key_press==1) key_state = key_state_0; //按键已释放,转换到按键初始态
break;
}
return key_return;
}
u8 keyscan() //四个按键,返回的是不同按键的不同值
{
buttonreturn=key_driver(); //判断是 单击 还是 长按
keychose=buttonflay(); //判断是哪个按键按下
if((buttonreturn==L_key)&&(keychose==key1_prss)) return long_key1; //长按 button 1
else
if((buttonreturn==S_key)&&(keychose==key1_prss)) return click_key1;//单击 button 1
else
if((buttonreturn==S_key)&&(keychose==key2_prss)) return click_key2;//单击 button 2
else
if((buttonreturn==L_key)&&(keychose==key2_prss)) return long_key2; //长按 button 2
else
if((buttonreturn==S_key)&&(keychose==key3_prss)) return click_key3;//单击 button 3
else
if((buttonreturn==L_key)&&(keychose==key3_prss)) return long_key3; //长按 button 3
else
return N_key; // N_key=0;
}
不管是增加还是减少刷新的时间还是没有用。单击很快就被覆盖了一样,把u8 key_return = N_key,key_press=SET;改为全局变量的话,只要“单击”或“长按”,按键放开后,key_return又是永远为“1”或
“3”
一周热门 更多>