|
/***************************************************
工程名:獨(dú)立按鍵(狀態(tài)機(jī))控制 LED
作 者:老芹
***************************************************/
#include "STC15F2K60S2.H"
#include "LED.H"
#define uchar unsigned char
#define uint unsigned int
extern void LED_ON();
extern void LED_OFF();
sbit K1 = P1^4; //定義按鍵
void KEY_Scan(); //檢測(cè)按鍵
void Timer0_Init(); //定時(shí)器初始化
bit key;
void main()
{
Timer0_Init();
while(1)
{
if(key) //按鍵按下,LED點(diǎn)亮
LED_ON(); //點(diǎn)亮LED
else
LED_OFF(); //關(guān)閉LED
}
}
void KEY_Scan() //檢測(cè)按鍵
{
//bit an;
static uchar i,j,k;
static uchar KeyStatus = 0; //按鍵狀態(tài)
if(K1==0) j=1; //按鍵首次按下,鍵按下標(biāo)志置位
if((K1==1)&&(j==0)) return;
//an = !K1;
switch (KeyStatus)
{
case 0: //初始狀態(tài)下,KeyStatus=0
if(k<8)
{
i=i<<1;
//i=i|an;
i=i|(!K1);
k++;
break;
}
k=0;
if(i==0xff)
{
i=0x00;
KeyStatus++;
break;
}
else
{
KeyStatus=0; //是干擾,退回初始狀態(tài)
i=0x00;
j=0; //鍵按下標(biāo)志復(fù)位
k=0;
break;
}
case 1:
key = !key; //按鍵有效
KeyStatus++; //轉(zhuǎn)到下一狀態(tài),等待按鍵釋放
break;
case 2:
if(K1==0) //鍵仍然按下
break;
else //鍵松開(kāi)
{
//key = !key; //鍵松開(kāi)執(zhí)行
KeyStatus = 0; //鍵釋放,退回初始狀態(tài)
i=0x00;
j=0;
k=0;
}
break;
}
}
void Timer0_Init() //定時(shí)器初始化
{ //2毫秒@11.0592MHz
AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TL0 = 0x9A; //設(shè)置定時(shí)初值
TH0 = 0xA9; //設(shè)置定時(shí)初值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí)
ET0 =1;
EA = 1;
}
void Timer0() interrupt 1 //定時(shí)器中斷
{ //16位自動(dòng)重裝模式,無(wú)需重賦初值
static bit i;
i = !i;
if(i) //每4Ms執(zhí)行一次鍵盤掃描程序
KEY_Scan();
}
|
評(píng)分
-
查看全部評(píng)分
|