- //我的這個程序怎么實現用串口代替按鍵修改當前時間???
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit rs=P2^5; //定義1602液晶rs端
- sbit rw=P2^6; //定義1602液晶rw端
- sbit lcden=P2^7; //定義1602液晶lcden端
- sbit s2=P3^2; //定義功能鍵
- sbit s3=P3^3; //定義增大鍵
- sbit s4=P3^4; //定義減小鍵
- uchar count,s1num;
- char miao,shi,fen;
- uchar code table[]=" 2018-1-7MON "; //定義初始上電時液晶默認顯示狀態
- uchar code table1[]=" 00:00:00 ";
- //Read_BursRam(&Read_Flag,1);
- //if(Read_Flag!= 1)
- //{
- // Write_Data(0x90,0xaa);
- // Write_BurstClock(Cur_Time);
- // Write_BurstRam(&Clock_Flag,1);
- // Write_Data(0x8e,0x80);
- //}
- void delay(uint z) //延時函數
- {
- uint x,y;
- for(x=z;x>0;x--);
- for(y=110;y>0;y--);
- }
- void write_com(uchar com) //液晶寫命令函數
- {
- rs=0;
- lcden=0;
- P0=com;
- delay(20);
- lcden=1;
- delay(20);
- lcden=0;
- }
- void write_date(uchar date) //液晶寫數據函數
- {
- rs=1;
- lcden=0;
- P0=date;
- delay(20);
- lcden=1;
- delay(20);
- lcden=0;
- }
- void init() //初始化函數
- {
- uchar num;
- lcden=0;
- rw=0;
- write_com(0x38); //初始化1602液晶
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- write_com(0x80); //設置顯示初始坐標
- for(num=0;num<15;num++)
- {
- write_date(table[num]);
- delay(20);
- }
- write_com(0x80+0x40);
- for(num=0;num<12;num++)
- {
- write_date(table1[num]);
- delay(20);
- }
- TMOD=0x01; //設置定時器0工作模式1
- TH0=(65536-50000)/256; //定時器裝初值
- TL0=(65536-50000)%256;
- EA=1; //開總中斷
- ET0=1; //開定時器0中斷
- TR0=1; //啟動定時器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 keyscan() //按鍵掃描函數
- {
- if(s2==0)
- {
- delay(20);
- if(s2==0) //確認功能鍵被按下
- {
- s1num++; //功能鍵按下次數記錄
- while(!s2); //確認釋放
- if(s1num==1) //第一次被按下時
- {
- TR0=0; //關閉定時器
- write_com(0x80+0x40+10); //功能鍵作用在秒
- write_com(0x0f); //光標閃爍
- }
- }
- if(s1num==2) //第二次被按下時在分
- {
- write_com(0x80+0x40+7);
- }
- if(s1num==3) //第三次被按下時在時
- {
- write_com(0x80+0x40+4);
- }
- if(s1num==4) //第四次被按下,清零
- {
- s1num=0;
- write_com(0x0c);
- TR0=1; //啟動定時器時鐘開始走
- }
- }
- if(s1num!=0) //當功能鍵被按下后增大鍵減小鍵才可以發揮作用
- {
- if(s3==0)
- {
- delay(20);
- if(s3==0) //增大鍵被按下
- {
- while(!s2); //按鍵釋放
- if(s1num==1) //若功能鍵第一次被按下
- {
- miao++; //秒加一
- if(miao==60) //秒滿60后清零
- miao=0;
- write_sfm(10,miao); //每調節一次液晶顯示一次
- write_com(0x80+0x40+10); //顯示位置重新回到調節處
- }
- if(s1num==2)
- {
- fen++;
- if(fen==60)
- fen=0;
- write_sfm(7,fen);
- write_com(0x80+0x40+7);
- }
- if(s1num==3)
- {
- shi++;
- if(shi==24)
- shi=0;
- write_sfm(4,shi);
- write_com(0x80+0x40+4);
- }
- }
- }
- if(s4==0)
- {
- delay(20);
- if(s4==0)
- {
- while(!s3);
- if(s1num==1)
- {
- miao--; //調整秒減一
- if(miao==-1) //減到負數則重新設置為59
- miao=59;
- write_sfm(10,miao);
- write_com(0x80+0x40+10);
- }
- if(s1num==2)
- {
- fen--;
- if(fen==-1)
- fen=59;
- write_sfm(7,fen);
- write_com(0x80+0x40+7);
- }
- if(s1num==3)
- {
- shi--;
- if(shi==-1)
- shi=23;
- write_sfm(4,shi);
- write_com(0x80+0x40+4);
- }
- }
- }
- }
- }
- void main()
- {
- // Ds1302Init();
- init();
- while(1)
- {
- keyscan();
- }
- }
- void timer0() interrupt 1 //定時器0中斷服務程序
- {
- TH0=(65536-50000)/256; //再次裝定時器初值
- TL0=(65536-50000)%256;
- count++; //中斷次數累加
- if(count==18)
- {
- count=0;
- miao++;
- if(miao==60)
- {
- miao=0;
- fen++;
- if(fen==60)
- {
- fen=0;
- shi++;
- if(shi==24)
- {
- shi=0;
- }
- write_sfm(4,shi);
- }
- write_sfm(7,fen);
- }
- write_sfm(10,miao);
- }
- }
復制代碼
|