按键扫描程序正规用法
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;
}
}