自己習作,所有按鍵相關處理在定時中斷中進行,主循環可釋放出來。
當然,也就“絕對不會產生抖動”了,呵呵。
下面,貼上全部程序。不喜勿噴
/***************************************************
工程名:獨立按鍵(狀態機)控制 LED_之二
作 者:老芹
***************************************************/
#include "STC15F2K60S2.H"
#define uchar unsigned char
#define uint unsigned int
void LED_ON();
void LED_OFF();
sbit K1 = P1^4; //定義按鍵
sbit LED = P0^0;
void KEY_Scan(); //檢測按鍵
void Timer0_Init(); //定時器初始化
bit key;
void main()
{
Timer0_Init();
while(1)
{
if(key) //按鍵按下,LED點亮
LED_ON(); //點亮LED
else
LED_OFF(); //關閉LED
}
}
void KEY_Scan() //檢測按鍵
{
static uchar i,j,k;
static uchar KeyStatus = 0; //按鍵狀態
if(K1==0) j=1; //按鍵首次按下,鍵按下標志置位
if((K1==1)&&(j==0)) return;
switch (KeyStatus)
{
case 0: //初始狀態下,KeyStatus=0
if(k<8)
{
k++;
if(!K1)
i++;
if(i!=k)
{
KeyStatus=0; //是干擾,退回初始狀態
i=0; //鍵按下標志復位
k=0;
k=0;
}
break;
}
i=0;
k=0;
KeyStatus++;
break;
case 1:
key = !key; //按鍵有效
KeyStatus++; //轉到下一狀態,等待按鍵釋放
break;
case 2:
if(K1==0) //鍵仍然按下
break;
else //鍵松開
{
//key = !key; //鍵松開執行
KeyStatus = 0; //鍵釋放,退回初始狀態
i=0;
j=0;
k=0;
}
break;
}
}
void Timer0_Init() //定時器初始化
{ //2毫秒@11.0592MHz
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設置定時器模式
TL0 = 0x9A; //設置定時初值
TH0 = 0xA9; //設置定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
ET0 =1;
EA = 1;
}
void Timer0() interrupt 1 //定時器中斷
{ //16位自動重裝模式,無需重賦初值
static bit i;
if(key) //按鍵按下,LED點亮
LED_ON(); //點亮LED
else
LED_OFF(); //關閉LED
i = !i;
if(i) //每4Ms執行一次鍵盤掃描程序
KEY_Scan();
}
/*點亮LED*/
void LED_ON()
{
LED=0;
}
/*關閉LED*/
void LED_OFF()
{
LED=1;
}
|