#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "lcd.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
#define led P2
char a[]=" 23:57:54 ";
void delay(u16 i)
{
while(i--);
}
void Int1Init()
{
//设置INT1
IT1=1;//跳变沿出发方式(下降沿)
EX1=1;//打开INT1的中断允许。
EA=1;//打开总中断
}
int t=8;
void Timer1Init()
{
TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
TH1=0XFC; //给定时器赋初值,定时1ms
TL1=0X18;
ET1=1;//打开定时器1中断允许
EA=1;//打开总中断
TR1=1;//打开定时器
}
void timerun()
{ u8 i,j;
a[8]=a[8]+1;
if(a[8]>57)
{
a[7]=a[7]+1;a[8]=48;
if(a[7]>53)
{
a[5]=a[5]+1;a[7]=48;
if(a[5]>57)
{
a[4]=a[4]+1;a[5]=48;
if(a[4]>53)
{
a[2]=a[2]+1;a[4]=48;
if(a[1]<50)
{
if(a[2]>57)
{
a[1]=a[1]+1;a[2]=48;
}
}
if(a[1]==50)
{
if(a[2]>51)
{
for(i=1;i<9;i++)
{
if(i%3==0)
continue;
a[i]=48;
}
}
}
}
}
}
}
LcdInit();
for(j=0;j<9;j++)
LcdWriteData(a[j]);
delay(50000);
}
void minuteadd()
{ u8 i,j;
a[5]=a[5]+1;
if(a[5]>57)
{
a[4]=a[4]+1;a[5]=48;
if(a[4]>53)
{
a[2]=a[2]+1;a[4]=48;
if(a[1]<50)
{
if(a[2]>57)
{
a[1]=a[1]+1;a[2]=48;
}
}
if(a[1]==50)
{
if(a[2]>51)
{
for(i=1;i<9;i++)
{
if(i%3==0)
continue;
a[i]=48;
}
}
}
}
}
LcdInit();
for(j=0;j<9;j++)
LcdWriteData(a[j]);
delay(50000);
}
void houradd()
{ u8 j;
a[2]=a[2]+1;
if(a[1]<50)
{
if(a[2]>57)
{
a[1]=a[1]+1;a[2]=48;
}
}
if(a[1]==50)
{
if(a[2]>51)
{ a[1]=48;
a[2]=48;
}
}
LcdInit();
for(j=0;j<9;j++)
LcdWriteData(a[j]);
delay(50000);
}
void time_()
{ u8 j;
if(a[8]>48)
a[8]=a[8]-1;
else if(a[8]==48&&(a[7]>48||a[5]>48||a[4]>48||a[2]>48||a[1]>48))
{ if(a[7]>48)
{a[7]=a[7]-1;a[8]=57;}
else if(a[7]==48)
{ if(a[5]>48)
{a[5]=a[5]-1;a[7]=53;a[8]=57;}
else if(a[5]==48)
{ if(a[4]>48)
{a[4]=a[4]-1;a[5]=57;a[7]=53;a[8]=57;}
else if(a[4]==48)
{ if(a[2]>48)
{a[2]=a[2]-1;a[4]=53;a[5]=57;a[7]=53;a[8]=57;}
else if(a[2]==48)
{a[1]=a[1]-1;a[2]=57;a[4]=53;a[5]=57;a[7]=53;a[8]=57;}
}
}
}
}
LcdInit();
for(j=0;j<9;j++)
LcdWriteData(a[j]);
delay(50000);
}
void minute_()
{ u8 j;
a[5]=a[5]-1;
if(a[5]==48&&(a[4]>48||a[2]>48||a[1]>48))
{
if(a[4]>48)
{a[4]=a[4]-1;a[5]=57;}
if(a[4]==48)
{ if(a[2]>48)
{a[2]=a[2]-1;a[4]=57;}
if(a[2]==48)
{a[1]=a[1]-1;a[2]=57;}
}
}
LcdInit();
for(j=0;j<9;j++)
LcdWriteData(a[j]);
delay(50000);
}
void hour_()
{ u8 j;
a[2]=a[2]-1;
if(a[2]==48)
{a[1]=a[1]-1;a[2]=57;}
LcdInit();
for(j=0;j<9;j++)
LcdWriteData(a[j]);
delay(50000);
}
void add()
{
switch(t)
{
case 8: timerun();break;
case 5: minuteadd();break;
case 2: houradd();break;
}
}
void K3_()
{
switch(t)
{
case 8: time_();break;
case 5: minute_();break;
case 2: hour_();break;
}
}
void control()
{
while(1)
{delay(1000);
if(k1==0)
{
if(k1==0)
{
t--;
t--;
if(t%3==0)
t--;
}
}while(!k1);
delay(1000);
if(k2==0)
{
if(k2==0)
{
add();
}
}while(!k2);
delay(1000);
if(k3==0)
{
if(k3==0)
{
K3_();
}
}while(!k3);
}
}
void show()
{
u8 i; LcdInit();
for(i=0;i<9;i++)
LcdWriteData(a[i]);
}
void main()
{
show();
Int1Init();
Timer1Init(); //定时器1初始化
control();
}
void Int1() interrupt 2 //外部中断1的中断函数
{
delay(1000); //延时消抖
if(k4==0)
{
TR1=~TR1;
}
}
void Timer1() interrupt 3
{
static u16 i;
TH1=0XFC; //给定时器赋初值,定时1ms
TL1=0X18;
i++;
if(i==1000)
{
i=0;
timerun();
}
}