当前位置:文档之家› 按键处理程序 C语言 单片机

按键处理程序 C语言 单片机

Uchar SetInRn;
Uchar Model; //按键状态(模式)
#defineOff_C0 //之前未按下
#defineOn_C1 //现按下
#defineDelay_C 2 //按键处理后标志
}Key;
//----------------定义两个IO输入口为按键入口--------------------//
SetBak[0]=Rtc_InitDate.RTC_Year;
SetBak[1]=Rtc_InitDate.RTC_Month;
SetBak[2]=Rtc_InitDate.RTC_Date;
SetBak[3]=Rtc_InitDate.RTC_WeekDay;
SetBak[4]=Rtc_InitTime.RTC_Hours;
}
SetBak[5]=Rtc_InitTime.RTC_Minutes;
//-----------长按需处理的内容------上----------//
Key.Model=Delay_C; //置按键模式为:已处理按键(看头文件定义)
return;
}
}
else
Key.SetInRn=0;
Key.Model=Delay_C;
//处理相应按键(可250ms才调用一次)长按
if(Key.Model == On_C) //按键状态为已按下
{
if(Key.Val == Key_Model_C) //是键1按下(看头文件定义)
{
if(++Key.SetInRn >= 3) //连计3次数3秒后为长按键(对应上面,如果按下未抬起的话会延时1000ms)
{
Key.ScanOnTime=0;
if(KeyMo_Bin == 0) //如果按键1为0即按下
{
Key.Val=Key_Model_C; //付当键1值(看头文件定义)
Key.Model=On_C; //置按键已按下标志
}
else if(KeyAdd_Bin == 0) //如果按键2为0即按下
分享一种按键处理程序(用C)
//头文件定义:
Ustruct KEY
{
Uchar Val;
#defineKey_Model_C0 //按键1值
#defineKey_AddVal_C 1 //按键2值
Uint ScanOnTime;
Uchar LongKeyState;
Uchar LongKeyRestState;
/*===============================================================*/
//主程序大循环中每1毫秒扫描1次
void KeyScan(void)
{
if(Key.LongKeyRestState == 1) //长按键标志(复位处理长按键)
{
void LoadCheckKeyRest(void)
{
Key.LongKeyRestState=1;
Key.ScanOnTime=0;
}
//======================================================================================
return;
}
if(Key.Model == Off_C) //如果当前按键状态为未按下“Off_C”
{
if((KeyMo_Bin == 0) || (KeyAdd_Bin == 0))//按键1或按键2已按下(低有效)
{
if(++Key.ScanOnTime >= 10) //当按下后自加1,加够10次即1ms*10=10ms去抖动
#define KeyMo_Bin(GPIOB->IDR.Bit.B5)
#define KeyAdd_Bin(GPIOB->IDR.Bit.B6)
/*===============================================================*/
GPIO_Init(GPIO_Pin_5|GPIO_Pin_6,GPIO_Mode_In_PU_No_IT); //初始化为上拉输入无中断
{
Key.SetInRn=0;
LoadCheckKeyRest(); //调清长按处理
BellOn(600); //蜂鸣器响
//-----------长按需处理的内容-----下-----------//
WorkStateBit.Bit.SettingMo=1;
SetOverTime=0;
SetMoRn=0;
if((KeyMo_Bin == 1) && (KeyAdd_Bin == 1)) //当两按键均抬起
{
if(++Key.ScanOnTime >= 130) //延时后复位
{
Key.LongKeyRestState=0;
Key.Model=Delay_C;
}
}
else
Key.ScanOnTime=0;
{
if((KeyMo_Bin == 1) && (KeyAdd_Bin == 1))//如果两按键均抬起
{
if(++Key.ScanOnTime >= 100) //延时100ms后复位按键状态为“Off_C”
{
Key.SetInRn=0;
Key.ScanOnTime=0;
Key.Model=Off_C;
}Байду номын сангаас
}
else //如果按键没有被抬起,对应上面if
{
if(++Key.ScanOnTime >= 1000) //延时1000ms后再复位按键状态为“Off_C”(为长按处理)
{
Key.ScanOnTime=0;
Key.Model=Off_C;
}
}
}
}
//======================================================================================
{
Key.Val=Key_AddVal_C; //付当键2值(看头文件定义)
Key.Model=On_C; //置按键已按下标志
}
BellOn(200); //蜂鸣器响
}
}
else
Key.ScanOnTime=0; //清去抖延时计数值
}
else if(Key.Model == Delay_C) //如果当前按键状态为已按下且已处理“Delay_C”
相关主题