- 仿真图的数码锁存器和温度传感器不用加,这是学校板
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;//黑液晶屏
sbit rs=P3^5;
sbit lcden=P3^4;
sbit wr=P3^6;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit s4=P3^3;
sbit fengming=P2^3;//蜂鸣器
uchar count;
uchar miao,shi,fen,month,day,week,year,selectDate,selectWei,weekChange=0;
uchar weekSelect=0;
uchar code tableYear[]="2000";
uchar code tableMonth[]="-01";
uchar code tableDay[]="-01";
uchar code tableWeek[]="-Mon-Tue-Wed-Thu-Fri-Sat-Sun";
uchar code tableTime[]="00:00:00 ";//初始化
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar get_year() //判断是否是闰年
{
uchar s=0;
if(year%4==0)s=1;
return s;
}
void write_com(uchar com)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_sfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);//写入的位置
write_date(0x30+shi);//写入时间的十位
write_date(0x30+ge);//写入时间的个位
}
void write_diyihang(uchar add,uchar date)//年月日
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x01+add);//写入的位置
write_date(0x30+shi);//写入时间的十位
write_date(0x30+ge);//写入时间的个位
}
uchar get_month()//获取每个月的时间
{
uchar DAY;
switch(month)
{
case 1:DAY=31;break;
case 2:
{if(get_year()==1)DAY=29;
else DAY=28;}break;
case 3: DAY=31;break;
case 4: DAY=30;break;
case 5:DAY=31 ;break;
case 6: DAY=30;break;
case 7:DAY=31 ;break;
case 8: DAY=31;break;
case 9: DAY=30;break;
case 10: DAY=31;break;
case 11:DAY=30 ;break;
case 12:DAY=31;break;
}
return DAY;
}
void AddmodifyWeek()//加星期
{
uchar i=0;
write_com(0x80+11);
for(i;i<4;i++)
{
write_date(tableWeek[weekChange++]);
delay(5);
}
if(weekChange==28)weekChange=0;
}
void MinusmodifyWeek()//减星期
{
uchar i=0;
write_com(0x80+11);
if(weekChange==0)weekChange=32; //判断开始的日期
for(i=8;i>0;i--)
weekChange--;
if(weekChange==-4)weekChange=24;
for(i;i<4;i++)
{
write_date(tableWeek[weekChange++]);
delay(5);
}
}
void addModifyDate()//加日期
{
if(selectWei==0)
year++; if(year==100)year=0;
if(selectWei==1)
month++;if(month==13)month=1;
if(selectWei==2)
day++; if(day>get_month())day=1;
if(selectWei==3)
AddmodifyWeek() ;
if(selectWei==4)
shi++; if(shi==24)shi=0;
if(selectWei==5)
fen++; if(fen==60)fen=0;
if(selectWei==6)
miao++; if(miao==60)miao=0;
}
void MinusModifyDate()///减日期
{
if(selectWei==0)
year--; if(year==-1)year=99;
if(selectWei==1)
month--;if(month<1)month=12;
if(selectWei==2)
day--; if(day<1)day=get_month();
if(selectWei==3)
MinusmodifyWeek() ;
if(selectWei==4)
shi--; if(shi==-1)shi=23;
if(selectWei==5)
fen--; if(fen==-1)fen=59;
if(selectWei==6)
miao--; if(miao==-1)miao=59;
}
void ShowModifyDate()//显示日期
{
if(selectWei==0)
write_diyihang(2,year);
if(selectWei==1)
write_diyihang(5,month);
if(selectWei==2)
write_diyihang(8,day);
if(selectWei==3)
;
if(selectWei==4)
write_sfm(4,shi);
if(selectWei==5)
write_sfm(7,fen);
if(selectWei==6)
write_sfm(10,miao);
}
void WeiSelect(uchar wei) //显光标
{
switch(wei)
{
case 0: write_com(0x80+0x01+4);break;
case 1: write_com(0x80+0x01+7);break;
case 2: write_com(0x80+0x01+10);break;
case 3: write_com(0x80+0x01+14);break;
case 4: write_com(0x80+0x40+6);break;
case 5:write_com(0x80+0x40+9);break;
case 6: write_com(0x80+0x40+12);break;
}
}
void keyscan()
{
//矩阵键盘当独立键盘用
if(s1==0)//按下键盘 暂停
{
delay(5);//延时消抖
if(s1==0)//再判断确实为0
{
while(!s1);//等待松手
TR0=0;//关定时器
write_com(0x0f);
WeiSelect(selectWei+1);
selectWei++;
if(selectWei==7)selectWei=0;
}
}
if(s2==0)//按下键盘 继续 加时间
{
delay(5);//延时消抖
if(s2==0)//再判断确实为0
{
while(!s2);
{addModifyDate();
ShowModifyDate();}
}
}
if(s3==0)//按下键盘 继续 减少时间
{
delay(5);//延时消抖
if(s3==0)//再判断确实为0
{
while(!s3);
{MinusModifyDate();
ShowModifyDate();}
}
}
if(s4==0)//按下键盘 继续
{
delay(5);//延时消抖
if(s4==0)//再判断确实为0
{
while(!s4);//等待松手
TR0=1;//开定时器
selectWei=-1;
write_com(0x0c);
}
}
}
void write_week() ///显示星期
{
uchar num1=0;
write_com(0x80+11);
for(weekSelect;num1<4;weekSelect++)
{
write_date(tableWeek[weekSelect]);
delay(5);num1++;
}
if(weekSelect==16)weekSelect=0;
}
void init()
{
uchar num;
selectDate=0;
selectWei =-1;
dula=0;
wela=0;
lcden=0;
wr=0;
fen=0;
miao=0;
shi=0;
month=1;
year=0;
day=1;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x01);
for(num=0;num<4;num++)
{
write_date(tableYear[num]);
delay(5);
}
for(num=0;num<3;num++)
{
write_date(tableMonth[num]);
delay(5);
}
for(num=0;num<3;num++)
{
write_date(tableDay[num]);
delay(5);
}
for(weekSelect=0;weekSelect<4;weekSelect++)
{
write_date(tableWeek[weekSelect]);
delay(5);
}
write_com(0x80+0x44);
for(num=0;num<12;num++)
{
write_date(tableTime[num]);
delay(5);
}
TMOD=0x01; //00000001
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//50000*1us=50ms
EA=1;
ET0=1;
TR0=1;
}
void main()
{
init();
while(1)
{
keyscan();
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256; //50000*1us=50ms
TL0=(65536-50000)%256;
count++;
if(count==18)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
fengming=0;
delay(2);
fengming=1;
delay(2);
if(shi==24)
{
shi=0;
day++;
write_week();
if(day>get_month())
{
day=1;
month++;
if(month>12)
{
month=1;
year++;
write_diyihang(2,year);
}
write_diyihang(5,month);
}
write_diyihang(8,day);
}
write_sfm(4,shi);
}
write_sfm(7,fen);
}
write_sfm(10,miao);
}
}