#include <reg51.h>
#include <intrins.h>
unsigned char data dis_digit;
unsigned char code dis_code[]={ 0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
unsigned char data dis_buf[16];
unsigned char data dis_index;
char hour,min,sec,wang,year,mouth,day;
unsigned char sec100;
sbit k1=P1^0; //小时加减
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;//分加减
sbit k5=P1^4;
sbit k6=P1^5;//秒加减
void inc_sec();
void inc_min();
void inc_hour();
void delay(int z)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main(void)
{
wang=0;
P0 = 0xff;
P2 = 0xff;
TMOD = 0x11; // 定时器0, 1工作模式1, 16位定时方式
TH1 = 0xdc;
TL1 = 0;
TH0 = 0xFC;
TL0 = 0x17;//10000us
hour = 12;
min = 00;
sec = 00;
year=8;
mouth=05;
day=22;
sec100 = 0;
dis_buf[0] = dis_code[hour / 10]; // 时十位
dis_buf[1] = dis_code[hour % 10]; // 时个位
dis_buf[2] = 0x40;
dis_buf[3] = dis_code[min / 10]; // 分十位
dis_buf[4] = dis_code[min % 10]; // 分个位
dis_buf[5] = 0x40;
dis_buf[6] = dis_code[sec / 10]; // 秒十位
dis_buf[7] = dis_code[sec % 10]; // 秒个位
dis_buf[8] = dis_code[year / 10];
dis_buf[9] = dis_code[year % 10];
dis_buf[10] = 0x40;
dis_buf[11] = dis_code[mouth / 10];
dis_buf[12] = dis_code[mouth % 10];
dis_buf[13] = 0x40;
dis_buf[14] = dis_code[day / 10];
dis_buf[15] = dis_code[day % 10];
dis_digit = 0xfd;
dis_index = 1;
TCON = 0x01;
IE = 0x8a; // 使能timer0,1 中断
TR0 = 1;
TR1 = 1;
P1 = 0xff;
while(1)
{
if(k1==0)
{
delay(100);
if(k1==0)
{
inc_hour();
if(hour>23)
{
hour=0;
}
}
}
if(k2==0)
{
delay(100);
if(k2==0)
{
hour--;
}
if(hour<0)
{
hour=0;
}
dis_buf[0] = dis_code[hour / 10]; // 时十位
dis_buf[1] = dis_code[hour % 10]; // 时个位
}
if(k3==0)
{
delay(100);
if(k3==0)
{
inc_min();
}
if(min>59)
{
min=0;
}
}
if(k4==0)
{
delay(100);
if(k4==0)
{min--;
}
if(min<0)
{
min=0;
}
dis_buf[3] = dis_code[min / 10]; // 分十位
dis_buf[4] = dis_code[min % 10]; // 分个位
}
if(k5==0)
{
delay(100);
if(k5==0)
{
inc_sec();
}
if(sec>59)
{
sec=0;
}
}
if(k6==0)
{
delay(100);
if(k6==0)
{
sec--;
}
if(sec<0)
{
sec=0;
}
dis_buf[6] = dis_code[sec / 10]; // 秒十位
dis_buf[7] = dis_code[sec % 10]; // 秒个位
}
}
}
void timer0() interrupt 1
{
TH0 = 0xFC;
TL0 = 0x17;
wang++;
if(wang==5)
{
wang=0;
P2 = 0xff;
P0 = dis_buf[dis_index];
//p1=dis_buf[dis_index=8];
P2 = dis_digit; //
dis_digit = _crol_(dis_digit,1); // 位选通值左移, 下次中断时选通下一位数码管
dis_index++; //
dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
}
}
void timer1() interrupt 3
{ TH1 = 0xdc;
sec100++;
if(sec100 >= 100)
{
sec100 = 0;
inc_sec();
}
}
void inc_sec()
{ sec++;
if(sec > 59)
{
sec = 0;
inc_min();
}
dis_buf[6] = dis_code[sec / 10]; // 秒十位
dis_buf[7] = dis_code[sec % 10]; // 秒个位
}
void inc_min()
{ min++;
if(min > 59)
{
min = 0;
inc_hour();
}
dis_buf[3] = dis_code[min / 10]; // 分十位
dis_buf[4] = dis_code[min % 10]; // 分个位
}
void inc_hour()
{ hour++;
if(hour > 23)
{
hour = 0;
}
if(hour > 9)
dis_buf[0] = dis_code[hour / 10]; // 时十位
else
dis_buf[0] = 0x00; // 当小时的十位为0时不显示
dis_buf[1] = dis_code[hour % 10]; // 时个位
}