搬程序搬了两天总意搬好,
自己不会画仿真图所以用qpzmg的原仿真,此19264也是用ks0108跟我的12864同芯片,实际用在12864的只要改一下屏选就行.
下面是源程序预览:
/*系统头文件--------------------------------------------------------------------*/#include #include #include "MODEL.h" #include "LCM19264.h" #include "DS1302.h" #include "DS18B20.h" #include "nongli.h" /*定义按键----------------------------------------------------------------------*/ sbit K1 = P3^0; //按键K1-设置 sbit K2 = P3^1; //按键K2-确认、返回 sbit K3 = P3^2; //按键K3-加 sbit K4 = P3^3; //按键K4-减 //sbit K5 = P1^3; /************************函数声明***********************************************/ void DelayM(uint); void ds_w(void); uchar m,date,month,year,hour,minute,second; void Conver_week(bit c,uchar year,uchar month,uchar day); /*-----------------------------定义全局变量------------------------------*/ bit q=0, w=0; //调时标志位 unsigned char yy,mo,dd,xq,hh,mm,ss,month_moon,day_moon,week,tiangan,dizhi,moontemp1,moontemp2;//定义时间映射全局变量(专用寄存器) signed char address,item,max,mini; unsigned char sel,dd,mo,yy; /*延时1(us)微秒——————————————————————————————————————————————————————————————————————————————— void delay(uint i) while(i--); 毫秒级CPU延时函数——————————————————————————————————————————————————————————————————————————— void DelayM(uint a) { uint i; while( --a != 0) { for(i = 0; i < 125; i++); } } */ void displaytime(void) { year=read_time(0x8d);//调用1302时钟数据中的年数据,从地址0x8d中 ShowChar(0,0,'2'); ShowChar(0,1,'0'); ShowChar(0,2,(year/16+0x30)); ShowChar(0,3,(year%16+0x30)); ShowHZ(0,2,10); //年 month=read_time(0x89);//调用1302时钟数据中的月数据,从地址0x89中 ShowChar(0,6,(month/16+0x30)); ShowChar(0,7,(month%16)+0x30); //ShowChar(0,4,(Time[6]/16)); //ShowChar(0,5,(Time[6]%16)); ShowHZ(0,4,11); //月 date=read_time(0x87);//从1302芯片中读取日数据,从地址0x87中 ShowChar(0,10,(date/16+0x30)); ShowChar(0,11,(date%16+0x30)); //ShowChar(0,8,(Time[6]/16)); //ShowChar(0,9,(Time[6]%16)); ShowHZ(0,6,12); //日 //小时 hour = read_time(0x85); //if((hour/16)==0){Show1632(1,0,11);} // else {Show1632(1,0,(hour/16));} //小时十位 Show1632(1,0,(hour/16)); Show1632(1,1,(hour%16)); //小时个位 Show1632(1,2,10); //时钟分隔符号":" //分钟 minute = read_time(0x83); Show1632(1,3,(minute/16)); //分钟十位 Show1632(1,4,(minute%16)); //分钟个位 ShowSZ(2,5,10); //时钟分隔符号":" //秒钟 second = read_time(0x81); ShowSZ(2,6,(second/16)); //秒钟十位 ShowSZ(2,7,(second%16)); //秒钟个位 ShowHZ(1,5,13);//星 ShowHZ(1,6,14);//期 dd = read_time(0x87);//日 mo = read_time(0x89);//月 yy = read_time(0x8d);//年 Conver_week(0,yy,mo,dd);//调用公历换算星期子函数 //sel=week;//week是公历转换星期子函数的运行结果,结果为0-6,0是星期日 ShowHZ(1,7,((week)-1));//显示位置 if(week==0) ShowHZ(1,7,12); //0=星期日 } void displaynl(void) { Conversion(century,year,month,date); //公历转农历 //write_com(0x30); write_com(0x06); write_com(0x98); ShowHZ(3,0,(month_moon)); //显示农历月 if(month_moon==1) {ShowHZ(3,0,28);} //正 if(month_moon==2) {ShowHZ(3,0,1);} // if(month_moon==3) {ShowHZ(3,0,2);} // if(month_moon==4) {ShowHZ(3,0,3);} // if(month_moon==5) {ShowHZ(3,0,4);} // if(month_moon==6) {ShowHZ(3,0,5);} // if(month_moon==7) {ShowHZ(3,0,6);} // if(month_moon==8) {ShowHZ(3,0,7);} // if(month_moon==9) {ShowHZ(3,0,8);} // if(month_moon==10) {ShowHZ(3,0,9);} // if(month_moon==11) {ShowHZ(3,0,15);} // if(month_moon==12) {ShowHZ(3,0,16);} // ShowHZ(3,1,11); ShowHZ(3,2,(day_moon)); //显示农历月 if (day_moon==1) {ShowHZ(3,2,17);ShowHZ(3,3,0);}// {lcm_w_word("初一");} if (day_moon==2) {ShowHZ(3,2,17);ShowHZ(3,3,1);}// {lcm_w_word("初二");} if (day_moon==3) {ShowHZ(3,2,17);ShowHZ(3,3,2);}// {lcm_w_word("初三"); if (day_moon==4) {ShowHZ(3,2,17);ShowHZ(3,3,3);}// {lcm_w_word("初四");} if (day_moon==5) {ShowHZ(3,2,17);ShowHZ(3,3,4);}// {lcm_w_word("初五");} if (day_moon==6) {ShowHZ(3,2,17);ShowHZ(3,3,5);}// {lcm_w_word("初六");} if (day_moon==7) {ShowHZ(3,2,17);ShowHZ(3,3,6);}// {lcm_w_word("初七");} if (day_moon==8) {ShowHZ(3,2,17);ShowHZ(3,3,7);}// {lcm_w_word("初八");} if (day_moon==9) {ShowHZ(3,2,17);ShowHZ(3,3,8);}// {lcm_w_word("初九");} if (day_moon==10) {ShowHZ(3,2,17);ShowHZ(3,3,9);}// {lcm_w_word("初十");} if (day_moon==11) {ShowHZ(3,2,9);ShowHZ(3,3,0);}// {lcm_w_word("十一");} if (day_moon==12) {ShowHZ(3,2,9);ShowHZ(3,3,1);}// {lcm_w_word("十二");} if (day_moon==13) {ShowHZ(3,2,9);ShowHZ(3,3,2);}// {lcm_w_word("十三"); if (day_moon==14) {ShowHZ(3,2,9);ShowHZ(3,3,3);}// {lcm_w_word("十四");} if (day_moon==15) {ShowHZ(3,2,9);ShowHZ(3,3,4);}// {lcm_w_word("十五");} if (day_moon==16) {ShowHZ(3,2,9);ShowHZ(3,3,5);}// {lcm_w_word("十六");} if (day_moon==17) {ShowHZ(3,2,9);ShowHZ(3,3,6);}// {lcm_w_word("十七");} if (day_moon==18) {ShowHZ(3,2,9);ShowHZ(3,3,7);}// {lcm_w_word("十八");} if (day_moon==19) {ShowHZ(3,2,9);ShowHZ(3,3,8);}// {lcm_w_word("十九");} if (day_moon==20) {ShowHZ(3,2,1);ShowHZ(3,3,9);}// {lcm_w_word("二十");} if (day_moon==21) {ShowHZ(3,2,18);ShowHZ(3,3,0);}// {lcm_w_word("廿一");} if (day_moon==22) {ShowHZ(3,2,18);ShowHZ(3,3,1);}// {lcm_w_word("廿二");} if (day_moon==23) {ShowHZ(3,2,18);ShowHZ(3,3,2);}// {lcm_w_word("廿三"); if (day_moon==24) {ShowHZ(3,2,18);ShowHZ(3,3,3);}// {lcm_w_word("廿四");} if (day_moon==25) {ShowHZ(3,2,18);ShowHZ(3,3,4);}// {lcm_w_word("廿五");} if (day_moon==26) {ShowHZ(3,2,18);ShowHZ(3,3,5);}// {lcm_w_word("廿六");} if (day_moon==27) {ShowHZ(3,2,18);ShowHZ(3,3,6);}// {lcm_w_word("廿七");} if (day_moon==28) {ShowHZ(3,2,18);ShowHZ(3,3,7);}// {lcm_w_word("廿八");} if (day_moon==29) {ShowHZ(3,2,18);ShowHZ(3,3,8);}// {lcm_w_word("廿九");} if (day_moon==30) {ShowHZ(3,2,2);ShowHZ(3,3,9);}// {lcm_w_test(三十 } void Set_time(uchar sel) { signed char address,item; signed char max,mini; ShowHZ(3,4,19); //显示"设" ShowHZ(3,5,20); //显示"置" if(sel==0) {ShowHZ(3,6,10);ShowHZ(3,7,27);address=0x8c; max=99; mini=0;} //年份 if(sel==1) {ShowHZ(3,6,11);ShowHZ(3,7,27);address=0x88; max=12; mini=1;} //月份 if(sel==2) {ShowHZ(3,6,12);ShowHZ(3,7,14);address=0x86; max=31; mini=1;} //日期 if(sel==3) {ShowHZ(3,6,23);ShowHZ(3,7,24);address=0x84; max=23;mini=0;}//小时 if(sel==4) {ShowHZ(3,6,21);ShowHZ(3,7,22);address=0x82; max=59;mini=0;}//分钟 //读取1302某地址上的数值转换成10进制赋给item item=((read_time(address+1))/16)*10 + (read_time(address+1))%16; if(K3 == 0){item++;} if(K4 == 0){item--;} if(item>max) item=mini; if(item<mini) item="max;" write_time(0x8e,0x00);//允许写操作 write_time(address,(item/10)*16+item%10);//转换成16进制写入1302 write_time(0x8e,0x80);//写保护,禁止写操作 displaytime(); } void main() { uchar e=0; ds1302_init(); InitLCD(); while(1) { if(w==0) { displaytime(); displaynl(); read_temp(); //读取温度 ds1820disp(); //显示温度 } //正常走时 else {} //否则启动调时 //设置键------------------------------------------------------------------------ if (K1 == 0) // 设置时间 { DelayM(20); //按键消抖 if(K1 == 0 && w == 1) //当是调时状态 本键用于调整下一项 { e++; if (e >= 6 ){e = 0;} Set_time(e); //调整 } if(K1 == 0 && w == 0) //当是正常状态时就进入调时状态 { ClearScreen(0); ClearScreen(1); ClearScreen(2); //清除左中右屏显示 w=1; //进入调时 Set_time(e); //调整 } while(K1 == 0); //等待键松开 } //确认,返回键------------------------------------------------------------------- if (K2 == 0) //在调时状态时就退出调时 { DelayM(20); //按键消抖 if(K2 == 0 && w == 1) { w = 0; //退出调时 e = 0; //"下一项"计数器清0 } if(K2 == 0 && w == 0) { ClearScreen(0); ClearScreen(1); ClearScreen(2); //清除左中右屏显示 while(K2 == 0); } ClearScreen(0); ClearScreen(1); ClearScreen(2); //清除左中右屏显示 displaytime(); //显示时间 read_temp(); //读取温度 ds1820disp(); //显示温度 while(K2 == 0); } //加调整------------------------------------------------------------------------ if (K3 == 0 && w == 1) { DelayM(20); if(K3 == 0 && w == 1) { Set_time(e); } while(K3 == 0); } //减调整------------------------------------------------------------------------ if (K4 == 0 && w == 1) { DelayM(20); if(K4 == 0 && w == 1) { Set_time(e); } while(K4 == 0); } } /*液晶背光控制,按一下亮,再按一下灭---------------------------------------- if(K5 == 0) { DelayM(20); q = ~q; //标志位取反 if(q){BLK = BLK | 1;} else {BLK = BLK & 0;} while(K5 == 0); } */ }
复制代码