本帖最后由 雪山飞狐D 于 2018-7-3 23:32 编辑
用了按键缓存和定时器10ms时标,IO为上拉状态,检测0为按下。
Get_Key( )直接在任何位置输出按键, Key_scan()放进定时器中断即可,当然为了减少按键状态,长按键状态计数会在某个很长的时间循环为0。
void Key_scan(void);
unsigned char Get_Key(void);
volatile unsigned char Key_State=0; //1,2,3,4 代表短按键状态,11,12,13,14代表长按键状态
xdata unsigned char Key_Buf[3]={0,0,0};
//按键三级缓冲,IO电平为0为按键按下,写入101为K1按下,102为K2,103为K3,104为K4,写入0为按键松开
xdata unsigned long K1_couter=0; //长按键计时
xdata unsigned long K2_couter=0;
xdata unsigned long K3_couter=0;
xdata unsigned long K4_couter=0;
sbit K1=P4^7;
sbit K2=P4^6;
sbit K3=P4^5;
sbit K4=P3^7;
unsigned char Get_Key(void) //放入相关主函数获取按键状态
{
unsigned char Key_temp=0;
EA=0; //关中断防止重入
Key_temp=Key_State;
Key_State=0; //读取按键后重置状态
EA=1;
return Key_temp;
}
void Key_scan(void) //放进定时10ms中断扫描
{
K1=1;
K2=1;
K3=1;
K4=1; //IO口先置高//按键按下为IO电平0
if(K1==0)
{
K1_couter++; //按键计时
Key_Buf[0]=Key_Buf[1];
Key_Buf[1]=Key_Buf[2];
Key_Buf[2]=101; //压入按键缓冲
}
else if(K2==0)
{
K2_couter++;
Key_Buf[0]=Key_Buf[1];
Key_Buf[1]=Key_Buf[2];
Key_Buf[2]=102; //压入按键缓冲
}
else if(K3==0)
{
K3_couter++;
Key_Buf[0]=Key_Buf[1];
Key_Buf[1]=Key_Buf[2];
Key_Buf[2]=103; //压入按键缓冲
}
else if(K4==0)
{
K4_couter++;
Key_Buf[0]=Key_Buf[1];
Key_Buf[1]=Key_Buf[2];
Key_Buf[2]=104; //压入按键缓冲
}
else
{
K1_couter=0; //按键IO为1,重置计时
K2_couter=0;
K3_couter=0;
K4_couter=0;
Key_Buf[0]=Key_Buf[1];
Key_Buf[1]=Key_Buf[2];
Key_Buf[2]=0; //压入按键缓冲
}
if((Key_Buf[0]==101)&&(Key_Buf[1]==101)&&(Key_Buf[2]==0)&&(K1_couter<200))
//小于2S松手为短按键,检测上升沿为松手
{
Key_State=1;
}
else if((Key_Buf[0]==102)&&(Key_Buf[1]==102)&&(Key_Buf[2]==0)&&(K2_couter<200))
{
Key_State=2;
}
else if((Key_Buf[0]==103)&&(Key_Buf[1]==103)&&(Key_Buf[2]==0)&&(K2_couter<200))
{
Key_State=3;
}
else if((Key_Buf[0]==104)&&(Key_Buf[1]==104)&&(Key_Buf[2]==0)&&(K2_couter<200))
{
Key_State=4;
}
else if((Key_Buf[0]==101)&&(Key_Buf[1]==101)&&(Key_Buf[2]==101)&&(K1_couter>=200)) //大于等于2S未松手为长按键,计数循环长度为unsigned long
{
Key_State=1+10; //11代表K1长按
}
else if((Key_Buf[0]==102)&&(Key_Buf[1]==102)&&(Key_Buf[2]==102)&&(K2_couter>=200))
{
Key_State=2+10;
}
else if((Key_Buf[0]==103)&&(Key_Buf[1]==103)&&(Key_Buf[2]==103)&&(K3_couter>=200))
{
Key_State=3+10;
}
else if((Key_Buf[0]==104)&&(Key_Buf[1]==104)&&(Key_Buf[2]==104)&&(K4_couter>=200))
{
Key_State=4+10;
}
}
|