#include<reg51.h> ? ? ? ?// ?包含51单片机寄存器定义的头文件
unsigned char ID; ? ?//储存流水灯的流动速度
sbit S1=P1^4; ? ? ? ? ?//位定义S1为P1.4
/**************************************************************
函数功能:延时子程序
**************************************************************/
void delay(void) ? ?//因为仅对一个按键扫描,所以延时时间较长约200ms
{
? unsigned char i,j;
? for(i=0;i<200;i++)
? ?for(j=0;j<100;j++)
?? ? ? ;
}
/**************************************************************
函数功能:主函数
**************************************************************/
void main(void)
{
? ?TMOD=0x02; ? ? //使用定时器T0的模式2
? ?? ?EA=1; ? ? ? ? ?//开总中断
?? ?ET0=1; ? ? ? ? //定时器T0中断允许
?? ?TR0=1; ? ? ? ? //定时器T0开始运行
?? ?TH0=256-200; ? //定时器T0赋初值,每200微妙来1次中断请求
?? ?TL0=256-200;
? ID=0;
? ?while(1)
?? ? ?{
?? ??? ? ?switch(ID)
? ? ? ? ? ? {
? ? ? ? ? ? ? case 0: P3=0xfe;
? ? ? ? ? ? ? ? ? ? ? break;
?? ??? ??? ??? ? ?case 1: P3=0xfd;
? ? ? ? ? ? ? ? ? ? ? break;
?? ??? ??? ??? ? ?case 2: P3=0xfb;
? ? ? ? ? ? ? ? ? ? ? break;
?? ??? ??? ??? ? ?case 3: P3=0xf7;
? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ??
? ? ? ? ? ? }
? ? ?}
? ?}
/**************************************************************
函数功能:定时器T0的中断服务子程序,进行键盘扫描
**************************************************************/
void intersev(void) interrupt 1 using 1
{
? TR0=0; ?//关闭定时器T0
? P1=0xff;
? if(S1==0) ? ? ? //如果是按键S1按下
? ? {
?? ? ? delay(); ? ? ? //延时20ms,软件消抖
?? ? ? ?if(S1==0) ? ? ? //如果是按键S1按下
?? ??? ? ? ID=ID+1;
?? ? ?} ??
?? ?if(ID==4)
?? ? ? ID=0;?? ?
? ?? ?TR0=1; ? ? ? ? ? ? ? //启动定时器T0
}
? ? ?
?? ??? ??