参考本坛几位高人的程序终于完了一个心愿,令很早前买的12864屏可以按自己满意的显示方式显示
搬程序搬了两天总意搬好,
image.png

image.png
自己不会画仿真图所以用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);           
  •                 }                                                                                                                                        */
  • }
  •   
  • 复制代码