INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13)<br />
{<br />
<br />
KeyCurrent=((GPIO_ReadInputData(GPIOB)&0xc0)>>6); <br />
<br />
<br />
if(KeyCurrent!=KeyOld) //如果两次值不等,说明按键情况发生了改变<br />
{<br />
KeyNoChangedTime=0; //按键按下情况为0<br />
KeyOld=KeyCurrent; //保存当前按键情况<br />
//return; //·μ??<br />
}<br />
else<br />
{<br />
KeyNoChangedTime++; //按下时间累计<br />
if(KeyNoChangedTime>=1) //如果按下时间足够<br />
{<br />
KeyNoChangedTime=1;<br />
KeyPress=KeyOld; //保存按键<br />
KeyDown|=(~KeyLast)&(KeyPress); //求出新按下的键<br />
KeyUp|=KeyLast&(~KeyPress); //求出新释放的键<br />
KeyLast=KeyPress; //保存当前按键情况<br />
}<br />
}<br />
Key();<br />
TIM2_ClearITPendingBit(TIM2_IT_UPDATE);<br />
}<br />
<br />
<br />
我用STM8S207C8T6写程序,开发环境IAR,用定时器中断检测按键。<br />
可是按键反应很迟钝。请高手帮忙看看,谢谢!<br />
<br />
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
可是按键反应很迟钝。实际情况如何。怎么就迟钝了。描述具体现象。
处理思路为:
中断函数:读取当前按键状态->识别按键状态(例如需要识别按下、抬起、长短按键等)->迭代按键状态
KEY_InFIFO()是缓存函数,可以解决按键状态丢失的情况。
- void Key_Detect(void)
- {
- uint8_t i;
- Key_Status[0].key_cur_value=KBI1_IO_DATA;
- Key_Status[1].key_cur_value=KBI2_IO_DATA;
- Key_Status[2].key_cur_value=KBI3_IO_DATA;
- Key_Status[3].key_cur_value=KBI4_IO_DATA;
- Key_Status[4].key_cur_value=KBI5_IO_DATA;
- Key_Status[5].key_cur_value=KBI6_IO_DATA;
- Key_Status[6].key_cur_value=KBI7_IO_DATA;
- Key_Status[7].key_cur_value=KBI8_IO_DATA;
- Key_Status[8].key_cur_value=KBI9_IO_DATA;
- Key_Status[9].key_cur_value=KBI10_IO_DATA;
- Key_Status[10].key_cur_value=KBI11_IO_DATA;
- Key_Status[11].key_cur_value=KBI12_IO_DATA;
- Key_Status[12].key_cur_value=KBI13_IO_DATA;
- Key_Status[13].key_cur_value=KBI14_IO_DATA;
- Key_Status[14].key_cur_value=KBI15_IO_DATA;
-
- for(i=0;i<KEYNUM;i++)
- {
- if((Key_Status[i].key_pre_value==1)&&(Key_Status[i].key_cur_value==0)) //--------高->低 按下
- {
- if((i!=12)&&(i!=5)) //fall edge key pressed KEY12
- {
- Key_InFIFO(&KEY_BUFF,(i+1));
- }
- //此处添加代码,用来检测需要达到规定时长的按键
- Key_Status[i].KEY_status=1;//按下
- Key_Status[i].key_pres_time=0;
-
- }
- else if((Key_Status[i].key_pre_value==0)&&(Key_Status[i].key_cur_value==1)) //--------低->高 松开
- {
- Key_Status[i].KEY_status=0;//松开
- // if(((i==12)||(i==5))&&(Key_Status[i].key_pres_time>=50)) //fall edge key pressed
- // {
- // Key_InFIFO(&KEY_BUFF,(i+1));
- // }
- if((i==6)||(i==7)||(i==8)||(i==9)||(i==10)||(i==11))// k7 k8 k9 k10 k11 k12 long pressed key
- {
- Key_InFIFO(&KEY_BUFF,(0x10+(i+1)));//识别按键是否抬起
- }
- }
- else if((Key_Status[i].KEY_status!=0)&&(Key_Status[i].key_pre_value==0)&&(Key_Status[i].key_cur_value==0)) //--------低->高 松开
- {
- if(((i==12)||(i==5))&&(Key_Status[i].key_pres_time>=50)) //fall edge key pressed
- {
- Key_Status[i].KEY_status=0;//表示抬起
- Key_InFIFO(&KEY_BUFF,(i+1));
- }
- }
- //长按功能暂时未使用
- if(Key_Status[i].KEY_status==1)
- {
- Key_Status[i].key_pres_time++;
- if((Key_Status[i].key_pres_time>50)&&(Key_Status[i].key_pres_time%10==0))
- {
- if((i==6)||(i==7)||(i==8)||(i==9)||(i==10)||(i==11))// k7 k8 k9 k10 k11 k12 long pressed key
- {
- Key_InFIFO(&KEY_BUFF,(LONG+(i+1)));//长按识别按键
- }
- }
- }
- }
-
- Key_Status[0].key_pre_value=Key_Status[0].key_cur_value;
- Key_Status[1].key_pre_value=Key_Status[1].key_cur_value;
- Key_Status[2].key_pre_value=Key_Status[2].key_cur_value;
- Key_Status[3].key_pre_value=Key_Status[3].key_cur_value;
- Key_Status[4].key_pre_value=Key_Status[4].key_cur_value;
- Key_Status[5].key_pre_value=Key_Status[5].key_cur_value;
- Key_Status[6].key_pre_value=Key_Status[6].key_cur_value;
- Key_Status[7].key_pre_value=Key_Status[7].key_cur_value;
- Key_Status[8].key_pre_value=Key_Status[8].key_cur_value;
- Key_Status[9].key_pre_value=Key_Status[9].key_cur_value;
- Key_Status[10].key_pre_value=Key_Status[10].key_cur_value;
- Key_Status[11].key_pre_value=Key_Status[11].key_cur_value;
- Key_Status[12].key_pre_value=Key_Status[12].key_cur_value;
- Key_Status[13].key_pre_value=Key_Status[13].key_cur_value;
- Key_Status[14].key_pre_value=Key_Status[14].key_cur_value;
- }
复制代码一周热门 更多>