C语⾔定时器按键消抖程序,按键消抖⽅法(中断与定时器配合
使⽤)
//按键消抖⽅法,中断与定时器配合使⽤。
//1.中断出发按键处理程序不管发生什么别放开我的手
//2.识别按键是否⼀直处于按下状态,80ms
//3.识别按键什么时候放开
//4.识别按键是短按还是长按
struct KEY_TYPE
{
unsigned char HDMI_KeyProcessFlag; //按键处理标志
unsigned char HDMI_KeyStateFlag; //按键状态标志
unsigned char HDMI_KeyShortTime; //按键状态标志
unsigned short HDMI_KeyLongTime; //按键状态标志
unsigned char HDMI_KeySave; //按键保存
unsigned int KeyTimeOut; //按键超时时间
};
struct KEY_TYPE keyType = {0,0,80,3000,0,10000}; //状态标志全部设置为0,短按键时间为80ms,长按键时间为3s,超时10s //HDMI按键中断处理函数
void HDMI_KeyExtiServer(void) //放在按键IO中断⾥⾯
{
if((keyType.HDMI_KeyProcessFlag == 0)&&(keyType.HDMI_KeyStateFlag == 0))
{
keyType.HDMI_KeyProcessFlag = 1;
}
}
//HDMI按键定时器处理函数
void HDMI_KeyTimerServer(void) //放在1ms定时器中断⾥⾯
{
static unsigned int count=0;
static unsigned int count2=0;
switch(keyType.HDMI_KeyProcessFlag)
{
case 0: //没有按键动作
count=0;
break;
case 1://开始检测,判断是否是⼀个有效的按键动作
count++;
keyType.HDMI_KeySave += (HDMI_BUTTON_read);
if(count>keyType.HDMI_KeyShortTime)
{
if(keyType.HDMI_KeySave>3))//有⼋分之7的时间是低电平,有效。{
keyType.HDMI_KeyProcessFlag = 2 ;
keyType.HDMI_KeySave = 0 ;
}else
{
keyType.HDMI_KeyProcessFlag = 0 ;
keyType.HDMI_KeySave = 0 ;
count = 0;
}
}
break;
case 2://判断按键放开时间,有⾼电平来为⽌
count++;
if(HDMI_BUTTON_read)
{
keyType.HDMI_KeyProcessFlag = 3 ;
}else if(count>keyType.KeyTimeOut) //超时
{
keyType.HDMI_KeyProcessFlag = 0 ;
keyType.HDMI_KeySave = 0 ;
}
break;
case 3://有连续10ms⾼电平视为放开
count++;
count2++;
keyType.HDMI_KeySave += (HDMI_BUTTON_read);
if(count2>10)
{
if(keyType.HDMI_KeySave>8)
{
keyType.HDMI_KeyProcessFlag = 4 ;
keyType.HDMI_KeySave = 0;
count2 = 0;医药市场调研
}else
清洁能源有哪些{
keyType.HDMI_KeyProcessFlag = 2 ;
keyType.HDMI_KeySave = 0;
count2 = 0;
}
}
break;
case 4://判定按键按动类型
if(count>keyType.HDMI_KeyLongTime)
{
keyType.HDMI_KeyStateFlag = 2;
}else if(count>keyType.HDMI_KeyShortTime)
{
keyType.HDMI_KeyStateFlag = 1;
}else
{
双显卡切换keyType.HDMI_KeyStateFlag = 0;
}
keyType.HDMI_KeyProcessFlag = 0 ;
谭维维简介default:
count=0;a股是什么
break;
}
}
//按键主处理函数
void KeyMainProcess(void) //放在main函数死循环⾥⾯
{
if(keyType.HDMI_KeyStateFlag == 1) //短按是HDMI输⼊选择
{
keyType.HDMI_KeyStateFlag = 0;
SET_HDMI_LED_ON;
SET_DVI_LED_OFF;
}else if(keyType.HDMI_KeyStateFlag == 2) //长按是DVI输⼊选择{
keyType.HDMI_KeyStateFlag = 0;
SET_HDMI_LED_OFF;
SET_DVI_LED_ON;
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论