|
void Timer0Init(void) //1000微秒@22.1184MHz
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設(shè)置定時器模式
TMOD |= 0x01; //設(shè)置定時器模式
TL0 = 0x9A; //設(shè)置定時初值
TH0 = 0xA9; //設(shè)置定時初值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時器0開始計時
ET0 =1;
}
void Timer0() interrupt 1
{
TL0 = 0x9A; //設(shè)置定時初值
TH0 = 0xA9; //設(shè)置定時初值
num++;
Time_key_cnt++;
Timer0_cnt++;
if(Timer0_cnt >10)
{
Timer0_cnt=0;
Key_scan();
}
if(num >1000)
{
num =0;
LED =~LED;
}
}
void Key_scan(void)
{
switch(Key_cnt)
{
case 0x00:
if(Key ==0)
{
Key_cnt = 0x01;
Time_key_cnt=0;
break;
}
case 0x01:
if(Key == 0)
{
Key_cnt = 0x02;
Lamp_flag =1;
break;
}
else
Key_cnt =0x00;
break;
case 0x02:
if(Key ==1)
Key_cnt = 0x00;
if(Time_key_cnt >200)
{
Lamp_mode = 1;//燈模式選擇 1 電抗 0 為電容
Time_key_cnt =0;//長按按鍵計時清零
}
break;
default : break;
}
}
void Button_scan() //開關(guān)感應(yīng)器軟件抗干擾處理函數(shù),放在定時中斷里。
{
if(Button_right == 1) //左邊感應(yīng)器是高電平,說明有可能沒有被接觸 對應(yīng)朱兆祺學(xué)習(xí)板的S5鍵
{
Button_cnt1 = 0;//在軟件濾波中,非常關(guān)鍵的語句!!!類似按鍵去抖動程序的及時清零
Button_cnt2++; //類似獨立按鍵去抖動的軟件抗干擾處理
if(Button_cnt2 > 20)
{
Button_cnt2=0;
Button_right=1; //說明感應(yīng)器確實沒有被接觸
}
}
else //左邊感應(yīng)器是低電平,說明有可能被接觸到了
{
Button_cnt2=0; //在軟件濾波中,非常關(guān)鍵的語句!!!類似按鍵去抖動程序的及時清零
Button_cnt1++;
if(Button_cnt1 > 20)
{
Button_cnt1=0;
Button_right=0; //說明感應(yīng)器確實被接觸
}
}
}
這是我前段時間抄的代碼,一個時狀態(tài)機,一個類似于狀態(tài)機 兩個都可以消抖 |
|