|
LCD1286程序,C語言- /*******************************************************
- 效果: 12864液晶和DS1302時鐘芯片共同實現萬年歷的功能
- 工作于:KX-1A開發板
- 作者: 科信電子工作室
- 說明: 由于前面程序代碼的注釋都比較詳細了,此萬年歷程序
- 可以說是對前面程序的大綜合,所以有些注釋沒有標注,有不懂
- 的地方可以參考前面的程序,敬請大家諒解。
- ********************************************************/
- #include<reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit RS=P2^0;
- sbit RW=P2^1;
- sbit EN=P2^2;
- sbit S=P1^0;
- sbit FUN=P1^4;
- sbit OK=P1^5;
- sbit INC=P1^6;
- sbit DEC=P1^7;
- sbit RST=P3^5;
- sbit SDA=P3^4;
- sbit SCL=P3^3;
- uchar hour=20;
- uchar min=30;
- uchar sec=10;
- uchar year=10;
- uchar mon=3;
- uchar date=6;
- uchar day=6;
- uchar flag=0;
- uchar num=0;
- uchar i=6;
- void delay(uint i)
- {
- uint j;
- for(;i>0;i--)
- for(j=0;j<125;j++);
- }
- void Write_Ds1302_Byte(uchar temp)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- SCL=0;
- SDA=temp&0x01;//只傳最后一位
- temp>>=1;
- SCL=1;
- }
- }
- void Write_Ds1302(uchar address,uchar dat)
- {
- RST=0;
- SCL=0;
- RST=1;
- Write_Ds1302_Byte(address);
- Write_Ds1302_Byte(dat);
- SCL=1;
- RST=0;
- }
- uchar Read_Ds1302(uchar address)
- {
- uchar i,temp=0x00;
- RST=0;
- SCL=0;
- RST=1;
- Write_Ds1302_Byte(address);
- for(i=0;i<8;i++)
- {
- temp>>=1;
- SCL=0;
- if(SDA)
- temp=temp|0x80;
- SCL=1;
- }
- RST=0;
- SDA=0;
- return temp;
- }
- void Check_Busy(void)
- {
- RW=1;//RW=1為讀
- RS=0;//RS=0為指令
- EN=1;
- while(P0&0X80);
- }
- void Write_com(uchar com)
- {
- //Check_Busy();
- RW=0;
- RS=0;
- P0=com;
- EN=1;
- delay(1);
- EN=0;
- }
- void Write_dat(uchar dat)
- {
- //Check_Busy();
- RW=0;
- RS=1;
- P0=dat;
- EN=1;
- delay(1);
- EN=0;
- }
- void Lcd_Pos(uchar Xpos,uchar Ypos)
- {
- uchar tmp;
- Xpos&=0x0f;
- Ypos&=0x03;
- tmp=Xpos;
- if(Ypos==0)
- tmp|=0x80;
- if(Ypos==1)
- tmp|=0x90;
- if(Ypos==2)
- tmp|=0x88;
- if(Ypos==3)
- tmp|=0x98;
- Write_com(tmp);
- }
- void Write_LCD_String(uchar x,uchar y,uchar *s)
- {
- Lcd_Pos(x,y);
- Lcd_Pos(x,y);
- while (*s!='\0')
- {
- Write_dat(*s);
- s++;
- delay(1);
- }
- }
- void LCD_Rst(void)
- {
- Write_com(0x30);//功能設定,基本指令
- Check_Busy();
- Write_com(0x01);//清屏指令
- Write_com(0x06);//光標移動設置
- Write_com(0x0c);//整體顯示,沒有光標,游標位置反白禁止
- delay(5);
- }
- void Write_day(uchar Sel)
- {
- switch (Sel)
- {
- case 1:Write_LCD_String(6,1,"一");break;
- case 2:Write_LCD_String(6,1,"二");break;
- case 3:Lcd_Pos(6,1);Write_dat(0xc8);Write_dat(0xfd);break;
- case 4:Write_LCD_String(6,1,"四");break;
- case 5:Write_LCD_String(6,1,"五");break;
- case 6:Write_LCD_String(6,1,"六");break;
- case 7:Write_LCD_String(6,1,"日");break;
- default :break;
- }
- }
- void Updat_Time(void)
- {
-
- Lcd_Pos(3,0);Write_dat(0x30+(year/10));Write_dat(0x30+(year%10));
- Lcd_Pos(0,1);Write_dat(0x30+(mon/10));Write_dat(0x30+(mon%10));
- Lcd_Pos(2,1);Write_dat(0x30+(date/10));Write_dat(0x30+(date%10));
- Lcd_Pos(0,2);Write_dat(0x30+(hour/10));Write_dat(0x30+(hour%10));
- Lcd_Pos(2,2);Write_dat(0x30+(min/10));Write_dat(0x30+(min%10));
- Lcd_Pos(4,2);Write_dat(0x30+(sec/10));Write_dat(0x30+(sec%10));
- Write_day(day);
- }
- void Write_Time(void)
- {
- Write_Ds1302(0x8e,0x00);
- Write_Ds1302(0x8c,(year/10)*16+year%10);
- Write_Ds1302(0x88,(mon/10)*16+mon%10);
- Write_Ds1302(0x86,(date/10)*16+date%10);
- Write_Ds1302(0x84,(hour/10)*16+hour%10);
- Write_Ds1302(0x82,(min/10)*16+min%10);
- Write_Ds1302(0x80,(sec/10)*16+sec%10);
- Write_Ds1302(0x8a,(day/10)*16+day%10);
- Write_Ds1302(0x8e,0x80);
- }
- void Read_Time(void)
- {
- year=(Read_Ds1302(0x8d)>>4)*10+Read_Ds1302(0x8d)%16;
- mon=(Read_Ds1302(0x89)>>4)*10+Read_Ds1302(0x89)%16;
- date=(Read_Ds1302(0x87)>>4)*10+Read_Ds1302(0x87)%16;
- hour=(Read_Ds1302(0x85)>>4)*10+Read_Ds1302(0x85)%16;
- min=(Read_Ds1302(0x83)>>4)*10+Read_Ds1302(0x83)%16;
- sec=(Read_Ds1302(0x81)>>4)*10+Read_Ds1302(0x81)%16;
- day=(Read_Ds1302(0x8b)>>4)*10+Read_Ds1302(0x8b)%16;
- Updat_Time();
- }
- void Set_Time(void)
- {
- if(FUN==0)
- {
- delay(10);
- if(FUN==0)
- {
- while(!FUN);
- flag=1;
- num++;
- if(num==8)
- num=1;
- }
- }
- if(flag)
- {
- if(num==1)
- {
- Lcd_Pos(0,2);
- Write_com(0x0d);
- if(INC==0)
- {
- delay(10);
- if(INC==0)
- {
- while(!INC);
- hour++;
- if(hour==24)
- hour=0;
- Updat_Time();
- }
-
- }
- if(DEC==0)
- {
- delay(10);
- if(DEC==0)
- {
- while(!DEC);
- hour--;
- if(hour==-1)
- hour=23;
- Updat_Time();
- }
- }
- }
- if(num==2)
- {
- Lcd_Pos(2,2);
- Write_com(0x0d);
- if(INC==0)
- {
- delay(10);
- if(INC==0)
- {
- while(!INC);
- min++;
- if(min==60)
- min=0;
- Updat_Time();
- }
-
-
- }
- if(DEC==0)
- {
- delay(10);
- if(DEC==0)
- {
- while(!DEC);
- min--;
- if(min==-1)
- min=59;
- Updat_Time();
- }
- }
- }
- if(num==3)
- {
- Lcd_Pos(4,2);
- Write_com(0x0d);
- if(INC==0)
- {
- delay(10);
- if(INC==0)
- {
- while(!INC);
- sec++;
- if(sec==60)
- sec=0;
- Updat_Time();
- }
- }
- if(DEC==0)
- {
- delay(10);
- if(DEC==0)
- {
- while(!DEC);
- sec--;
- if(sec==-1)
- sec=59;
- Updat_Time();
- }
- }
- }
- if(num==4)
- {
- Lcd_Pos(3,0);
- Write_com(0x0d);
- if(INC==0)
- {
- delay(10);
- if(INC==0)
- {
- while(!INC);
- year++;
- if(year==100)
- year=0;
- Updat_Time();
- }
- }
- if(DEC==0)
- {
- delay(10);
- if(DEC==0)
- {
- while(!DEC);
- year--;
- if(year==-1)
- sec=99;
- Updat_Time();
- }
- }
- }
- if(num==5)
- {
- Lcd_Pos(0,1);
- Write_com(0x0d);
- if(INC==0)
- {
- delay(10);
- if(INC==0)
- {
- while(!INC);
- mon++;
- if(mon==13)
- mon=1;
- Updat_Time();
- }
- }
- if(DEC==0)
- {
- delay(10);
- if(DEC==0)
- {
- while(!DEC);
- mon--;
- if(mon==0)
- mon=12;
- Updat_Time();
- }
- }
- }
- if(num==6)
- {
- Lcd_Pos(2,1);
- Write_com(0x0d);
- if(INC==0)
- {
- delay(10);
- if(INC==0)
- {
- while(!INC);
- date++;
- if(date==32)
- date=1;
- Updat_Time();
- }
- }
- if(DEC==0)
- {
- delay(10);
- if(DEC==0)
- {
- while(!DEC);
- date--;
- if(date==0)
- date=31;
- Updat_Time();
- }
- }
- }
- if(num==7)
- {
- Lcd_Pos(6,1);
- Write_com(0x0d);
- if(INC==0)
- {
- delay(10);
- if(INC==0)
- {
- while(!INC);
- day++;
- if(day==8)
- day=1;
- Updat_Time();
- }
- }
- if(DEC==0)
- {
- delay(10);
- if(DEC==0)
- {
- while(!DEC);
- day--;
- if(day==0)
- day=7;
- Updat_Time();
- }
- }
- }
- }
- if(OK==0)
- {
- delay(10);
- if(OK==0)
- {
- while(!OK);
- flag=0;
- num=0;
- Write_com(0x0c);
- Write_Time();
- }
- }
- }
- void Festival(void)
- {
- if (mon == 1 && date== 1 ) { Write_LCD_String(0,3,"Happy New Year!!"); }
- else
- if (mon == 1 && date== 28 ) { Write_LCD_String(0,3," 世界麻風日 "); }
- else
- if (mon == 2 && date== 2 ) { Write_LCD_String(0,3," 世界濕地日 "); }
- else
- if (mon == 2 && date== 13 ) { Write_LCD_String(0,3," 明天情人節了 "); }
- else
- if (mon == 2 && date== 14 ) { Write_LCD_String(0,3," 今天是情人節 "); }
- else
- if (mon == 3 && date== 1 ) { Write_LCD_String(0,3," 國際海豹日 "); }
- else
- if (mon == 3 && date== 3 ) { Write_LCD_String(0,3," 全國愛耳日 "); }
- else
- if (mon == 3 && date== 8 ) { Write_LCD_String(0,3," 3.8婦女節 "); }
- else
- if (mon == 3 && date== 12 ) { Write_LCD_String(0,3," 植樹節 "); }
- else
- if (mon == 3 && date== 14 ) { Write_LCD_String(0,3," 國際警察日 "); }
- else
- if (mon == 3 && date== 15 ) { Write_LCD_String(0,3," 消費者權益日 "); }
- else
- if (mon == 3 && date== 17 ) { Write_LCD_String(0,3," 國際航海日 "); }
- else
- if (mon == 3 && date== 21 ) { Write_LCD_String(0,3," 世界森林日 "); }
- else
- if (mon == 3 && date== 22 ) { Write_LCD_String(0,3," 世界水日 "); }
- else
- if (mon == 3 && date== 23 ) { Write_LCD_String(0,3," 世界氣象日 "); }
- else
- if (mon == 3 && date== 24 ) { Write_LCD_String(0,3,"世界防治結核病日"); }
- else
- if (mon == 4 && date== 1 ) { Write_LCD_String(0,3,"愚人節 小心上當"); }
- else
- if (mon == 4 && date== 7 ) { Write_LCD_String(0,3," 世界衛生日 "); }
- else
- if (mon == 4 && date== 8 ) { Write_LCD_String(0,3," 復活節 "); }
- else
- if (mon == 4 && date== 13 ) { Write_LCD_String(0,3," 黑色星期五 "); }
- else
- if (mon == 5 && date== 1 ) { Write_LCD_String(0,3," 勞動節 放假 "); }
- else
- if (mon == 5 && date== 4 ) { Write_LCD_String(0,3," 青年節 "); }
- else
- if (mon == 5 && date== 8 ) { Write_LCD_String(0,3," 世界紅十字日 "); }
- else
- if (mon == 5 && date== 12 ) { Write_LCD_String(0,3," 國際護士節 "); }
- else
- if (mon == 5 && date== 5 ) { Write_LCD_String(0,3,"近日注意母親節 "); }
- else
- if (mon == 5 && date== 15 ) { Write_LCD_String(0,3," 國際家庭日 "); }
- else
- if (mon == 5 && date== 31 ) { Write_LCD_String(0,3," 世界無煙日 "); }
- else
- if (mon == 6 && date== 1 ) { Write_LCD_String(0,3," 國際兒童節 "); }
- else
- if (mon == 6 && date== 5 ) { Write_LCD_String(0,3," 世界環境日 "); }
- else
- if (mon == 6 && date== 26 ) { Write_LCD_String(0,3," 國際禁毒日 "); }
- else
- if (mon == 6 && date== 6 ) { Write_LCD_String(0,3," 全國愛眼日 "); }
- else
- if (mon == 6 && date== 13 ) { Write_LCD_String(0,3,"近日注意父親節 "); }
- else
- if (mon == 6 && date== 15 ) { Write_LCD_String(0,3,"近日注意父親節 "); }
- else
- if (mon == 7 && date== 1 ) { Write_LCD_String(0,3,"香港回歸記念日 "); }
- else
- if (mon == 7 && date== 7 ) { Write_LCD_String(0,3,"抗日戰爭記念日 "); }
- else
- if (mon == 7 && date== 11 ) { Write_LCD_String(0,3," 世界人口日 "); }
- else
- if (mon == 8 && date== 1 ) { Write_LCD_String(0,3," 八一建軍節 "); }
- else
- if (mon == 8 && date== 8 ) { Write_LCD_String(0,3," 中國男子節 "); }
- else
- if (mon == 8 && date== 15 ) { Write_LCD_String(0,3,"抗戰勝利記念日 "); }
- else
- if (mon == 9 && date== 10 ) { Write_LCD_String(0,3," 中國教師節 "); }
- else
- if (mon == 9 && date== 18 ) { Write_LCD_String(0,3,"九·一八事變記念"); }
- else
- if (mon == 9 && date== 20 ) { Write_LCD_String(0,3," 國際愛牙日 "); }
- else
- if (mon == 9 && date== 27 ) { Write_LCD_String(0,3," 世界旅游日 "); }
- else
- if (mon == 10 && date== 1 ) { Write_LCD_String(0,3," 中國國慶節 "); }
- else
- if (mon == 10 && date== 4 ) { Write_LCD_String(0,3," 世界動物日 "); }
- else
- if (mon == 10 && date== 24 ){ Write_LCD_String(0,3," 聯合國日 "); }
- else
- if (mon == 10 && date== 12 ){ Write_LCD_String(0,3,"明天國際教師節 "); }
- else
- if (mon == 10 && date== 13 ){ Write_LCD_String(0,3," 國際教師節 "); }
- else
- if (mon == 11 && date== 10 ){ Write_LCD_String(0,3," 世界青年節 "); }
- else
- if (mon == 11 && date== 17 ){ Write_LCD_String(0,3," 世界學生節 "); }
- else
- if (mon == 12 && date== 1 ) { Write_LCD_String(0,3," 世界艾滋病日 "); }
- else
- if (mon == 12 && date== 23 ){ Write_LCD_String(0,3," 明晚平安夜 "); }
- else
- if (mon == 12 && date== 24 ){ Write_LCD_String(0,3," 今晚平安夜 "); }
- else
- if (mon == 12 && date== 25 ){ Write_LCD_String(0,3," 圣誕快樂 "); }
- else
- if (mon == 12 && date== 31 ){ Write_LCD_String(0,3," 明日新年 "); }
- else
- {
- if(hour >= 4 && hour< 6 ) { Write_LCD_String(0,3,"★★__▲▲__凌晨"); }
- if(hour >= 6 && hour< 8 ) { Write_LCD_String(0,3,"☆○__▲△__早晨"); }
- if(hour >= 8 && hour< 12 ) { Write_LCD_String(0,3,"__●__▲▲__上午"); }
- if(hour == 12) { Write_LCD_String(0,3,"____▲●▲__中午"); }
- if(hour >= 13 && hour< 18 ){ Write_LCD_String(0,3,"__▲▲__●__下午"); }
- if(hour >= 18 && hour< 22 ){ Write_LCD_String(0,3,"△▲__●☆__晚上"); }
- if(hour >= 22 && hour<= 23 ){ Write_LCD_String(0,3,"△▲__★☆__夜里"); }
- if(hour >= 0 && hour< 4 ) { Write_LCD_String(0,3,"__★▲▲★__深夜"); }
- }
- }
- void System_Init(void)
- {
- S=0;
- LCD_Rst();
- Write_LCD_String(0,1,"系統初始化");
- Lcd_Pos(5,1);
- while(i--)
- {
- Write_dat(0x3e);
- delay(300);
- }
- Write_com(0x01);
- Write_LCD_String(0,1,"您好!歡迎使用!");
- delay(1500);
- Write_com(0x01);
- Write_LCD_String(2,0,"2010年");
- Write_LCD_String(0,1,"01月18日星期一");
- Write_LCD_String(0,2,"10時17分30秒");
- }
- void main(void)
- {
- System_Init();
- Write_Time();
- while(1)
- {
- Set_Time();
- if(!flag)
- {
- Read_Time();
- Festival();
- }
-
- }
- }
- //***************************GND**************************************
復制代碼
|
-
-
12864.rar
2018-6-11 11:19 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
3.06 KB, 下載次數: 64, 下載積分: 黑幣 -5
lcd
|