用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为参数加
原理图:
单片机源程序如下:
- //彩屏万年历,带节日节气农历。
- //单片机用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黑下载附件…………
复制代码
所有资料51hei提供下载:
彩屏万年历2.2寸SIP接口中LED屏.zip
(2.81 MB, 下载次数: 199)
|