用2.2寸SPI接口的彩色TFT液晶DIY個彩屏萬年歷,帶24節氣及節日。
有位壇友前些時說DIY個彩屏萬年歷,到現在還沒見影蹤。我來放一個用2.2寸SPI接口的彩色TFT液晶制作的萬年歷,這個萬年歷是下一個制作的時鐘部份以下是圖片,本制作是用STC的單片機,采用它的硬件SPI接口,p10接個10K的NTC測溫電阻,上接10k電阻VCC,下接10K電阻,10K電阻下接地。{vcc10k+10K的NTC測溫電阻+p10,p10+10K電阻下接地,各腳的接法在程序有注悉,可以在程序頭更改顯示的顏色。開關的使用在程序也有注釋。由于程序剛寫完就發貼,只簡單測試,所以可能用BUG。
單片機用STC15W4K58s4,晶振用22.1M
//用單片機的硬件SPI接口,液晶是2.2寸SPI接口, 分辨率:176*220, 驅動IC:ILI9225
//LCD接口與單片機接法 LCD 單片機
// CLK P1^5
// SDI P1^3
// RS P0^4
// RET P0^1
// CS P0^0
// LED VCC
//
//DS3231與單片機接法 SCL接P0^3, SDA接 P0^2
//開關P23,長按進入調整操作,短按改變調整項目,再長按保存參數,開關P25為參數減,開關P24為參數加
IMG_20171013_150045.jpg (59.97 KB, 下載次數: 161)
下載附件
2017-10-13 15:33 上傳
IMG_20171013_150028.jpg (42.26 KB, 下載次數: 139)
下載附件
2017-10-13 15:33 上傳
IMG_20171013_145942.jpg (91.51 KB, 下載次數: 145)
下載附件
2017-10-13 15:33 上傳
IMG_20171013_145723.jpg (48.64 KB, 下載次數: 142)
下載附件
2017-10-13 15:33 上傳
IMG_20171013_145706.jpg (39.96 KB, 下載次數: 145)
下載附件
2017-10-13 15:33 上傳
IMG_20171013_145544.jpg (77.84 KB, 下載次數: 137)
下載附件
2017-10-13 15:33 上傳
IMG_20171013_145322.jpg (60.06 KB, 下載次數: 135)
下載附件
2017-10-13 15:33 上傳
IMG_20171013_145308.jpg (79.15 KB, 下載次數: 163)
下載附件
2017-10-13 15:33 上傳
IMG_20171013_145219.jpg (82.16 KB, 下載次數: 131)
下載附件
2017-10-13 15:33 上傳
IMG_20171013_145200.jpg (64.24 KB, 下載次數: 138)
下載附件
2017-10-13 15:33 上傳
原理圖:
0.png (114.44 KB, 下載次數: 145)
下載附件
2017-10-13 17:05 上傳
1507878710560.jpg (99.54 KB, 下載次數: 133)
下載附件
2017-10-13 15:33 上傳
單片機源程序如下:
- //彩屏萬年歷,帶節日節氣農歷。
- //單片機用STC15W4K58s4,晶振用22.1M
- //用單片機的硬件SPI接口,液晶是2.2寸SPI接口, 分辨率:176*220, 驅動IC:ILI9225
- //LCD接口與單片機接法 LCD 單片機
- // CLK P1^5
- // SDI P1^3
- // RS P0^4
- // RET P0^1
- // CS P0^0
- // LED VCC
- //
- //DS3231與單片機接法 SCL接P0^3, SDA接 P0^2
- //開關P23,長按進入調整操作,短按改變調整項目,再長按保存參數,開關P25為參數減,開關P24為參數加
- #include <STC15W4Kxx.h>
- #include <main.h>
- #include <intrins.h>
- #define RED 0xf800
- #define GREEN 0x07e0
- #define BLUE 0x001f
- #define WHITE 0xffff
- #define BLACK 0x0000
- #define YELLOW 0xFFE0
- #define GRAY0 0xEF7D //灰色0 3165 00110 001011 00101
- #define GRAY1 0x8410 //灰色1 00000 000000 00000
- #define GRAY2 0x4208 //灰色2 1111111111011111
- //以下可以根據自己的喜好改變顏色
- #define BACKcolor 0xEF70 //背境色
- #define TIMEcolor 0xf800 //時鐘色
- #define RILIcolor 0x001f //日歷色
- #define WEEK67color 0xf800 //星期67色
- #define WEEK67BACKcolor 0xffff //星期67底色
- #define WEEK15color 0x0000 //星期15色
- #define WEEK15BACKcolor 0xffff //星期15底色
- #define WEEKcolor 0x0000 //星期表文字色
- #define WEEKBACKcolor 0xEF70 //星期表文字底色
- #define WEEKSELcolor 0xf800 //星期表選中色
- sbit BINmanA=P2^5;
- sbit BINmanB=P2^4;//編碼
- sbit KEY1=P2^3;
- unsigned char jisu,usbjisu,jisu2;
- bit kong05,kong02,time05s,time02s,t_1224ji,taosaxi;
- unsigned char t_hour,t_min,t_sec,t_xingqi,t_year,t_moon, t_date,t_temp;
- unsigned char t_hourold,t_minold,t_secold,t_xingqiold,t_yearold,t_moonold, t_dateold,t_tempold;//由于LCD過慢,所以沒變化就不刷新。
- unsigned char panmavol, keyval,oldkey;
- unsigned int keyjixu;
- unsigned char disppagevol,timetaovol,taosaxivol;
- unsigned int TEMPnow;
- bit panmaoldA=1,panmaoldB=1;
- //外部引用農歷
- extern void Conversion(bit c,unsigned char year,unsigned char month,unsigned char day);
- extern data unsigned char year_moon,month_moon,day_moon;
- void delay(unsigned int t) //長延時程序,延時t毫秒,STC 1T單片機11.0592M晶振I值為648,22.1I值為1298,12MI值為705,27.648M I值為1622。
- {
- unsigned int i;
- while(t--)
- {
- for(i=1298;i>0;i--);
- }
- }
- void delay1() //
- {
- unsigned int i;
- for(i=340;i>0;i--);
-
- }
- /*********************讀取時間**********************/
- void Readtime()
- {
- unsigned char temppp;//需把BCD碼轉為十進制,方便處理。
- temppp=I2CReadAdd(0x00);//秒
- t_sec=(temppp/16)*10+temppp%16;
- temppp=I2CReadAdd(0x01);//分
- t_min=(temppp/16)*10+temppp%16;
- temppp=I2CReadAdd(0x02); //時
- t_hour=(temppp/16)*10+temppp%16;
- //t_xingqi=I2CReadAdd(0x03);//星期
- temppp=I2CReadAdd(0x04); //日
- t_date=(temppp/16)*10+temppp%16;
- temppp=I2CReadAdd(0x05); //月
- t_moon=(temppp/16)*10+temppp%16;
- temppp=I2CReadAdd(0x06); //年
- t_year=(temppp/16)*10+temppp%16;
- t_temp=I2CReadAdd(0x11);//溫度
-
- //t_xingqi= PGday(2000+t_year,t_moon,t_date);//星期計算,
- //Conversion(0,((t_year/10)*16+t_year%10),((t_moon/10)*16+t_moon%10),((t_date/10)*16)+t_date%10); //注意,輸入的是BCD碼,算出來的也是BCD碼,入數是要注意。
- }
- //======================EEPROW偏程==============================
- //寫字節時,可以將原有數據中的1改為0,無法將0改為1,只能使用擦除命令將0改為1
- //應注意,擦除命令會將整個扇區擦除
- //由于擦除會將整個扇區擦除,為了方便寫,所以這里用第二扇區存第一屏的狀態,
- //第三扇區存定時1的5個時間,每個時間有啟用、開時間、關時間、星期(8b)
- //第四扇區存定時6-10,第5扇區存溫度值,
- // 第二扇區地址0x0200-0x03ff,0x0400-0x05ff,0x0600-0x07ff,0x0800-0x09ff.
- void IAPIDLE()
- {
- IAP_CMD = 0; //關閉令,保護
- IAP_CONTR = 0; //關EEPROM,保護
- IAP_TRIG = 0;
- IAP_ADDRL = 0; //設置讀取地址的低字節,地址改變才需要設置
- IAP_ADDRH = 0X80; //設置讀取地址的高字節,地址改變才需要設置
- }
- unsigned char readEEP(unsigned int adddata)
- { //讀取
- unsigned char eerdata;
- IAP_CONTR=0X83;//設置等待時間,1MHz以下取7,2M以下取6,3M取5,6M取4,12M取3,20M取2,24M取1,30M取0,前導1表示許檔IAP
- IAP_CMD = 1; //讀取值1,寫取2,擦除取3,擦除時按所在字節整個扇區攛除
- IAP_ADDRL = adddata; //設置讀取地址的低字節,地址改變才需要設置
- IAP_ADDRH = adddata>>8; //設置讀取地址的高字節,地址改變才需要設置
- IAP_TRIG = 0x5A; //先送5A
- IAP_TRIG = 0xA5; //先送5A再送A5立即觸發
- _nop_();
- eerdata=IAP_DATA;
- IAPIDLE();
- return eerdata;
- }
- void writeEEP(unsigned int adddata, unsigned char eerdata)
- {//寫入
- IAP_CONTR=0X83;//設置等待時間,
- IAP_CMD = 2; //讀取值1,寫取2,擦除取3,擦除時按所在字節整個扇區攛除
- IAP_ADDRL = adddata; //設置讀取地址的低字節,地址改變才需要設置
- IAP_ADDRH = adddata>>8; //設置讀取地址的高字節,地址改變才需要設置
- IAP_DATA= eerdata;//傳入數據
- IAP_TRIG = 0x5A; //先送5A
- IAP_TRIG = 0xA5; //先送5A再送A5立即觸發
- _nop_();
- IAPIDLE();
- }
- void eraseEEP(unsigned int adddata)
- { //擦除
- IAP_CONTR=0X83;//設置等待時間,
- IAP_CMD = 3; //讀取值1,寫取2,擦除取3,擦除時按所在字節整個扇區攛除
- IAP_ADDRL = adddata; //設置讀取地址的低字節,地址改變才需要設置
- IAP_ADDRH = adddata>>8; //設置讀取地址的高字節,地址改變才需要設置
- IAP_TRIG = 0x5A; //先送5A
- IAP_TRIG = 0xA5; //先送5A再送A5立即觸發
- _nop_();
- IAPIDLE();
- }
- void writeDAT()
- {
- //unsigned char i;
- eraseEEP(0x0200);
- writeEEP(0x0200, t_1224ji);//24小時制,0為24小時,1為12小時制
-
-
- }
- void sysintEEP()
- {
- //unsigned char i;
- t_1224ji=readEEP(0x0200);
-
-
- }
- //以下為AD檢測
- void ADCINT()
- {
-
- P1ASF=0x01;//設置 P1低2位為AD口,根據實際設置。
- ADC_RES=0;//ad清0
- //AUXR1=0x04;//設置數據方式,低8位+高2位方式,易于運算。
- CLK_DIV=0X20;//由于408AS與204E不同,需寫成這。
- delay(1);
- }
- /*void ADCINT1()
- {//這個主要用于讀內部第九路AD,是1.9V的基準
- P1ASF=0x00;//設置 P1低2位為AD口,根據實際設置。
- ADC_RES=0;//ad清0
- //AUXR1=0x04;//設置數據方式,低8位+高2位方式,易于運算。
- CLK_DIV=0X20;//由于408AS與204E不同,需寫成這。
- delay(1);
- }*/
- unsigned int ADCwrite(unsigned ch)
- { //由于所檢測的電壓不用快,所以采用查詢或延時法,沒用中斷法。 ch值從0-7,對應為P10-P17
- unsigned int x;
- ADC_CONTR=0x88+ch;//設置啟動 ,用慢速采集
- //查詢法。查詢是否完成AD,由于是單片機內的,如出錯單片機也出錯,所以沒做跳開處理。
- while ( !(ADC_CONTR & 0x10) );//等待A/D轉換結束(ADC_FLAG==0)
- ADC_CONTR &= 0xE7; //11100111,置ADC_FLAG=0清除結束標記, 置ADC_START=0關閉A/D 轉換
- //delay(1);//延時法。由于設置及晶振的原因,大約為20US完成過程。這里延時1MS
- x=ADC_RES*256+ADC_RESL;
- return x;
- }
- //AD采集
- void nowtempAD()
- {//采用采集10次取平均值,
- unsigned char x;
- TEMPnow=0;
- for(x=0;x<10;x++)//采集10次。
- {
- TEMPnow=TEMPnow+ADCwrite(0);
- delay1();
- }
-
- //以下為計算
-
- for(x=0;x<110;x++)//查表計算室溫
- {
- if( (TEMPnow/10)<=temppiao[x]) break;//并且退出查表
- }
- TEMPnow=x-11;
- if(TEMPnow>99)TEMPnow=99;
- }
- unsigned char jieqijisuan(unsigned char yeardat,unsigned char moondat,unsigned char daydat)
- {//參數1為年值,2為月,3為日
- unsigned char k=0;
- if(daydat==jieqi[yeardat*24+(moondat-1)*2])k=(moondat-1)*2+1;
- if(daydat==jieqi[yeardat*24+(moondat-1)*2+1])k=(moondat-1)*2+2;
- return k;
- }
- void jieqidisp()
- { //顯示判斷方法,先判斷是不是節日,以農歷節日優先于公歷節日,
- //如不是節日,就判斷是不是24節氣的前3天內,如是就顯示節氣,如不是就顯示農歷。
- unsigned char jj,tmpe;
- jj=0;//作為顯示優先狀態字
- //以下組合文字,先節日,再24節氣,再農歷。
- //農歷1月1,1月15,5月5,8月15,9月9 分別為春節元宵節端午節中秋節重陽節
- //公歷 1月1, 2月14, 3月8, 5月1, 5月4, 6月1, 7月1, 8月1, 9月10, 10月1, 12月25
- // 元旦 情人節 婦女節 勞動節 青年節 兒童節 建黨節 建軍節 教師節 國慶節 圣誕節
- if(month_moon==18&&day_moon==41)// 12月29春節 農歷節日優先,農歷以BCD碼顯示
- {//顯示 廿九
-
- disp16x16(72,104,&dispjieri,43,RILIcolor,BACKcolor);
- disp16x16(72,120,&dispjieri,41,RILIcolor,BACKcolor);
- jj=1;
- }
- if(month_moon==18&&day_moon==48)// 春節 12月30農歷節日優先,農歷以BCD碼顯示
- {//顯示 年卅
- disp16x16(72,104,&DISPdat16x16,2,RILIcolor,BACKcolor);
- disp16x16(72,120,&dispjieri,44,RILIcolor,BACKcolor);
- jj=1;
- }
- if(month_moon==1&&day_moon==1)// 春節 農歷節日優先,農歷以BCD碼顯示
- {//顯示 初一
- disp16x16(72,104,&dispjieri,32,RILIcolor,BACKcolor);
- disp16x16(72,120,&dispjieri,33,RILIcolor,BACKcolor);
- jj=1;
- }
- if(month_moon==1&&day_moon==2)// 春節 農歷節日優先,農歷以BCD碼顯示
- {//顯示 初二
- disp16x16(72,104,&dispjieri,32,RILIcolor,BACKcolor);
- disp16x16(72,120,&dispjieri,34,RILIcolor,BACKcolor);
- jj=1;
- }
- if(month_moon==1&&day_moon==3)// 春節 農歷節日優先,農歷以BCD碼顯示
- {//顯示 初三
- disp16x16(72,104,&dispjieri,32,RILIcolor,BACKcolor);
- disp16x16(72,120,&dispjieri,35,RILIcolor,BACKcolor);
- jj=1;
- }
- if(month_moon==1&&day_moon==21)// 元宵節 農歷以BCD碼顯示 15即為21
- {//顯示 今日元宵節
- disp16x16(72,104,&dispjieri,4,RILIcolor,BACKcolor);
- disp16x16(72,120,&dispjieri,5,RILIcolor,BACKcolor);
- jj=1;
- }
- if(month_moon==5&&day_moon==5)// 端午節
- {//顯示 今日端午節
- disp16x16(72,104,&dispjieri,16,RILIcolor,BACKcolor);
- disp16x16(72,120,&dispjieri,17,RILIcolor,BACKcolor);
- jj=1;
- }
- if(month_moon==8&&day_moon==21)// 中秋節
- {//顯示 今日中秋節
- disp16x16(72,104,&dispjieri,22,RILIcolor,BACKcolor);
- disp16x16(72,120,&dispjieri,23,RILIcolor,BACKcolor);
- jj=1;
- }
- if(month_moon==9&&day_moon==9)// 重陽節
- {//顯示 今日重陽節
- disp16x16(72,104,&dispjieri,28,RILIcolor,BACKcolor);
- disp16x16(72,120,&dispjieri,29,RILIcolor,BACKcolor);
- jj=1;
- }
-
-
- if(jj==0)
- {//當顯示優先字jj為0,即沒有農歷的節日時,就判斷公歷節日
- //公歷 1月1, 2月14, 3月8, 5月1, 5月4, 6月1, 7月1, 8月1, 9月10, 10月1, 12月25
- // 元旦 情人節 婦女節 勞動節 青年節 兒童節 建黨節 建軍節 教師節 國慶節 圣誕節
- if(t_moon==1&&t_date==1)// 元旦
- {//顯示 元旦
- disp16x16(72,104,&dispjieri,0,RILIcolor,BACKcolor);
- disp16x16(72,120,&dispjieri,1,RILIcolor,BACKcolor);
- jj=2;
- }
- if(t_moon==2&&t_date==14)// 情人節
- {//顯示 情人節
- disp16x16(72,104,&dispjieri,6,RILIcolor,BACKcolor);
- disp16x16(72,120,&dispjieri,7,RILIcolor,BACKcolor);
- jj=2;
- }
- if(t_moon==3&&t_date==8)// 婦女節
- {//顯示 婦女節
- disp16x16(72,104,&dispjieri,8,RILIcolor,BACKcolor);
- disp16x16(72,120,&dispjieri,9,RILIcolor,BACKcolor);
- jj=2;
- }
- if(t_moon==5&&t_date==1)// 勞動節
- {//顯示 今日勞動節
- disp16x16(72,104,&dispjieri,10,RILIcolor,BACKcolor);
- disp16x16(72,120,&dispjieri,11,RILIcolor,BACKcolor);
- jj=2;
- }
- if(t_moon==5&&t_date==4)// 青年節
- {//顯示 今日青年節
- disp16x16(72,104,&dispjieri,12,RILIcolor,BACKcolor);
- disp16x16(72,120,&dispjieri,13,RILIcolor,BACKcolor);
- jj=2;
- }
- if(t_moon==6&&t_date==1)// 兒童節
- {//顯示 今日兒童節
- disp16x16(72,104,&dispjieri,14,RILIcolor,BACKcolor);
- disp16x16(72,120,&dispjieri,15,RILIcolor,BACKcolor);
- jj=2;
- }
- if(t_moon==7&&t_date==1)// 建黨節
- {//顯示 今日建黨節
- disp16x16(72,104,&dispjieri,18,RILIcolor,BACKcolor);
- disp16x16(72,120,&dispjieri,19,RILIcolor,BACKcolor);
- jj=2;
- }
- if(t_moon==8&&t_date==1)// 建軍節
- {//顯示 今日建軍節
- disp16x16(72,104,&dispjieri,20,RILIcolor,BACKcolor);
- disp16x16(72,120,&dispjieri,21,RILIcolor,BACKcolor);
- jj=2;
- }
- if(t_moon==9&&t_date==10)// 教師節
- {//顯示 今日教師節
- disp16x16(72,104,&dispjieri,24,RILIcolor,BACKcolor);
- disp16x16(72,120,&dispjieri,25,RILIcolor,BACKcolor);
- jj=2;
- }
- if(t_moon==10&&t_date==1)// 國慶節
- {//顯示 今日國慶節
- disp16x16(72,104,&dispjieri,26,RILIcolor,BACKcolor);
- disp16x16(72,120,&dispjieri,27,RILIcolor,BACKcolor);
- jj=2;
- }
- if(t_moon==12&&t_date==25)// 圣誕節
- {//顯示 今日圣誕節
- disp16x16(72,104,&dispjieri,30,RILIcolor,BACKcolor);
- disp16x16(72,120,&dispjieri,31,RILIcolor,BACKcolor);
- jj=2;
- }
-
- }
-
- if(jj==0)//如果還是0,即上面的節都不存在,就判斷24節氣
- { //由于每月只有2個節氣,
- tmpe=jieqijisuan(t_year,t_moon,t_date);
- if(tmpe>0)
- {
- jj=3;
- disp16x16(72,104,&dispjieqi,(tmpe-1)*2,RILIcolor,BACKcolor);
- disp16x16(72,120,&dispjieqi,(tmpe-1)*2+1,RILIcolor,BACKcolor);
-
- }
-
- }
-
- if(jj==0)
- {//如果以上都不是,顯示空
- Lcd_Clear(72,104,16,32,BACKcolor);
- }
- }
- void tinjidegan()
- {
- //農歷年
- //以下計算天干地支,計算方法,年-3后求10余數為天干,年-3后求12余數為地支,注意是字表從1-10,
- unsigned char temp1;
- temp1=(2000+t_year-3)%10;
- if(temp1==0)
- {
- temp1=9;
- }
- else
- {
- temp1=temp1-1;
- }
- disp16x16(16,136,&tiangan,temp1,RILIcolor,BACKcolor);//天干
-
- temp1=(2000+t_year-3)%12;
- if(temp1==0)
- {
- temp1=9;
- }
- else
- {
- temp1=temp1-1;
- }
- disp16x16(32,136,&dizhi,temp1,RILIcolor,BACKcolor);//地支
- disp16x16(48,136,&shuxiang,temp1,RILIcolor,BACKcolor);//屬相
- }
- void disppage1(bit alldisp)
- {//時鐘頁,參數為1時,全部刷新
- unsigned char temp1,temp2,temp3;
- if(alldisp==1)
- {
- Lcd_Clearall(BACKcolor);//清屏
- //日歷方框及方框內的星期-20年月等
- disp8x16(8,72,&DISPdat8x16,2,RILIcolor,BACKcolor);//2
- disp8x16(16,72,&DISPdat8x16,0,RILIcolor,BACKcolor);//0
- disp8x16(40,72,&DISPdat8x16,16,RILIcolor,BACKcolor);//-
- disp8x16(64,72,&DISPdat8x16,16,RILIcolor,BACKcolor);//-
- disp16x16(8,88,&DISPdat16x16,0,RILIcolor,BACKcolor);//星期
- disp16x16(24,88,&DISPdat16x16,1,RILIcolor,BACKcolor);
- disp8x16(80,88,&DISPdat8x16,21,RILIcolor,BACKcolor);//c
- disp16x16(64,136,&DISPdat16x16,2,RILIcolor,BACKcolor);//年
-
- //星期表
- disp16x16(96,64,&DISPweektu,0,WEEK67color,WEEK67BACKcolor);
- disp16x16(114,64,&DISPweektu,1,WEEK15color,WEEK15BACKcolor);
- disp16x16(132,64,&DISPweektu,2,WEEK15color,WEEK15BACKcolor);
- disp16x16(150,64,&DISPweektu,3,WEEK15color,WEEK15BACKcolor);
- disp16x16(168,64,&DISPweektu,4,WEEK15color,WEEK15BACKcolor);
- disp16x16(186,64,&DISPweektu,5,WEEK15color,WEEK15BACKcolor);
- disp16x16(204,64,&DISPweektu,6,WEEK67color,WEEK67BACKcolor);
- showGUI1(RILIcolor,BACKcolor);
- }
- //時鐘 秒閃
- if(time05s==1&&timetaovol==0)
- {
- Lcd_Clear(64,0,14,64,BACKcolor);
- Lcd_Clear(142,0,14,64,BACKcolor);
- }
- else
- {
- disp14x64din(64,0,TIMEcolor,BACKcolor);
- disp14x64din(142,0,TIMEcolor,BACKcolor);
- }
- //時
- if(t_hourold!=t_hour||alldisp==1||timetaovol==5||(taosaxi==1&&taosaxivol==6))
- {//由于LCD刷新慢,所以如沒變化就不刷新
- if(time05s==1&&timetaovol==5)
- {
- Lcd_Clear(0,0,64,64,BACKcolor);
- }
- else
- {
- if(taosaxi==1&&taosaxivol==6)taosaxi=0;//清刷新值,防止再次刷新
- if(t_1224ji==1)
- {//為12小時制,
- if(t_hour<12)
- {
- if(t_hour==0)
- {//顯12小時
- disp32x64(0,0,&DISPdat8x16,1,TIMEcolor,BACKcolor);//
- disp32x64(32,0,&DISPdat8x16,2,TIMEcolor,BACKcolor);
-
- }
- else
- {
- disp32x64(0,0,&DISPdat8x16,t_hour/10,TIMEcolor,BACKcolor);//
- disp32x64(32,0,&DISPdat8x16,t_hour%10,TIMEcolor,BACKcolor);
- }
-
- }
- else
- {
- if(t_hour==12)
- {
- disp32x64(0,0,&DISPdat8x16,1,TIMEcolor,BACKcolor);//
- disp32x64(32,0,&DISPdat8x16,2,TIMEcolor,BACKcolor);
- }
- else
- {
- disp32x64(0,0,&DISPdat8x16,(t_hour-12)/10,TIMEcolor,BACKcolor);//
- disp32x64(32,0,&DISPdat8x16,(t_hour-12)%10,TIMEcolor,BACKcolor);
-
- }
-
- }
- }
- else
- {//24小時制
- disp32x64(0,0,&DISPdat8x16,t_hour/10,TIMEcolor,BACKcolor);//參數1為列,2為行,3為字模,4為字號,5為字顏色,6為底色
- disp32x64(32,0,&DISPdat8x16,t_hour%10,TIMEcolor,BACKcolor);
- }
- }
- }
- //分
- if(t_minold!=t_min||alldisp==1||timetaovol==6||(taosaxi==1&&taosaxivol==7))
- {//由于LCD刷新慢,所以如沒變化就不刷新
- if(time05s==1&&timetaovol==6)
- {
- Lcd_Clear(78,0,64,64,BACKcolor);
- }
- else
- {
- if(taosaxi==1&&taosaxivol==7)taosaxi=0;//清刷新值,防止再次刷新
- disp32x64(78,0,&DISPdat8x16,t_min/10,TIMEcolor,BACKcolor);
- disp32x64(110,0,&DISPdat8x16,t_min%10,TIMEcolor,BACKcolor);
- }
- }
- //秒
- if(t_secold!=t_sec||alldisp==1||timetaovol==7||(taosaxi==1&&taosaxivol==1))
- {//由于LCD刷新慢,所以如沒變化就不刷新
- if(time05s==1&&timetaovol==7)
- {
- Lcd_Clear(156,0,64,64,BACKcolor);
- }
- else
- {
- if(taosaxi==1&&taosaxivol==1)taosaxi=0;
- disp32x64(156,0,&DISPdat8x16,t_sec/10,TIMEcolor,BACKcolor);
- disp32x64(188,0,&DISPdat8x16,t_sec%10,TIMEcolor,BACKcolor);
- }
- }
-
- //年
- if(t_yearold!=t_year||alldisp==1||timetaovol==1||(taosaxi==1&&taosaxivol==2))
- {
- if(time05s==1&&timetaovol==1)
- {
- Lcd_Clear(24,72,16,16,BACKcolor);
- }
- else
- {
- if(taosaxi==1&&taosaxivol==2)taosaxi=0;
- disp8x16(24,72,&DISPdat8x16,t_year/10,RILIcolor,BACKcolor);
- disp8x16(32,72,&DISPdat8x16,t_year%10,RILIcolor,BACKcolor);
- }
- }
- //月
- if(t_moonold!=t_moon||alldisp==1||timetaovol==2||(taosaxi==1&&taosaxivol==3))
- {
- if(time05s==1&&timetaovol==2)
- {
- Lcd_Clear(48,72,16,16,BACKcolor);
- }
- else
- {
- if(taosaxi==1&&taosaxivol==3)taosaxi=0;
- disp8x16(48,72,&DISPdat8x16,t_moon/10,RILIcolor,BACKcolor);
- disp8x16(56,72,&DISPdat8x16,t_moon%10,RILIcolor,BACKcolor);
- }
- }
- //日
- if(t_dateold!=t_date||alldisp==1||timetaovol==3||(taosaxi==1&&taosaxivol==4))
- {
- if(time05s==1&&timetaovol==3)
- {
- Lcd_Clear(72,72,16,16,BACKcolor);
- }
- else
- {
- if(taosaxi==1&&taosaxivol==4)taosaxi=0;
- disp8x16(72,72,&DISPdat8x16,t_date/10,RILIcolor,BACKcolor);
- disp8x16(80,72,&DISPdat8x16,t_date%10,RILIcolor,BACKcolor);
- }
- }
- //星期
- t_xingqi= PGday(2000+t_year,t_moon,t_date);//星期計算,
- if(t_xingqiold!=t_xingqi||alldisp==1)
- {
- disp16x16(40,88,&DISPWEEK,t_xingqi,RILIcolor,BACKcolor);
- }
- //溫度
- if(t_tempold!=TEMPnow||alldisp==1)
- {
- disp8x16(64,88,&DISPdat8x16,TEMPnow/10,RILIcolor,BACKcolor);
- disp8x16(72,88,&DISPdat8x16,TEMPnow%10,RILIcolor,BACKcolor);
- }
- //日期 (上午下午,節氣等)
- if(t_dateold!=t_date||alldisp==1)
- {
- disp16x32(32,104,&DISPdat8x16,t_date/10,RILIcolor,BACKcolor);
- disp16x32(48,104,&DISPdat8x16,t_date%10,RILIcolor,BACKcolor);
- }
- //左上下午
-
- if(t_hourold!=t_hour||alldisp==1)
- {
- if(t_hour>11)
- {
- disp16x16(8,120,&DISPdat16x16,6,RILIcolor,BACKcolor);//小時發生變化才變
- }
- else
- {
- disp16x16(8,120,&DISPdat16x16,5,RILIcolor,BACKcolor);//小時發生變化才變
- }
-
- }
- if(t_yearold!=t_year||t_moonold!=t_moon||t_dateold!=t_date||alldisp==1)
- {
-
- Conversion(0,((t_year/10)*16+t_year%10),((t_moon/10)*16+t_moon%10),((t_date/10)*16)+t_date%10); //注意,輸入的是BCD碼,算出來的也是BCD碼,入數是要注意。
- //右節氣
- jieqidisp();
- //農歷年
- tinjidegan();
- //農歷月日month_moon/16day_moon/16
- //為了保證能居中顯示,需先判斷有多少個字,然后進行針對性編寫
- if(month_moon<0x11)
- {//一到十月
- if(day_moon<0x11||day_moon==0x20||day_moon==0x30)
- {//3個字,注意當日為20或30時,也是3個字
- Lcd_Clear(8,152,16,16,BACKcolor);
- if(month_moon==0x10)
- {
- disp16x16(24,152,&dispjieri,42,RILIcolor,BACKcolor);
- }
- else
- {
- disp16x16(24,152,&dispjieri,month_moon+32,RILIcolor,BACKcolor);
- }
-
- disp16x16(40,152,&DISPdat16x16,3,RILIcolor,BACKcolor);//月
- if(day_moon<10)
- {
- disp16x16(56,152,&dispjieri,day_moon%16+32,RILIcolor,BACKcolor);
-
- }
- if(day_moon==0x10)
- {
- disp16x16(56,152,&dispjieri,42,RILIcolor,BACKcolor);
- }
- if(day_moon==0x20)
- {
- disp16x16(56,152,&dispjieri,43,RILIcolor,BACKcolor);
- }
- if(day_moon==0x30)
- {
- disp16x16(56,152,&dispjieri,44,RILIcolor,BACKcolor);
- }
- Lcd_Clear(72,152,16,16,BACKcolor);
- }
- else
- {//4個字
- Lcd_Clear(8,152,8,16,BACKcolor);
- if(month_moon==0x10)
- {
- disp16x16(16,152,&dispjieri,42,RILIcolor,BACKcolor);
- }
- else
- {
- disp16x16(16,152,&dispjieri,month_moon+32,RILIcolor,BACKcolor);
- }
-
- disp16x16(32,152,&DISPdat16x16,3,RILIcolor,BACKcolor);//月
- if(day_moon>0x10)
- {//十以上
- if(day_moon>0x20)
- {
- if(day_moon>0x30)
- {//30以上
- disp16x16(48,152,&dispjieri,44,RILIcolor,BACKcolor);
- disp16x16(64,152,&dispjieri,day_moon%16+32,RILIcolor,BACKcolor);
- }
- else
- {//20以上
- disp16x16(48,152,&dispjieri,43,RILIcolor,BACKcolor);
- disp16x16(64,152,&dispjieri,day_moon%16+32,RILIcolor,BACKcolor);
- }
- }
- else
- {//10以上
- disp16x16(48,152,&dispjieri,42,RILIcolor,BACKcolor);
- disp16x16(64,152,&dispjieri,day_moon%16+32,RILIcolor,BACKcolor);
- }
-
- }
- Lcd_Clear(80,152,8,16,BACKcolor);
- }
- }
- else
- {//十一十二月
- if(day_moon<0x11||day_moon==0x20||day_moon==0x30)
- {//4個字
- Lcd_Clear(8,152,8,16,BACKcolor);
- disp16x16(16,152,&dispjieri,42,RILIcolor,BACKcolor);
- disp16x16(32,152,&dispjieri,month_moon%16+32,RILIcolor,BACKcolor);
- disp16x16(48,152,&DISPdat16x16,3,RILIcolor,BACKcolor);//月
- if(day_moon<10)
- {
- disp16x16(64,152,&dispjieri,day_moon%16+32,RILIcolor,BACKcolor);
-
- }
- if(day_moon==0x10)
- {
- disp16x16(64,152,&dispjieri,42,RILIcolor,BACKcolor);
- }
- if(day_moon==0x20)
- {
- disp16x16(64,152,&dispjieri,43,RILIcolor,BACKcolor);
- }
- if(day_moon==0x30)
- {
- disp16x16(64,152,&dispjieri,44,RILIcolor,BACKcolor);
- }
- Lcd_Clear(80,152,8,16,BACKcolor);
-
-
-
- }
- else
- {//5個字
- disp16x16(8,152,&dispjieri,42,RILIcolor,BACKcolor);
- disp16x16(24,152,&dispjieri,month_moon%16+32,RILIcolor,BACKcolor);
- disp16x16(40,152,&DISPdat16x16,3,RILIcolor,BACKcolor);//月
- if(day_moon>0x10)
- {//十以上
- if(day_moon>0x20)
- {
- if(day_moon>0x30)
- {//30以上
- disp16x16(56,152,&dispjieri,44,RILIcolor,BACKcolor);
- disp16x16(72,152,&dispjieri,day_moon%16+32,RILIcolor,BACKcolor);
- }
- else
- {//20以上
- disp16x16(56,152,&dispjieri,43,RILIcolor,BACKcolor);
- disp16x16(72,152,&dispjieri,day_moon%16+32,RILIcolor,BACKcolor);
- }
- }
- else
- {//10以上
- disp16x16(56,152,&dispjieri,42,RILIcolor,BACKcolor);
- disp16x16(72,152,&dispjieri,day_moon%16+32,RILIcolor,BACKcolor);
- }
-
- }
- }
- }
-
- }
- //星期表 每天變一次
- if(t_dateold!=t_date||t_yearold!=t_year||t_moonold!=t_moon||alldisp==1)
- {
- //判斷一個月的日數及第一天的星期,然后排表,并顯示當前日
- //這里的程序有校期為2001-2099年
- //1,3,5,7,8,10,12月為31天,4,6,9,11月為30天,2月為28或29天,2000年2月為29天,隔4年2月為29天
- //先清空第一行及最后兩行,中間的覆蓋
- Lcd_Clear(96,80,108,16,BACKcolor);
- Lcd_Clear(96,144,126,32,BACKcolor);
- // Lcd_Clear(96,80,32,112,BACKcolor);
- if(t_moon==1||t_moon==3||t_moon==5||t_moon==7||t_moon==8||t_moon==10||t_moon==12)
- {
- temp1=31;
- }
- else
- {
- if(t_moon==4||t_moon==6||t_moon==9||t_moon==11)
- {
- temp1=30;
- }
- else
- {
- if((t_year%4)==0)
- {
- temp1=29;
- }
- else
- {
- temp1=28;
- }
- }
- }
- temp2=PGday(2000+t_year,t_moon,1);//當月1號為星期幾計算,
-
- for(temp3=0;temp3<temp1;temp3++)
- {
- if(temp3==t_date-1)
- {//當前日顯紅底黑字
- disp16x16(96+(temp2+temp3-((temp2+temp3)/7)*7)*18,80+((temp2+temp3)/7)*16,&DISPweektu,temp3+7,WEEKcolor,WEEKSELcolor);//x+18,y+16
- }
- else
- {//其它顯灰底黑字
- disp16x16(96+(temp2+temp3-((temp2+temp3)/7)*7)*18,80+((temp2+temp3)/7)*16,&DISPweektu,temp3+7,WEEKcolor,WEEKBACKcolor);//x+18,y+16
- }
- }
- }
- //以下幾句是在最后強加顯示,所以不需判斷改變后顯示
- //24小時制
- if(time05s==1&&timetaovol==4)
- {
- Lcd_Clear(0,0,16,8,BACKcolor);
- }
- else
- {
- if(t_1224ji==1)
- {//為12小時制,
- if(t_hour>11)
- {
- disp8x8(0,0,&DISPdat8x8,24,BLACK,BACKcolor);//下午
- disp8x8(8,0,&DISPdat8x8,25,BLACK,BACKcolor);
- }
- else
- {
- disp8x8(0,0,&DISPdat8x8,22,BLACK,BACKcolor);//上午
- disp8x8(8,0,&DISPdat8x8,23,BLACK,BACKcolor);
- }
- }
- else
- {
- disp8x8(0,0,&DISPdat8x8,20,BLACK,BACKcolor);//24
- disp8x8(8,0,&DISPdat8x8,21,BLACK,BACKcolor);
- }
- }
-
- t_hourold=t_hour;
- t_minold=t_min;
- t_secold=t_sec;
- t_xingqiold=t_xingqi;
- t_yearold=t_year;
- t_moonold=t_moon;
- t_dateold=t_date;
- t_tempold=TEMPnow;
-
- }
- //***********************鍵盤掃描子程序。******************
- //*********************************************************
- unsigned char keyboard()//鍵盤掃描
- {
- unsigned char keyboardj;
- keyboardj=0;
- if(KEY1==0)
- {
- delay(10);
- if(KEY1==0)
- {
-
- keyboardj=1;
- }
- }
- return keyboardj;
- }
- //************鍵盤控制子程序***************
- //******************************************
- void keydisphong()//主要功能是
- {
- unsigned char keyyy;
- keyyy=keyboard();
- if (keyyy!=oldkey)
- {
- if(keyyy==0)//
- {
- if(keyjixu>0)
- {
- if(keyjixu<80)
- {
- if(oldkey==1)
- {
- keyval=1;
- }
- }
- else
- {
- //keyval=11;
- keyjixu=0;
- }
- }
- else
- {
- keyval=0;
- keyjixu=0;
- }
- }
-
- }
- oldkey=keyyy;
- if(keyyy==1)//
- {
- keyjixu++;
- if(keyjixu==80)keyval=11;
- }
- //鍵盤處理完成。
- //以下為功能子程序
- if(keyval==1)
- {
- keyval=0;//這步必須的,清鍵值。
- keyjixu=0;//清計數值,這兩步是必要的。
-
- if(disppagevol==0&&timetaovol!=0)
- {//時鐘頁,當處于調整狀態時為改變項目
- timetaovol++;
- if(timetaovol>7)timetaovol=1;
- taosaxivol=timetaovol;
- taosaxi=1;//這2個值用于控制由于數據沒變化引起不刷新
- }
- }
- if(keyval==11)
- {//
- keyval=0;//這步必須的,清鍵值。
- //keyjixu=0;//清計數值,這兩步是必要的。
- if(disppagevol==0)
- {//時鐘頁,當處于長按,進入調時鐘。再長按退出
- if(timetaovol==0)
- {
- timetaovol=1;
- }
- else
- {
- taosaxivol=timetaovol+1;
- if(taosaxivol>7)taosaxivol=1;
- taosaxi=1;//這2個值用于控制由于數據沒變化引起不刷新
- timetaovol=0;
- I2CWrite(0x06,(t_year/10)*16+t_year%10); //修改年
- I2CWrite(0x05,(t_moon/10)*16+t_moon%10); //修改月
- I2CWrite(0x04,(t_date/10)*16+t_date%10); //修改日
- I2CWrite(0x02,(t_hour/10)*16+t_hour%10); //修改時
- I2CWrite(0x01,(t_min/10)*16+t_min%10); //修改分
- I2CWrite(0x00,(t_sec/10)*16+t_sec%10); //修改秒
- writeDAT();//保存24制
- }
-
-
- }
- }
- }
- //*******************編碼控制**********
- void panma()
- {
- if(panmaoldA==1&&panmaoldB==1&&BINmanA==1&&BINmanB==0)//和前一次狀態比較確定為右旋
- {
- panmavol=1;
- }
- if(panmaoldA==1&&panmaoldB==1&&BINmanA==0&&BINmanB==1)//和前一次狀態比較確定為右旋
- {
- panmavol=2;
- }
- panmaoldA=BINmanA;
- panmaoldB=BINmanB;
- }
- void paimakong()//編碼控制
- {
- //unsigned char tempp1;
- if(panmavol!=0)
- {//編碼值為1,2才執行
- if(disppagevol==0)
- {//時鐘頁,
- if(timetaovol==1)
- {//調年
- if(panmavol==1)
- {//向上
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (40.67 KB, 下載次數: 134)
下載附件
2017-10-13 17:06 上傳
所有資料51hei提供下載:
彩屏萬年歷2.2寸SIP接口中LED屏.zip
(2.81 MB, 下載次數: 206)
2017-10-13 15:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|