程序簡單清晰,有疑問帖子留言回復!
單片機源程序如下:
- #include "reg51.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit RS=P2^6;
- sbit RW=P2^5;
- sbit EP=P2^7;
- sbit K1=P3^1;
- sbit K2=P3^0;
- sbit K3=P3^2;
- uchar num,t;
- uchar K1num;
- char s,f,m;
- uchar code table []="2017-05-21 MON";
- uchar code table1 []=" 00: 00: 00 AM";
- uchar code table2 []="重慶今日 多云";
- uchar code table3 []="東方 20-25 *C";
- void init1();
- void delay(uint k)
- {
- uint i,j;
- for(i=k;i>0;i--)
- for(j=110;j>0;j--);
- }
- void write(uchar com)
- {
- RS=0;
- RW=0;
- P0=com;
- delay(5);
- EP=1;
- delay(5);
- EP=0;
- }
- void read(uchar date)
- {
- RS=1;
- RW=0;
- P0=date;
- delay(5);
- EP=1;
- delay(5);
- EP=0;
- }
- void init()
- {
- RS=0;
- RW=0;
- EP=0;
- write(0x38);
- write(0x0c);
- write(0x06);
- write(0x01);
- write(0x80);
- for(num=0;num<14;num++)
- {
- read(table[num]);
- delay(20);
- }
- write(0x90);
- for(num=0;num<11;num++)
- {
- read(table2[num]);
- delay(20);
- }
- write(0x98);
- for(num=0;num<14;num++)
- {
- read(table3[num]);
- delay(20);
- }
- write(0x88);
- for(num=0;num<16;num++)
- {
- read(table1[num]);
- delay(20);
- }
- }
- void write_sfm(uchar add,uchar date)
- {
- uchar shi,ge;
- shi=date/10;
- ge=date%10;
- write(0x83+add);
- read(0x30+shi);
- read(0x30+ge);
- }
- void key()
- {
- if(K1==0)
- {
- delay(5);
- if(K1==0)
- {
- K1num++;
- while(!K1);
- if(K1num==1)
- {
- TR0=0;
- write(0x83+10); //為啥子是 0x83 ???
- write(0x0f); //重新規定,顯示光標
- }
- }
- if(K1num==2)
- {
- write(0x83+8);
- }
- if(K1num==3)
- {
- write(0x83+6);
- }
- if(K1num==4)
- {
- K1num=0;
- write(0x0c); //無光標 ,不閃爍
- TR0=1;
- }
- }
- if(K1num!=0)
- {
- if(K2==0)
- {
- delay(5);
- if(K2==0)
- {
- while(!K2);
- if(K1num==1)
- {
- m++;
- if(m==60)
- m=0;
- write_sfm(10,m);
- write(0x83+10);
- }
- if(K1num==2)
- {
- f++;
- if(f==60)
- f=0;
- write_sfm(8,f);
- write(0x83+8);
- }
- if(K1num==3)
- {
- s++;
- if(s==23)
- s=0;
- write_sfm(6,s);
- write(0x83+6);
- }
- }
- }
- if(K3==0)
- {
- delay(5);
- if(K3==0)
- {
- while(!K3);
- if(K1num==1)
- {
- m--;
- if(m==1)
- m=59;
- write_sfm(10,m);
- write(0x83+10);
- }
- if(K1num==2)
- {
- f--;
- if(f==1)
- f=59;
- write_sfm(8,f);
- write(0x83+8);
- }
- if(K1num==3)
- {
- s--;
- if(s==1)
- m=23;
- write_sfm(6,s);
- write(0x83+6);
- }
- }
- }
- }
- }
- void main()
- {
- init();
- init1();
- while(1)
- {
- key();
- }
- }
- void init1()
- {
- TMOD=0x01;
- EA=1;
- ET0=1;
- TR0=1;
- TH0=(65636-50000)/256;
- TL0=(65636-50000)%256;
- }
- void time0() interrupt 1
- {
- TH0=(65636-50000)/256;
- TL0=(65636-50000)%256;
- t++;
- if(t==18) //與上面的50000有一秒左右
- {
- t=0;
- m++;
- if(m==60)
- {
- m=0;
- f++;
- if(f==60)
- {
- f=0;
- s++;
- if(s==24)
- {
- s=0;
- }
- write_sfm(6,s);
- }
- write_sfm(8,f);
- }
- write_sfm(10,m);
- }
- }
復制代碼
所有資料51hei提供下載:
12864顯示可調時鐘天氣日歷.zip
(41.23 KB, 下載次數: 26)
2018-7-19 19:37 上傳
點擊文件名下載附件
源程序及代碼 下載積分: 黑幣 -5
|