📄 定时器万年历.txt
字号:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P1^0;
sbit rw=P1^1;
sbit lcden=P1^2;
sbit s1=P3^2;
sbit s2=P0^0;
sbit s3=P0^1;
sbit s4=P3^3;
uchar count,s1num,s4num,clock;
char n=1;
char miao,shi,fen,zhou,clh,clm,clsw,nian=2008,yue=9,ri=15;
uchar code table[]=" 2008-09-15 LY CLOCK:OFF";
uchar code table1[]=" 00:00:00 MON 00:00";
uchar mon1[12]={31,28,31,30,31,30,31,31,30,31,30,31};
uchar mon2[12]={31,29,31,30,31,30,31,31,30,31,30,31};
uchar week[]={0x4d,0x4f,0x4e,0x54,0x55,0x45,0x57,0x45,0x44,0x54,0x48,0x55,0x46,0x52,0x49,0x53,0x41,0x54,0x53,0x55,0x4e};
uchar kaiguan[]={"OFFON "};
void delay(uint z) //延时函数z毫秒
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) //液晶写指令函数
{
rs=0;
lcden=0;
P2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date) //液晶写数据函数
{
rs=1;
lcden=0;
P2=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init() //初始化函数
{
uchar num;
lcden=0;
rw=0;
write_com(0x38); //显示模式设置:设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c); //开显示,不显示光标
write_com(0x06); //当读或写一个字符后地址指针加一,且光标加一
write_com(0x01); //显示清屏
write_com(0x80);
for(num=0;num<25;num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<21;num++)
{
write_date(table1[num]);
delay(5);
}
TMOD=0x01;
TH0=(65536-50000)/256; //中断时间设置为50ms
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1; //启动定时器,进入定时中断函数
}
void write_sfm(uchar x,uchar y,uchar date) //时分秒月日显示函数
{
uchar shi,ge;
shi=date/10;
ge=date%10;
if(y==0)
write_com(0x80+x);
if(y==1)
write_com(0xc0+x);
write_date(0x30+shi);
write_date(0x30+ge);
}
void write_nyr(uchar add,uchar date) //年显示函数
{
uchar qian,bai,shi,ge;
qian=date/1000;
bai=date/100%10;
shi=date/10%100;
ge=date%10;
write_com(0x80+add);
write_date(0x30+qian);
write_date(0x30+bai);
write_date(0x30+shi);
write_date(0x30+ge);
}
void write_week(char zhou) //星期显示,字符显示
{
char l;
write_com(0x80+0x40+11);
for(l=0;l<3;l++)
{
write_date(week[3*zhou+l]);
}
}
void write_swich(char clsw) //开关显示:字符显示
{
char m;
write_com(0x80+22);
for(m=0;m<3;m++)
{
write_date(kaiguan[3*clsw+m]);
}
}
void keyscan() //键盘检测程序:包括选择校时位,加减按钮
{
if(s1==0)
{
delay(5);
if(s1==0)
{
write_com(0x80+12);
write_date(0x20);
write_date(0x4c);
write_date(0x59);
write_date(0x20);
write_com(0x80+10);
while(!s1);
s1num++;
if((s4num==0)&&(s1num==1))
{
TR0=0;
write_com(0x80+0x40+9);
write_com(0x0f);
}
if((s4num==0)&&(s1num==2))
{
write_com(0x80+0x40+6);
}
if((s4num==0)&&(s1num==3))
{
write_com(0x80+0x40+3);
}
if((s4num==0)&&(s1num==4))
{
write_com(0x80+0x40+11);
}
if((s4num==0)&&(s1num==5))
{
write_com(0x80+11);
}
if((s4num==0)&&(s1num==6))
{
write_com(0x80+8);
}
if((s4num==0)&&(s1num==7))
{
write_com(0x80+5);
}
if((s4num==0)&&(s1num==8))
{
s1num=0;
write_com(0x0c);
TR0=1;
}
}
}
if(s1num!=0)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
if((s4num==0)&&(s1num==1))
{
miao++;
if(miao==60)
miao=0;
write_sfm(8,1,miao);
write_com(0x80+0x40+8);
}
if((s4num==0)&&(s1num==2))
{
fen++;
if(fen==60)
fen=0;
write_sfm(5,1,fen);
write_com(0x80+0x40+5);
}
if((s4num==0)&&(s1num==3))
{
shi++;
if(shi==24)
shi=0;
write_sfm(2,1,shi);
write_com(0x80+0x40+2);
}
if((s4num==0)&&(s1num==4))
{
zhou++;
if(zhou==7)
zhou=0;
write_week(zhou);
write_com(0x80+0x40+11);
}
if((s4num==0)&&(s1num==5))
{
ri++;
if(n==1)
{
if(ri==mon1[yue-1]+1)
ri=1;
}
if(n==0)
{
if(ri==mon2[yue-1]+1)
ri=1;
}
write_sfm(10,0,ri); write_nyr(12,ri);
write_com(0x80+10);
}
if((s4num==0)&&(s1num==6))
{
yue++;
if(yue==13)
yue=1;
write_sfm(7,0,yue);
write_com(0x80+7);
}
if((s4num==0)&&(s1num==7))
{
nian++;
if((nian%4==0&&nian%100!=0)||(nian%400==0))
{
n=1;
write_com(0x80+13);
write_date(0x20);
write_date(0x20);
write_com(0x80+13);
}
else
{
n=0;
write_com(0x80+13);
write_date(0x4c);
write_date(0x59);
write_com(0x80+13);
}
write_nyr(2,nian);
write_com(0x80+2);
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
if((s4num==0)&&(s1num==1))
{
miao--;
if(miao==-1)
miao=59;
write_sfm(8,1,miao);
write_com(0x80+0x40+8);
}
if((s4num==0)&&(s1num==2))
{
fen--;
if(fen==-1)
fen=59;
write_sfm(5,1,fen);
write_com(0x80+0x40+5);
}
if((s4num==0)&&(s1num==3))
{
shi--;
if(shi==-1)
shi=23;
write_sfm(2,1,shi);
write_com(0x80+0x40+2);
}
if((s4num==0)&&(s1num==4))
{
zhou--;
if(zhou==-1)
zhou=6;
write_week(zhou);
write_com(0x80+0x40+11);
}
if((s4num==0)&&(s1num==5))
{
ri--;
if(n==1)
{
if(ri==0)
ri=mon1[yue-1];
}
if(n==0)
{
if(ri==0)
ri=mon2[yue-1];
}
write_sfm(10,0,ri); write_nyr(12,ri);
write_com(0x80+10);
}
if((s4num==0)&&(s1num==6))
{
yue--;
if(yue==0)
yue=12;
write_sfm(7,0,yue);
write_com(0x80+7);
}
if((s4num==0)&&(s1num==7))
{
nian--;
if((nian%4==0&&nian%100!=0)||(nian%400==0))
{
n=1;
write_com(0x80+13);
write_date(0x20);
write_date(0x20);
write_com(0x80+13);
}
else
{
n=0;
write_com(0x80+13);
write_date(0x4c);
write_date(0x59);
write_com(0x80+13);
}
write_nyr(2,nian);
write_com(0x80+2);
}
}
}
}
}
/*void clockset()
{
if(s1==0)
{
delay(5);
if(s1==0)
{
while(!s1);
s1num++;
if((s4num==1)&&(s1num==1))
{
write_com(0x80+0x40+20);
}
if((s4num==1)&&(s1num==2))
{
write_com(0x80+0x40+17);
}
if((s4num==1)&&(s1num==3))
{
write_com(0x80+24);
}
if((s4num==1)&&(s1num==4))
{
s1num=0;
write_com(0x0c); //闹钟设置选位
}
}
}
if(s1num!=0)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
if((s4num==1)&&(s1num==1))
{
clm++;
if(clm==60)
clm=0;
write_sfm(0x13,1,clm);
write_com(0x80+0x40+0x13);
}
if((s4num==1)&&(s1num==2))
{
clh++;
if(clh==24)
clh=0;
write_sfm(0x10,1,clh);
write_com(0x80+0x40+0x10);
}
if((s4num==1)&&(s1num==3))
{
clsw++;
if(clsw==2)
clsw=0;
write_sfm(0x15,0,clsw);
write_com(0x80+0x15);
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
if((s4num==1)&&(s1num==1))
{
clm--;
if(clm==-1)
clm=59;
write_sfm(0x13,1,clm);
write_com(0x80+0x40+0x13);
}
if((s4num==1)&&(s1num==2))
{
clh--;
if(clh==-1)
clh=23;
write_sfm(0x10,1,clh);
write_com(0x80+0x40+0x10);
}
if((s4num==1)&&(s1num==3))
{
clsw--;
if(clsw==-1)
clsw=1;
write_sfm(0x15,0,clsw);
write_com(0x80+0x15);
}
}
}
}
}*/
void screenchang()
{
char num;
if(s4==0)
{
delay(5);
if(s4==0)
{ s4num++;
if(s4num==2)
s4num=0;
while(!s4);
if(s4num==1)
{
write_com(0x80);
for(num=0;num<16;num++) //整屏移动
{
write_com(0x18);
delay(20);
}
write_com(0x06);
}
if(s4num==0) //恢复定屏
{
write_com(0x80+0x32);
for(num=0;num<16;num++)
{
write_com(0x1c);
delay(20);
}
write_com(0x06);
}
}
}
}
void main()
{
init();
while(1)
{
screenchang();
keyscan();
// clockset();
while(((shi==clh)&&(fen==clm))&&(clsw==1))
{
clock=0;
delay(100);
clock=1;
delay(100);
}
clock=1;
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==18)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
zhou++;
if(zhou==7)
{
zhou=0;
}
write_week(zhou);
ri++;
write_sfm(11,0,ri);
if(n==1)
{
if(ri==mon1[yue]+1)
{
ri=0;
yue++;
if(yue==13)
{
yue=1;
nian++;
if((nian%4==0&&nian%100!=0)||(nian%400==0))
{
n=1;//闰年
write_com(0x80+13);
write_date(0x4c);
write_date(0x59);
}
else
{
n=0;//非闰年
write_com(0x80+13);
write_date(0x20);
write_date(0x20);
}
write_nyr(2,nian);
}
write_sfm(7,0,yue);
}
}
if(n==0)
{
if(ri==mon2[yue]+1)
ri=0;
yue++;
if(yue==13)
{
yue=1;
nian++;
if((nian%4==0&&nian%100!=0)||(nian%400==0))
{
n=1;//闰年
write_com(0x80+13);
write_date(0x4c);
write_date(0x59);
}
else
{
n=0;//非闰年
write_com(0x80+13);
write_date(0x20);
write_date(0x20);
}
write_nyr(2,nian);
}
write_sfm(7,0,yue);
} write_nyr(12,ri);
}
write_sfm(2,1,shi);
}
write_sfm(5,1,fen);
}
write_sfm(8,1,miao);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -