#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar leddata[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0xf6,0xff};
//数码管段码数组
uchar PLACE_CODE[]={0xfe,0xfd,0xfb,0xf7};
//数码管位选数组
uchar LEDBuf[]={11,11,11,11};
//数据显示缓冲区
uchar timerCnt,sec,min,state=0;
void main()
{
Timer1Init();
Timer0Init();
EX0_Init();
EX1_Init(); //函数调用
EA=1; //打开总开关
while(1)
{
switch(state)
{
case 0:TR0=1;showNormal();break;//正常时钟状态
case 1:showSec();break;//调秒
case 2:showMin();break;//调分
default:break;
}
}
}
void Display()
{
uchar i;
switch(i)
{
case 0:
P0=0xff;
P0=leddata[LEDBuf[0]];//送段码
P2=PLACE_CODE[0]; //送位选
i++;
break;
case 1:
P0=0xff;
P0=leddata[LEDBuf[1]];//送段码
P2=PLACE_CODE[1]; //送位选
i++;
break;
case 2:
P0=0xff;
P0=leddata[LEDBuf[2]];//送段码
P2=PLACE_CODE[2]; //送位选
i++;
break;
case 3:
P0=0xff;
P0=leddata[LEDBuf[3]];//送段码
P2=PLACE_CODE[3]; //送位选
i=0;
break;
default:break;
}
}
void timer0_ISR(void) interrupt 1 //中断服务函数产生秒分
{
timerCnt++;
if(timerCnt>=20) //20次50ms中断
{
timerCnt=0;
sec++;
if(sec>=60)
{
sec=0;
min++;
if(min>=60)
{
min=0;
}
}
}
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
}
void Timer0Init(void) //50毫秒@12.000MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
TF0 = 0; //清除TF0标志
ET0=1; //打开中断
}
void timer1_ISR(void) interrupt 3 //实现数码管的动态刷新
{
TR1=0;
Display();
TL1 = 0x18; //设置定时初值
TH1 = 0xFC; //设置定时初值
TR1=1;
}
void Timer1Init(void) //1毫秒@12.000MHz
{
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x10; //设置定时器模式
TL1 = 0x18; //设置定时初值
TH1 = 0xFC; //设置定时初值
TF1 = 0; //清除TF1标志
ET1=1; //打开中断
EA=1; //打开总开关
TR1 = 1; //定时器1开始计时
}
void EX0_ISR() interrupt 0 //对状态变量state进行处理
{
TR0=0;
state++;
if(state>2)
state=0;
}
void EX0_Init()
{
IT0=1;
EX0=1;
}
void EX1_ISR() interrupt 2 //调节秒和分钟
{
TR0=0;
switch(state)
{
case 0:break;
case 1:sec++;if(sec>=60)sec=0;break;
case 2:min++;if(min>=60)min=0;break;
default:break;
}
}
void EX1_Init()
{
IT1=1;
EX1=1;
}
void showNormal()
{
LEDBuf[3]=min/10;
LEDBuf[2]=min%10;
LEDBuf[1]=sec/10;
LEDBuf[0]=sec%10;
}
void showSec()
{
LEDBuf[3]=12;
LEDBuf[2]=12;
LEDBuf[1]=sec/10;
LEDBuf[0]=sec%10;
}
void showMin()
{
LEDBuf[3]=min/10;
LEDBuf[2]=min%10;
LEDBuf[1]=12;
LEDBuf[0]=12;
}
评论0