|
該設(shè)計(jì)的時(shí)間和星期可以正常顯示,但是年份沒有具體的平年閏年月份算法,所以并沒有真正實(shí)現(xiàn)萬年歷,僅供參考,也歡迎大家完善該代碼。
- #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}; //定義數(shù)組
- uchar code digit[]={"0123456789"};
- uchar count;
- void LcdDisplay(int);
- void clock();
- void main()
- {
- P1=0xf0;
- lcdinitiata();
- TMOD=0X10; //使用T1的方式1定時(shí)
- TH1=(65536-50000)/256; //
- TL1=(65536-50000)%256;
- EA=1; //開總中斷
- ET1=1; //允許定時(shí)器T1中斷
- TR1=1; //啟動(dòng)定時(shí)器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(); //時(shí)
- delay_ms(5);
- displaymin(); //分
- delay_ms(5);
- displaysec(); //秒
- delay_ms(5);
- displayzhour(); //鬧鐘時(shí)
- 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() //顯示時(shí)
- {
- 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;
- //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
- //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
- //算由?.5,還是在小數(shù)點(diǎn)后面。
- 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]); //個(gè)位
- }
- void displayzhour() //顯示鬧鐘時(shí)
- {
- 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;
- }
復(fù)制代碼
|
-
-
電子表.zip
2021-2-19 10:34 上傳
點(diǎn)擊文件名下載附件
95.71 KB, 下載次數(shù): 17
|