按鍵掃描程式正規用法
main.c
#include <reg52.h>
sfr AUXR = 0x8e;
sbit KEY = P0^0;
sbit LED = P0^1;
void Timer0Init(void) //2毫秒@11.0592MHz
{
AUXR &= 0x7F; //定時器時鐘12T模式
TMOD &= 0xF0; //設定定時器模式
TL0 = 0xCD; //設定定時初值
TH0 = 0xF8; //設定定時初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定時器0開始計時
}
void key_scan()
{
static unsigned char state_cnt;
switch(state_cnt)
{
case 0x00: if(KEY == 0) //有按鍵被按下
{
state_cnt = 0x01;
break;
}
case 0x01: if(KEY == 0) //确定被按下
{
state_cnt = 0x02;
LED = ~LED; //執行按鍵對應操作
break;
}
else //沒有被被按下,重新開始檢測
{
state_cnt = 0x00;
break;
}
case 0x02: if(KEY == 1) //按鍵被釋放
{
state_cnt = 0x00; //一個完整的按鍵觸發、執行、釋放的過程完成
break;
}
default: break;
}
}
void main()
{
LED = 1;
KEY = 1;
EA = 1;
ET0 = 1;
Timer0Init();
while(1);
}
void Timer0_routine() interrupt 1
{
static unsigned char cnt_2ms;
cnt_2ms ++; //計數
if(cnt_2ms == 5) //調用按鍵掃描函數
{
key_scan();
cnt_2ms = 0;
}
}