#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code disp1[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x00}; //查表显示数组
sbit k1=P1^0; //定义按键
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
uint i=0;
int k=0;
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD= 0x11; //定时器1和0使用模式1,16位定时器,
TH0=(65536-50000)/256; //定时器赋初值 50ms中断一次
TL0=(65536-50000)%256;
EA=1; //总中断打开
ET0=1; //定时器0中断打开
ET1=1; //定时器1中断打开
}
void delay(unsigned int n) //延时函数,用于去抖
{
while(n--);
}
void shaomiao() //扫描函数,用于判断哪个键按下
{ if(!k1)
{ delay(1000);
if(!k1)
{
while(!k1);
TR0=0; //关闭定时器0
TR1=0; //关闭定时器1
k=9; //全亮
}
}
if(!k2)
{ delay(1000);
if(!k2)
{
while(!k2);
TR0=0; //关闭定时器0
TR1=0; //关闭定时器1
k=0; //全灭
}
}
if(!k3)
{delay(1000);
if(!k3)
{
while(!k3);
TR0=1; //打开定时器0
TR1=0; //关闭定时器1
}
}
if(!k4)
{delay(1000);
if(!k4)
{
while(!k4) ;
TR0=0; //关闭定时器0
TR1=1; //打开定时器1
}
}
}
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{
Init_Timer0();
while(1)
{ shaomiao();
P0=disp1[k]; //显示,用于查表显示
}
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 //定时器0 从上向下流
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
if(i==20)
{ i=0;
k++;
if(k>=9)
k=1;
}
}
void Timer1_isr(void) interrupt 3 // 定时器1 从下向上流
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
if(i==20)
{ i=0;
k--;
if(k<1)
k=8;
}
}