|
该设计的时间和星期可以正常显示,但是年份没有具体的平年闰年月份算法,所以并没有真正实现万年历,仅供参考,也欢迎大家完善该代码。
- #include<reg51.h>
- #include<lcd1602.h>
- #include<aj.h>
- //#include<ds18b20.h>
- #include<temp.h>
- //#include<sound.h>
- #include<stdlib.h>
- unsigned char datas[] = { 0, 0}; //定义数组
- uchar code digit[]={"0123456789"};
- uchar count;
- void LcdDisplay(int);
- void clock();
- void main()
- {
- P1=0xf0;
- lcdinitiata();
- TMOD=0X10; //使用T1的方式1定时
- TH1=(65536-50000)/256; //
- TL1=(65536-50000)%256;
- EA=1; //开总中断
- ET1=1; //允许定时器T1中断
- TR1=1; //启动定时器T1
- count=0;
- s=50;
- m=10;
- h=10;
- d=24;
- w=1;
- n=6;
- y=2019;
- z=12;
- x=12;
- writeaddress(0x04) ;
- writedata('-');
- writeaddress(0x07) ;
- writedata('-');
- writeaddress(0x42) ;
- writedata(':');
- writeaddress(0x45) ;
- writedata(':');
- writeaddress(0x4c) ;
- writedata(':');
- beep=0;
- writeinrtuction(0x80+0x0f); //写地址 80表示初始地址
- writedata(0xdf);
- while(1)
- {
- displayyear(); //年
- delay_ms(5);
- displaymonth(); //月
- delay_ms(5);
- displaydata(); //日
- delay_ms(5);
- displayweek(); //周
- delay_ms(5);
- displayhour(); //时
- delay_ms(5);
- displaymin(); //分
- delay_ms(5);
- displaysec(); //秒
- delay_ms(5);
- displayzhour(); //闹钟时
- delay_ms(5);
- displayzmin(); //闹钟分
- key_detect();
- LcdDisplay(Ds18b20ReadTemp);
- if(h==z&&m==x)
- {
- clock();
- }
- }
- }
- void displayyear() //显示年
- {
- uchar i,j,o,p;
- i=y/1000;
- j=y%1000/100;
- o=y%100/10;
- p=y%10;
- writeaddress(0x00) ;
- writedata(digit[i]);
- writedata(digit[j]);
- writedata(digit[o]);
- writedata(digit[p]);
- }
- void displaymonth() //显示月
- {
- uchar i,j;
- i=n/10;
- j=n%10;
- writeaddress(0x05) ;
- writedata(digit[i]);
- writedata(digit[j]);
- }
- void displayweek() //显示周
- {
- uchar i;
- i=w/1;
- writeaddress(0x0b) ;
- writedata(digit[i]);
- }
- void displaydata() //显示日
- {
- uchar i,j;
- i=d/10;
- j=d%10;
- writeaddress(0x08) ;
- writedata(digit[i]);
- writedata(digit[j]);
- }
- void displayhour() //显示时
- {
- uchar i,j;
- i=h/10;
- j=h%10;
- writeaddress(0x40) ;
- writedata(digit[i]);
- writedata(digit[j]);
- }
- void displaymin() // 显示分
- {
- uchar i,j;
- i=m/10;
- j=m%10;
- writeaddress(0x43) ;
- writedata(digit[i]);
- writedata(digit[j]);
- }
- void displaysec() // 显示秒
- {
- uchar i,j;
- i=s/10;
- j=s%10;
- writeaddress(0x46) ;
- writedata(digit[i]);
- writedata(digit[j]);
- }
- void LcdDisplay(int temp) //lcd显示
- {
- float tp;
- /* temp=temp-1;
- temp=~temp; */
- tp=temp;
- temp=tp*0.0625*100+0.5;
- //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
- //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
- //算由?.5,还是在小数点后面。
- datas[0] = temp % 10000 / 1000;
- datas[1] = temp % 1000 / 100;
- writeinrtuction(0x80+0x0d); //写地址 80表示初始地址
- writedata('0'+datas[0]); //十位
- writeinrtuction(0x80+0x0e); //写地址 80表示初始地址
- writedata('0'+datas[1]); //个位
- }
- void displayzhour() //显示闹钟时
- {
- uchar i,j;
- i=z/10;
- j=z%10;
- writeaddress(0x4a) ;
- writedata(digit[i]);
- writedata(digit[j]);
- }
- void displayzmin() // 显示闹钟分
- {
- uchar i,j;
- i=x/10;
- j=x%10;
- writeaddress(0x4d) ;
- writedata(digit[i]);
- writedata(digit[j]);
- }
- void clock()
- {
- if((h == z) || (m == x))
- {
- beep = ~beep;
- }
- else
- {
- beep=1;
- }
- }
- void t1_int() interrupt 3 //T1中断方式
- {
- count++;
- if(count==20)
- {
- count=0;
- s++;
- }
- if(s==60)
- {
- s=0;
- m++;
- }
- if(m==60)
- {
- m=0;
- h++;
- }
- if(h==24)
- {
- h=0;
- w++;
- }
- if(w==8)
- {
- w=1;
- d++;
- }
- if(d > 31)
- {
- d = 1;
- n++;
- }
- if(n > 13)
- {
- n = 1;
- y++;
- }
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- }
复制代码
|
|