#include<reg51.h>
#include<intrins.h>
#include<stdlib.h>
#define uchar unsigned char
#define uint unsigned int
uchar shi,fen,miao,nian1,nian2,yue,ri,num,week;
uint nian;//年的总表示
uchar k1num;//按键按下的次数
uchar i;
uchar a;//变量代替ri进行计算
/*端口定义*/
#define data P0
sbit rw=P2^5;
sbit rs=P2^6;
sbit en=P2^7;
sbit psb=P3^2;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
uchar code dis1[]={"年"};
uchar code dis2[]={"月"};
uchar code dis3[]={"日"};
uchar code dis4[]={"星期"};
uchar code dis5[]={"温度:23℃"};
uchar code dis6[]={"齐"};
uchar code dis7[]={"秋"};
uchar code dis8[]={"阳"};
uchar code dis9[]={"电气"};
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
/*写指令函数*/
/*rs=l,rw=l,en=高脉冲,D0-D7=指令码。*/
void write_com(uchar com)
{
rs=0;
rw=0;
en=0;
P0=com;
delayms(5);
en=1;
delayms(5);
en=0;
}
/*写显示数据*/
/*rs=h,rw=l,*/
void write_data(uchar date)
{
rs=1;
rw=0;
en=0;
P0=date;
delayms(5);
en=1;
delayms(5);
en=0;
}
void write_sfm(uchar add,uchar date)
{
uchar shi1,ge1; //将时分秒对应的二位数分别拆分为十位和个位
shi1=date/10;
ge1=date%10;
write_com(0x90+add);
write_data(0x30+shi1);
write_data(0x30+ge1);
}
void write_nyr(uchar add,uchar date)
{
uchar shi,ge; //将年月日对应的二位数分别拆分为十位和个位
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
void write_week(uchar add,uchar date)
{
uchar ge2; //将星期对应的二位数分别拆分为十位和个位
ge2=date%10;
write_com(0x88+add);
write_data(0x30+ge2);
}
/*初始化*/
void init()
{
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=1;
en=0;
rw=0;
psb=1; //并口方式
week=2;
nian1=20;
nian2=16;
yue=2;
ri=29;
shi=23;
fen=59;
miao=55;
write_com(0x30); //基本指令操作
delayms(5);
write_com(0x0c); //显示开,关光标
delayms(5);
write_com(0x01); //清除显示内容
delayms(5);
write_com(0x91);
write_data(':');
write_com(0x93);
write_data(':');
write_com(0x8a);
write_data(':');
write_com(0x82);
write_sfm(0,shi);
write_sfm(2,fen);
write_sfm(4,miao);
write_nyr(0,nian1);
write_nyr(1,nian2);
write_nyr(3,yue);
write_nyr(5,ri);
write_week(3,week);
}
void display()
{
nian=nian2+nian1*100;
if(yue==1||3||5||7||8||10||12)
a=31;
if(yue==4||6||9||11)
a=30;
if(yue==2)
{
if(nian%4!=0)
a=28;
else
a=29;
}
}
void keyscan() //按键函数
{
if(key1==0)
{
delayms(10);
if(key1==0)
{
k1num++;
while(!key1); //等待按键释放
if(k1num==1)
{
TR0=0;
write_com(0x80); //暂停并可调试年1
write_com(0x0f);
}
if(k1num==2)
{
write_com(0x81);
}
if(k1num==3)
{
write_com(0x83);
}
if(k1num==4)
{
write_com(0x85);
}
if(k1num==5)
{
write_com(0x90);
}
if(k1num==6)
{
write_com(0x92);
}
if(k1num==7)
{
write_com(0x94);
}
if(k1num==8)
{
write_com(0x8b);
}
if(k1num==9)
{
k1num=0;
write_com(0x0c);//设置开显示,不显示光标
TR0=1;
}
}
}
if(k1num!=0)
{
if(key2==0)
{
delayms(10);
if(key2==0)
{
while(!key2);
if(k1num==1)
{
nian1++;
if(nian1==99)
nian1=0;
write_nyr(0,nian1);
write_com(0x80);
}
if(k1num==2)
{
nian2++;
if(nian2==99)
nian2=0;
write_nyr(1,nian2);
write_com(0x81);
}
if(k1num==3)
{
yue++;
if(yue==13)
yue=1;
write_nyr(3,yue);
write_com(0x84);
}
if(k1num==4)
{
ri++;
if(ri==a+1)
ri=1;
write_nyr(5,ri);
write_com(0x86);
}
if(k1num==5)
{
shi++;
if(shi==24)
shi=0;
write_sfm(0,shi);
write_com(0x90);
}
if(k1num==6)
{
fen++;
if(fen==60)
fen=0;
write_sfm(2,fen);
write_com(0x92);
}
if(k1num==7)
{
miao++;
if(miao==60)
miao=0;
write_sfm(4,miao);
write_com(0x94);
}
if(k1num==8)
{
week++;
if(week==7)
week=0;
write_week(3,week);
write_com(0x8b);
}
}
}
if(key3==0)
{
delayms(10);
if(key3==0)
{
while(!key3);
if(k1num==1)
{
if(nian1==0)
nian1=99;
nian1--;
write_nyr(0,nian1);
write_com(0x80);
}
if(k1num==2)
{
if(nian2==0)
nian2=99;
nian2--;
write_nyr(1,nian2);
write_com(0x81);
}
if(k1num==3)
{
if(yue==1)
yue=12;
yue--;
write_nyr(3,yue);
write_com(0x84);
}
if(k1num==4)
{
if(ri==1)
ri=a;
ri--;
write_nyr(5,ri);
write_com(0x86);
}
if(k1num==5)
{
if(shi==0)
shi=24;
shi--;
write_sfm(0,shi);
write_com(0x90);
}
if(k1num==6)
{
if(fen==0)
fen=60;
fen--;
write_sfm(2,fen);
write_com(0x92);
}
if(k1num==7)
{
if(miao==0)
miao=60;
miao--;
write_sfm(4,miao);
write_com(0x94);
}
if(k1num==8)
{
if(week==1)
week=7;
week--;
write_week(3,week);
write_com(0x8b);
}
}
}
if(key3==0)
{
delayms(10);
if(key3==0)
{
TR0=1;
while(!key3);
}
}
}
}
void main()
{
init();
write_com(0x82);
for(i=0;i<2;i++)
{
write_data(dis1[i]);
delayms(1);
}
write_com(0x84);
for(i=0;i<2;i++)
{
write_data(dis2[i]);
delayms(1);
}
write_com(0x86);
for(i=0;i<2;i++)
{
write_data(dis3[i]);
delayms(1);
}
write_com(0x88);
for(i=0;i<4;i++)
{
write_data(dis4[i]);
delayms(1);
}
write_com(0x98);
for(i=0;i<10;i++)
{
write_data(dis5[i]);
delayms(1);
}
write_com(0x87);
for(i=0;i<2;i++)
{
write_data(dis6[i]);
delayms(1);
}
write_com(0x97);
for(i=0;i<2;i++)
{
write_data(dis7[i]);
delayms(1);
}
write_com(0x8f);
for(i=0;i<2;i++)
{
write_data(dis8[i]);
delayms(1);
}
write_com(0x9e);
for(i=0;i<4;i++)
{
write_data(dis9[i]);
delayms(1);
}
while(1)
{
keyscan();
display();
}
}
void T0_time() interrupt 1
{
// display();
TH0=(65536-45872)/256;
TR0=(65536-45872)%256;
num++;
if(num==20)
{
num=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
ri++;
week++;
if(week==8)
{
week=1;
}
if(ri==a+1)
{
ri=1;
yue++;
if(yue==13)
{
yue=1;
nian2++;
if(nian2==99)
{
nian2=0;
nian1++;
}
write_nyr(0,nian1);
write_nyr(1,nian2);
}
write_nyr(3,yue);
}
write_nyr(5,ri);
}
write_sfm(0,shi);
write_week(3,week);
}
write_sfm(2,fen);
}
write_sfm(4,miao);
}
}
|