找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5304|回复: 29
收起左侧

单片机大数字万年历电子钟制作 带农历年属性温度 代码注释和仿真图PCB

  [复制链接]
ID:877406 发表于 2022-9-16 11:28 | 显示全部楼层 |阅读模式
这是我制作的LCD12864大数字万年历电子钟设计,用了一个多星期时间,经过实物实测,每月时间相差几分钟,这是时钟走时芯片决定的,温度显示还算正常。
附件里面包含单片机的源码,仿真图,PCB原档。请大家多多指教。

制作出来的实物图如下:
51hei图片_20220916112349.jpg
51hei图片_20220916112420.jpg

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif

protel99画的PCB图如下:(51hei附件中可下载工程文件)
51hei图片_20220916112539.jpg

单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. //#include <stdio.h>
  4. #include<string.h>
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. /******LCD12864通讯端口******/
  8. sbit RS_LCD12864=P2^7;     //定义选择显示类型, 定义数据或指令,1=数据,0=指令
  9. sbit RW_LCD12864=P2^6;    //定义读写信号控制端, 定义读或写??1=读,??0=写
  10. sbit EN_LCD12864=P2^5;    //定义数据锁存信号, 定义使能操作, 1=能,??0=否
  11. #define LCD12864_Databus P0   //定义数据端
  12. #define sc0 0        
  13. #define sc1 1         
  14. uchar DS1302_flag;        //定义DS1302RAM中是否写数的标志位,第一次开机初始化后RAM中写1
  15. sbit CS1=P2^4;    //定义选择芯片右半屏信号
  16. sbit CS2=P2^3;    //定义选择芯片左半屏信号
  17. /*******DS1302时钟端口******/
  18. sbit SCLK=P2^0;     //DS1302时钟口
  19. sbit DATA=P2^1;    //DS1302串口数据
  20. sbit RST=P2^2;    //DS1302的复位口
  21. uchar code Write_RTC_ADDR[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
  22. uchar code READ_RTC_ADDR[7] ={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
  23. uchar TIME[7]={0, 0x38, 0x15, 0x25, 0x05, 0x03, 0x22};
  24. //2022年5月25星期3,15:38:00
  25. /***********DS18B20**********/
  26. sbit DQ=P3^7;        //温度探测口
  27. uchar fb;            //文字反白标示
  28. uint tempvalue;     //温度值,此变量若为uchar则温度不正常
  29. uchar Temp_Flag;  //温度正负标志

  30. /***************按键端口************/
  31. sbit  set =P1^0;                 //设置
  32. sbit  key1=P1^1;               //加           
  33. sbit  key2=P1^2;                            //减
  34. sbit  key3=P1^3;                        //蜂鸣开关
  35. sbit  key4=P1^4;                       //背光开关

  36. uchar setflag=0;                   //按键计数,决定调节的日期和时间
  37. sbit  bl=P3^5;                           //背光控制端
  38. sbit  bz=P3^6;                          //蜂鸣控制端
  39. uchar tempa;              //调时
  40. /*********农历部分********/
  41. #define uint unsigned int
  42. char sec,min,hour,day,month,year,week;    //定义全局变量,秒,分,时,日,月,年和星期
  43. bit century;   //世纪位标志,0为20世纪,1为19世纪
  44. uchar sec_count=0;//定义定时计数,当sec_count==20时,秒加一
  45. code uchar table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表
  46. code uchar day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};//月份数据表
  47. code uint  day_code2[3]={0x111,0x130,0x14e};
  48. bit c_moon;
  49. data uchar year_moon,month_moon,day_moon;

  50. /*******函数声明********/
  51. //读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0
  52. bit get_moon_day(uchar month_p,uint table_addr);
  53. void Conversion(bit c,char year,char month,char day);//输入阳历数据,输出阴历数据
  54. void Conver_week();                 //输入BCD阳历数据,输出BCD星期数据
  55. void delay_ms(uint x);

  56. void Lcd12864_BusyChk();
  57. void set_xy(unsigned char x,unsigned char y);

  58. /*************************************************************************************
  59. * 函数名称    :Conversion
  60. * 功能描述    :输入阳历数据,输出阴历数据(只允许1901-2099年)
  61. * 参数        :参数名称
  62. ****************************************************************************************/
  63. void Conversion(bit c,char year,char month,char day)
  64. {
  65. //c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据
  66.   uchar temp1,temp2,temp3,month_p;
  67.   uint temp4,table_addr;
  68.   bit flag2,flag_y;

  69.   //定位数据表地址
  70.   if(c==0) { table_addr=(year+0x64-1)*0x3; }
  71.   else   { table_addr=(year-1)*0x3; }
  72.   //定位数据表地址完成

  73.   //取当年节日所在的公历月份
  74.   temp1=year_code[table_addr+2]&0x60;
  75.   temp1=_cror_(temp1,5);
  76.   //取当年节日所在的公历月份完成

  77.   //取当年节日所在的公历日
  78.   temp2=year_code[table_addr+2]&0x1f;
  79.   //取当年节日所在的公历日完成

  80.   // 计算当年春年离当年元旦的天数,节日只会在公历1月或2月
  81.   if(temp1==0x1) { temp3=temp2-1; }  
  82.   else  { temp3=temp2+0x1f-1; }
  83.   // 计算当年春年离当年元旦的天数完成

  84.   //计算公历日离当年元旦的天数,为了减少运算,用了两个表
  85.   //day_code1[9],day_code2[3]
  86.   //如果公历月在九月或前,天数会少于0xff,用表day_code1[9],
  87.   //在九月后,天数大于0xff,用表day_code2[3]
  88.   //如输入公历日为8月10日,则公历日离元旦天数为day_code1[8-1]+10-1
  89.   //如输入公历日为11月10日,则公历日离元旦天数为day_code2[11-10]+10-1
  90.   if (month<10){ temp4=day_code1[month-1]+day-1; }
  91.   else         { temp4=day_code2[month-10]+day-1;}
  92.   if ((month>0x2)&&(year%0x4==0)&&(year!=0))
  93.   temp4+=1; //如果公历月大于2月并且该年的2月为闰月,天数加1
  94.   //计算公历日离当年元旦的天数完成

  95.   //判断公历日在节日前还是节日后
  96.   if (temp4>=temp3)
  97.   { //公历日在节日后或就是节日当日使用下面代码进行运算
  98.     temp4-=temp3;
  99.     month=0x1;
  100.     month_p=0x1;  //month_p为月份指向,公历日在节日前或就是节日当日month_p指向首月
  101.     flag2=get_moon_day(month_p,table_addr); //检查该农历月为大小还是小月,大月返回1,小月返回0
  102.     flag_y=0;
  103.     if(flag2==0)temp1=0x1d; //小月29天
  104.     else temp1=0x1e;     //大小30天
  105.     temp2=year_code[table_addr]&0xf0;
  106.     temp2=_cror_(temp2,4);  //从数据表中取该年的闰月月份,如为0则该年无闰月
  107.     while(temp4>=temp1)
  108.     {
  109.       temp4-=temp1;
  110.       month_p+=1;
  111.       if(month==temp2)
  112.           {
  113.         flag_y=~flag_y;
  114.         if(flag_y==0)month+=1;
  115.       }
  116.       else month+=1;flag2=get_moon_day(month_p,table_addr);
  117.       if(flag2==0)temp1=0x1d;
  118.       else temp1=0x1e;
  119.     }
  120.     day=temp4+1;
  121.   }
  122.   else
  123.   {  //公历日在节日前使用下面代码进行运算
  124.     temp3-=temp4;
  125.     if (year==0x0){year=0x63;c=1;}
  126.     else year-=1;
  127.     table_addr-=0x3;
  128.     month=0xc;
  129.     temp2=year_code[table_addr]&0xf0;
  130.     temp2=_cror_(temp2,4);
  131.     if (temp2==0)month_p=0xc;
  132.     else month_p=0xd;
  133.         //month_p为月份指向,如果当年有闰月,一年有十三个月,月指向13,无闰月指向12

  134.     flag_y=0;
  135.     flag2=get_moon_day(month_p,table_addr);
  136. if(flag2==0)
  137. temp1=0x1d;
  138. else
  139. temp1=0x1e;
  140.     while(temp3>temp1)
  141.     {
  142.       temp3-=temp1;
  143.       month_p-=1;
  144.       if(flag_y==0)month-=1;
  145.       if(month==temp2)flag_y=~flag_y;
  146.       flag2=get_moon_day(month_p,table_addr);
  147.       if(flag2==0)temp1=0x1d;
  148.       else temp1=0x1e;
  149.     }
  150.     day=temp1-temp3+1;
  151.   }
  152.   c_moon=c;
  153. //原程序这里又把这得出的值变回BCD码。但根据我后面的程序,我不需要。
  154. //后面用来显示的农历信息的程序分别是disp_t3()和disp_t4()
  155.   year_moon=year;
  156.   month_moon=month;
  157.   day_moon=day;
  158. }

  159. /******************************************************************************************
  160. * 函数名称    :Conver_week
  161. * 功能描述    :输入BCD阳历数据,输出BCD星期数据(只允许1901-2099年)
  162. * 参数        :  参数名称:        输入/输出?        类型                描述
  163. * 算法:日期+年份+所过闰年数+月较正数之和除7 的余数就是星期,但如果是在
  164.   闰年又不到3 月份上述之和要减一天再除7星期数。余数为0时,为星期天。
  165. ******************************************************************************************/
  166. void Conver_week()
  167. {//century=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据
  168.   uchar temp1,temp2;
  169.   temp1=year;
  170.   if (century==0){temp1=temp1+100;}  //如果为21世纪,年份数加100
  171.   temp2=temp1/4;                     //所过闰年数只算1900年之后的
  172.   temp2=temp1+temp2;
  173.   temp2=temp2%7;                     //为节省资源,先进行一次取余,避免数大于255
  174.   temp2=temp2+day+table_week[month-1];
  175.   if (year%0x4==0&&month<3)temp2-=1;
  176.   week=temp2%7;
  177. }


  178. /********************************LCD12864部分*****************************/
  179. /******************************************************************************
  180. 端口说明:EN_LCD12864:使能端锁存信号。RS_LCD12864:D/I 命令/数据寄存器选择端
  181.           RW_LCD12864:读写信号控制端. define LCD_Data P0
  182.           RS(D/I)=1,表示DB0-DB7显示数据; RS(D/I)=0,表示DB0-DB7显示指令数据
  183.           RW=1,E=1,数据被读到DB7-DB0;RW=0,E=1--0,数据被读到DB7-DB0;数据被
  184. 写到IR或DR。
  185. (定义数据端口为 LCD_Data为P0口)
  186.           RST_LCD12864复位端口,不接或接高电平,低电平会导致复位
  187. 函数名称:void Lcd12864_BusyChk()
  188. 函数功能:忙检测,若忙则等待,最长等待时间为60MS(此判忙函数经过仿真已OK)
  189. 入口参数:无
  190. 出口参数:无
  191. ***********************************************************************/
  192. void Lcd12864_BusyChk()
  193. {
  194.       LCD12864_Databus=0x00;
  195. EN_LCD12864=0;
  196. RS_LCD12864=0;
  197. RW_LCD12864=1;
  198. EN_LCD12864=1;
  199.       while(LCD12864_Databus&0x80);  //判断P0.7口
  200. _nop_();
  201. EN_LCD12864=0;
  202. }

  203. /**********************************************************************
  204. * 函数名称:  void set_xy(unsigned char x,unsigned char y)
  205.                (仿真时的函数,已OK)
  206. * 功能描述:  设置显示位置! X,Y分别代表横纵坐标!
  207. * 输入参数?: unsigned char x,unsigned char y
  208. *输出参数:  无??
  209. *参数名称:? ?//列地址赋值,?x取值0----64,页面地址赋值,y取值0----8
  210. ***********************************************************************/

  211. /*void set_xy(unsigned char x,unsigned char y)
  212. {
  213. if (x>=64)
  214. {CS1=1;CS2=0;}              //选择右半屏
  215. else
  216. {CS1=0;CS2=1;}             //选择左半屏
  217. Lcd12864_BusyChk();
  218. RS_LCD12864=0;
  219. RW_LCD12864=0;
  220. LCD12864_Databus=0x40|x; //列地址赋值,x取值0----64
  221. EN_LCD12864=1;
  222. EN_LCD12864=0;
  223. Lcd12864_BusyChk();
  224. RS_LCD12864=0;
  225. RW_LCD12864=0;
  226. LCD12864_Databus=0xb8|y;   //页面地址赋值,y取值0----8
  227. EN_LCD12864=1;
  228. EN_LCD12864=0;
  229. LCD12864_Databus=0xff;
  230. }*/

  231. /**********************************************************************
  232. * 函数名称:  void set_xy(unsigned char x,unsigned char y)
  233.                (实物时的函数,已OK)
  234. * 功能描述:  设置显示位置! X,Y分别代表横纵坐标!
  235. * 输入参数?: unsigned char x,unsigned char y
  236. *输出参数:  无??
  237. *参数名称:? ?//列地址赋值,?x取值0----64,页面地址赋值,y取值0----8
  238. ***********************************************************************/





  239. /***************************************************************************************
  240. 函数名称:void LCD12864_DispYanYueRi(fb)
  241. 函数功能:设置日期的时候,选中的参数可以反白显示,右屏第一行显示程序,
  242. 由which决定第几个参数黑显,如which==1时,年份黑显.
  243. 入口参数:无
  244. 出口参数:无
  245. ****************************************************************************************/

  246. void LCD12864_DispYanYueRi(fb)              //显示年月日
  247. {
  248.   if(century)    //如果世纪为1
  249.   {
  250.        Lcd12864_DispChar(0,0,1,0);    //则第1行第1列显示’1”
  251.        Lcd12864_DispChar(1,0,9,0);   //则第1行第2列显示’9”
  252.   }
  253.   else
  254.   {
  255.       Lcd12864_DispChar(0,0,2,0);   //则第1行第1列显示’2”
  256.       Lcd12864_DispChar(1,0,0,0);  //则第1行第2列显示’0”
  257.   }
  258.      Lcd12864_DispChar(2,0,year/10,fb);  //第1行第3列显示年十位数
  259.      Lcd12864_DispChar(3,0,year%10,fb); //第1行第4列显示年个位数
  260.      Lcd12864_DispChar(4,0,11,0);                   //第1行第5列显示第11个数据”-”
  261.      Lcd12864_DispChar(5,0,month/10,fb);   //第1行第6列显示月十位数
  262.      Lcd12864_DispChar(6,0,month%10,fb); //第1行第7列显示月个位数
  263.      Lcd12864_DispChar(7,0,11,0);                        //第1行第8列显示第11个数据”-”                  
  264.      Lcd12864_DispChar(8,0,day/10,fb);   //第1行第9列显示日十位数
  265.      Lcd12864_DispChar(9,0,day%10,fb);  //第1行第10列显示日个位数
  266. }

  267. /******************************************************************************
  268. 函数名称:void LCD12864_DispShiFenMiao(fb)    显示时分秒
  269. 函数功能:设置时间的时候,选中的参数可以反白显示,右屏第二行显示程序,
  270. 由which决定第几个参数黑显,如which==1时,年份黑显.
  271. 入口参数:无
  272. 出口参数:无
  273. ***********************************************************************/
  274. void LCD12864_DispShiFenMiao(fb)
  275. {
  276.       Lcd12864_DispDaShuZi(0,2,hour/10,fb);    //第2行第1列显示小时十位数
  277.       Lcd12864_DispDaShuZi(2,2,hour%10,fb);  //第2行第3列显示小时个位数
  278.   if(sec%2==0)                          //如果秒为奇数则显示冒号,否则显示空
  279. Lcd12864_DispDaShuZi(4,2,10,0);    //第2行第4列第10个大数字为显示冒号,不反白
  280.   else
  281. Lcd12864_DispDaShuZi(4,2,11,0);   //第2行第4列第11个大数字为显示空,不反白
  282.       Lcd12864_DispDaShuZi(6,2,min/10,fb);  //第2行第6列显示分钟的十位数

  283.       Lcd12864_DispDaShuZi(8,2,min%10,fb); //第2行第8列显示分钟的个位数
  284.   if(sec%2==0)
  285. Lcd12864_DispDaShuZi(10,2,10,0);      //第2行第10列第10个大数字为显示冒号,不反白
  286.   else
  287. Lcd12864_DispDaShuZi(10,2,11,0);      //第2行第10列第11个大数字为显示空,不反白
  288. Lcd12864_DispDaShuZi(12,2,sec/10,fb);  //第2行第10列显示秒钟的十位数
  289.       Lcd12864_DispDaShuZi(14,2,sec%10,fb); //显示秒钟
  290. }

  291. /******************************************************************************
  292. 函数名称:void LCD12864_DispWeek(fb)    显示  周
  293. 函数功能:设置时间的时候,选中的参数可以反白显示,右屏第一行显示程序,
  294. 由which决定第几个参数黑显,如which==1时,年份黑显.
  295. 入口参数:无
  296. 出口参数:无
  297. *******************************************************************************/

  298. void LCD12864_DispWeek()
  299. {
  300.   uchar temp;

  301.   Lcd12864_DispWord(12,0,27,0);            //第1行第13列第27个汉字为显示“周”字
  302.   Conver_week();                          //调用星期阳历数据
  303.   if(week)
  304. temp=week;                      //赋week值为1----6,用来显示“一”----“六”
  305.   else
  306. week=26;                          //赋week值为0时,赋值26用来显示“日”
  307. Lcd12864_DispWord(14,0,week,0);   //第1行第14列第26个汉字为显示“日”   
  308. //verify_time();                     //此函数加上才能得到十二生肖后的农历日期
  309. ReadTime_DS1302();
  310.         GetTime_DS1302();

  311.        Conversion(century,year,month,day); //得到农历日期

  312.   if(c_moon)
  313. temp=year_moon%12+12;       //如果是19世纪,则可直接得出年的属性
  314.   else   
  315. temp=(year_moon+100)%12+12; //农历年也过了世纪,则农历年加100再求属性
  316.         Lcd12864_DispWord(0,6,temp,1); // 第7行第1列  显示十二生肖属性
  317. }

  318. /******************************************************************************
  319. 函数名称:void LCD12864_DispNongLiRiQi(fb)    显示  农历日期
  320. 函数功能:第4行农历显示
  321. 由which决定第几个参数黑显,如which==1时,年份黑显.
  322. 入口参数:无
  323. 出口参数:无
  324. *******************************************************************************/

  325. void LCD12864_DispNongLiRiQi()
  326. {
  327.   uchar temp1,temp2;
  328. //  verify_time();
  329.   Conversion(century,year,month,day);   //得到农历日期,世纪年月日
  330.   temp1=month_moon/10;
  331.   temp2=month_moon%10;
  332. //月份高位为0,低位为1,则月份前位显"正",后位显示“月”字
  333.   if(temp1==0&&temp2==1)  //如果农历日期,月的十位为0,个位为1,则为正月
  334.   {
  335.       Lcd12864_DispWord(2,6,39,0);  //第7行第3列  显示”正”字
  336. Lcd12864_DispWord(4,6,25,0);  //第7行第5列  显示”月”字
  337. }
  338. //月份高位为0,低位都大于等于2,则月份高位显月份,后位显月。      
  339.   else if (temp1==0&&temp2>=2)
  340.   {
  341.       Lcd12864_DispWord(2,6,temp2,0);//第7行第3列  显示月份
  342. Lcd12864_DispWord(4,6,25,0);   //第7行第5列  显示”月”字
  343.   }

  344. //月份高位为1,低位为0,则月份高位显“十”,后位显月。
  345.   else if (temp1==1&&temp2==0)
  346.   {
  347.       Lcd12864_DispWord(2,6,0,0);  //第7行第3列  显示”十”字
  348. Lcd12864_DispWord(4,6,25,0); //第7行第5列  显示”月”字
  349.   }

  350. //月份高位为1,低位为1,则月份高位显“冬”,后位显月。
  351.   else if (temp1==1&&temp2==1)
  352.   {
  353.       Lcd12864_DispWord(2,6,29,0);    //第7行第3列  显示”冬”字
  354. Lcd12864_DispWord(4,6,25,0);         //第7行第5列  显示”月”字
  355.   }
  356.   else
  357. {
  358. Lcd12864_DispWord(2,6,30,0);  //第7行第3列  显示”腊”字
  359. Lcd12864_DispWord(4,6,25,0); //第7行第5列  显示”月”字
  360.   }

  361.   temp1=day_moon/10;
  362.   temp2=day_moon%10;

  363.   switch (temp1)
  364. {      //日期高位为0,则前位显“初”
  365. case 0:  Lcd12864_DispWord(6,6,10,0);    //第7行第7列  显示”初”字
  366. Lcd12864_DispWord(8,6,temp2,0);//第7行第9列  显示低位字
  367. break;

  368.         //日期高位为1且低位不为0,则前位显“十”
  369. case 1:  if(temp2)
  370.   {
  371. Lcd12864_DispWord(6,6,0,0);      //第7行第7列  显示”十”字
  372. Lcd12864_DispWord(8,6,temp2,0); //第7行第9列  显示低位农历月份
  373. break;
  374. }
  375.          else   //日期高位为1且低位为0,则显“初十”
  376. {
  377. Lcd12864_DispWord(6,6,10,0);  //第7行第7列  显示”初”字
  378. Lcd12864_DispWord(8,6,0,0);  //第7行第9列  显示”十”字
  379. break;
  380. }
  381. //日期高位为2,则前位显“廿”
  382. case 2:  Lcd12864_DispWord(6,6,11,0); //第7行第7列  显示”"廿"字
  383. Lcd12864_DispWord(8,6,temp2,0);     //第7行第9列  显示低位农历月份
  384. break;

  385. //日期高位为3,则前位显“三”,低位显“十”
  386. case 3:  Lcd12864_DispWord(6,6,3,0);      //第7行第7列  显示”三”字
  387. Lcd12864_DispWord(6,6,temp2,0); //第7行第9列  显示低位农历月份
  388. break;
  389.     }
  390. }

  391. /*主程序*/
  392. void main(void)
  393. {
  394.     bl=0;
  395.     lcd12864_Init();                  //液晶初始化,此函数只起清屏的作用
  396.     century=0;                       //对世纪赋初值
  397.     Conversion(century,year,month,day);
  398.         DS1302_flag=Read_DS1302(0xc0); //读取首地址中的值,0xc0为DS1302RAM的首地址,
  399.                                   //偶数为写,奇数读
  400.     if(DS1302_flag==0)
  401.         {
  402.        Init_DS1302();          //时间初始化,起决于当前显示的时间
  403.        Write_DS1302(0xc0,1);  
  404.     }
  405.     while(1)
  406.     {
  407.         ReadTime_DS1302();        //读出时钟数据
  408.             GetTime_DS1302(); //将BCD时钟数据转换为可以计算的HEX数据
  409.                 GetTemp();
  410.         Lcd12864_DispTemp();
  411.         KeyScan();
  412.         if(setflag==0)
  413.                 {
  414.                
  415.         Lcd12864_DispTime(); //这里调用显示时间程序
  416.            
  417.                 }
  418.     }
  419. }
复制代码

所有资料51hei附件下载:
Keil代码与Proteus8.8仿真dsn文件下载: 仿真代码.7z (127.31 KB, 下载次数: 189)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1047454 发表于 2022-11-22 22:58 | 显示全部楼层
这么好的东东怎么没人顶呀,我正想学习呢,请问楼主用的屏带中文字库的吗?看仿真好像不带哟。谢谢楼主无私奉献!
回复

使用道具 举报

ID:92553 发表于 2022-12-4 15:32 | 显示全部楼层
要是能用在24064屏就好了,因为我手头就一个24064的屏
回复

使用道具 举报

ID:81249 发表于 2022-12-4 20:08 | 显示全部楼层
非常好,还没有仔细看,非常精炼,我写的没带万年历还有近4K字节,要借鉴一下
回复

使用道具 举报

ID:401598 发表于 2022-12-12 09:26 | 显示全部楼层
谢谢分享万年历。
回复

使用道具 举报

ID:46220 发表于 2022-12-18 09:30 | 显示全部楼层
谢谢分享,已经制作成功,稍微作了下改动,原来秒的两点是显示1秒灭1秒,加了定时器大约500毫秒亮500毫秒灭,然后把小时的十位在是0的时候不显示
51hei图片_20221218092339.jpg
51hei图片_20221218092349.jpg
51hei图片_20221218093016.jpg
回复

使用道具 举报

ID:92553 发表于 2022-12-20 14:23 | 显示全部楼层
niehaitao 发表于 2022-12-18 09:30
谢谢分享,已经制作成功,稍微作了下改动,原来秒的两点是显示1秒灭1秒,加了定时器大约500毫秒亮500毫秒灭 ...

12864带不带字库
回复

使用道具 举报

ID:46220 发表于 2022-12-20 21:38 来自手机 | 显示全部楼层
紫气东来 发表于 2022-12-20 14:23
12864带不带字库

不带字库的,程序里面有自建的字库文件
回复

使用道具 举报

ID:88256 发表于 2022-12-25 17:25 | 显示全部楼层
紫气东来 发表于 2022-12-4 15:32
要是能用在24064屏就好了,因为我手头就一个24064的屏

你会让24064显示就可以自己改显示部分啊,或者搜索一下,比如这个显示
回复

使用道具 举报

ID:877406 发表于 2023-2-7 11:16 | 显示全部楼层
hchi2006 发表于 2022-11-22 22:58
这么好的东东怎么没人顶呀,我正想学习呢,请问楼主用的屏带中文字库的吗?看仿真好像不带哟。谢谢楼主无私 ...

用的不带字库屏
回复

使用道具 举报

ID:894868 发表于 2023-2-10 15:09 | 显示全部楼层
要对作者支持鼓励··谢谢分享
回复

使用道具 举报

ID:824664 发表于 2023-3-12 23:41 | 显示全部楼层
谢谢分享,制作精良,外观漂亮。
回复

使用道具 举报

ID:1062292 发表于 2023-3-17 21:30 | 显示全部楼层
太厉害了,小白仰慕
回复

使用道具 举报

ID:707395 发表于 2023-4-17 11:29 | 显示全部楼层

谢谢分享,制作精良,外观漂亮。
回复

使用道具 举报

ID:529213 发表于 2023-5-17 16:59 来自手机 | 显示全部楼层
请问各位大佬,1302的晶振焊在哪里,能发个电路图吗?非常感谢
回复

使用道具 举报

ID:529213 发表于 2023-6-1 23:27 来自手机 | 显示全部楼层
按键调整减貌似有问题,另外就是调秒钟时,秒钟数字乱跳,还有闹钟无法调整
IMG_20230601_231400.jpg
回复

使用道具 举报

ID:529213 发表于 2023-6-2 06:47 来自手机 | 显示全部楼层
niehaitao 发表于 2022-12-18 09:30
谢谢分享,已经制作成功,稍微作了下改动,原来秒的两点是显示1秒灭1秒,加了定时器大约500毫秒亮500毫秒灭 ...

请教大佬,我做出来后,按键减少调整不了,并且秒钟的调整有问题,请问大佬怎么解决的,谢谢。如果解决了,能共享一下程序吗?感激不尽
回复

使用道具 举报

ID:46220 发表于 2023-6-2 15:30 | 显示全部楼层
hnxtlxx 发表于 2023-6-2 06:47
请教大佬,我做出来后,按键减少调整不了,并且秒钟的调整有问题,请问大佬怎么解决的,谢谢。如果解决了 ...

朋友,我是业余玩玩的,这有半年没弄过了,不记得当时改了那些地方,压缩上传我也不会弄,我试试把所有文件贴在这里看行不行
回复

使用道具 举报

ID:46220 发表于 2023-6-2 15:31 | 显示全部楼层
#include<reg51.h>                                 //用89C52单片机
#include<intrins.h>
#include<18B20.h>                 //18B20头文件
#include<DS3231.h>                 //DS1302头文件
#include<nongli.h>                  //农历转换头文件
#include<ziku.h>                  //字库头文件
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
/******LCD12864通讯端口******/
sbit RS_LCD12864=P2^7;     //定义选择显示类型, 定义数据或指令,1=数据,0=指令
sbit RW_LCD12864=P2^6;    //定义读写信号控制端, 定义读或写??1=读,??0=写
sbit EN_LCD12864=P2^5;    //定义数据锁存信号, 定义使能操作, 1=能,??0=否
#define LCD12864_Databus P0   //定义数据端
#define sc0 0       
#define sc1 1
unsigned char fb;         

sbit CS1=P2^4;    //定义选择芯片右半屏信号
sbit CS2=P2^3;    //定义选择芯片左半屏信号

unsigned char shan_count; //:号闪烁计时变量
unsigned char shan_js;    //校时闪烁计时变量
bit flag;                //校时闪烁标志位

void Timer0Init();                 //声明定时器初始化函数           10毫秒

/********************************LCD12864部分*****************************/
/******************************************************************************
端口说明:EN_LCD12864:使能端锁存信号。RS_LCD12864:D/I 命令/数据寄存器选择端
          RW_LCD12864:读写信号控制端. define LCD_Data P0
          RS(D/I)=1,表示DB0-DB7显示数据; RS(D/I)=0,表示DB0-DB7显示指令数据
          RW=1,E=1,数据被读到DB7-DB0;RW=0,E=1--0,数据被读到DB7-DB0;数据被
写到IR或DR。
(定义数据端口为 LCD_Data为P0口)
          RST_LCD12864复位端口,不接或接高电平,低电平会导致复位
函数名称:void Lcd12864_BusyChk()
函数功能:忙检测,若忙则等待,最长等待时间为60MS(此判忙函数经过仿真已OK)
入口参数:无
出口参数:无
***********************************************************************/
void Lcd12864_BusyChk()                //忙检测,若忙则等待,最长等待时间为60MS
{
    LCD12864_Databus=0x00;
        EN_LCD12864=0;
        RS_LCD12864=0;
        RW_LCD12864=1;
        EN_LCD12864=1;
     while(LCD12864_Databus&0x80);  //判断P0.7口
        _nop_();
        EN_LCD12864=0;
}
/**********************************************************************
* 函数名称:  void set_xy(unsigned char x,unsigned char y)
               (实物时的函数,已OK)
* 功能描述:  设置显示位置! X,Y分别代表横纵坐标!
* 输入参数?: unsigned char x,unsigned char y
*输出参数:  无??
*参数名称:? ?//列地址赋值,?x取值0----64,页面地址赋值,y取值0----8
***********************************************************************/
void set_xy(unsigned char x,unsigned char y)        // 设置显示位置! X,Y分别代表横纵坐标!
{
        if (x>=64)
        {CS1=sc0;CS2=sc1;}              //选择右半屏
        else
        {CS1=sc1;CS2=sc0;}             //选择左半屏
        Lcd12864_BusyChk();
        RS_LCD12864=0;
        RW_LCD12864=0;
        LCD12864_Databus=0x40|x; //列地址赋值,x取值0----64
        EN_LCD12864=1;
        EN_LCD12864=0;
        Lcd12864_BusyChk();
        RS_LCD12864=0;
        RW_LCD12864=0;
        LCD12864_Databus=0xb8|y;   //页面地址赋值,y取值0----8
        EN_LCD12864=1;
        EN_LCD12864=0;
        LCD12864_Databus=0xff;
}
/*******************************************************************************
* 函数名称: void lw(uchar x,uchar y,uchar dd)
* 功能描述: 在指定的位置显示数据
* 输入参数?:(unsigned char x,unsigned char y,uchar dd)
*输出参数:  无??
?*******************************************************************************/
void Lcd12864_WriteData(unsigned char x,unsigned char y,unsigned char dd)         //在指定的位置显示数据
{
        set_xy(x,y);
        Lcd12864_BusyChk();
        RS_LCD12864=1;
        RW_LCD12864=0;
        LCD12864_Databus=dd;       //数据送显
        EN_LCD12864=1;
        EN_LCD12864=0;
        LCD12864_Databus=0xff;
}
/**********************************************************************
* 函数名称: void lcd12864_Init(void)(仿真时的函数,已仿真OK)
* 功能描述: 显示初始化
* 输入参数?:无
* 输出参数: 无??
***********************************************************************/
void lcd12864_Init(void)           //12864 显示初始化
{
        unsigned char x,y;
        RS_LCD12864=0;
        RW_LCD12864=0;
        EN_LCD12864=0;
        CS1=sc1;                  //选择左半屏显示
        LCD12864_Databus=0x3f;   //打开左半屏显示
        EN_LCD12864=1;
        EN_LCD12864=0;
        CS2=sc1;                  //选择右半屏显示
        LCD12864_Databus=0x3f;   //打开右半屏显示
        EN_LCD12864=1;
        EN_LCD12864=0;
        CS1=sc1;
        Lcd12864_BusyChk();
        RS_LCD12864=0;
        RW_LCD12864=0;
        LCD12864_Databus=0xc0;   //设置左半屏起始行,是第一行
        EN_LCD12864=1;
        EN_LCD12864=0;
        CS2=sc1;
        Lcd12864_BusyChk();
        RS_LCD12864=0;
        RW_LCD12864=0;
        LCD12864_Databus=0xc0;   //设置右半屏起始行,是第一行
        EN_LCD12864=1;
        EN_LCD12864=0;
        CS1=sc1;
        CS2=sc1;
        for (y=0;y<8;y++)
        {
                for (x=0;x<128;x++)
                Lcd12864_WriteData(x,y,0);   //全屏清零显示
        }
}
/**********************************************************************
* 函数名称: void Lcd12864_DispWord(uchar x,uchar y,uchar n,uchar fb)
* 功能描述:显示一个汉字,n代表字表里第n个字!fb==1:反白显示
* 输入参数?:(uchar x,uchar y,uchar n,uchar fb)
*输出参数:  无??
* 显示方式为先上半部第一列,再下半部第一列,然后上半部第二列...
?***********************************************************************/

void Lcd12864_DispWord(unsigned char x,unsigned char y,unsigned char n,unsigned char fb) //显示16X16汉字
{
  unsigned char i,dd;
  for (i=0;i<16;i++)
  {
    dd=hz[i+n*32];
    if (fb) dd=255-dd;
    Lcd12864_WriteData(x*8+i,y,dd);      //显示汉字的上半部分
    dd=hz[i+n*32+16];
    if (fb) dd=255-dd;
    Lcd12864_WriteData(x*8+i,y+1,dd);  //显示汉字的下半部分
  }
}
/**********************************************************************
* 函数名称:void Lcd12864_DispDaShuZi(uchar x,uchar y,uchar n,uchar fb)  
* 功能描述:显示一个大的数字,n代表字表里第n个数字!fb==1:反白显示
* 输入参数?:(uchar x,uchar y,uchar n,uchar fb)
* 输出参数:  无??
* 显示方式为先上半部第一列,再下半部第一列,然后上半部第二列...
?***********************************************************************/
void Lcd12864_DispDaShuZi(unsigned char x,unsigned char y,unsigned char n,unsigned char fb)    //显示一个大的数字16X32
{
  unsigned char i,dd;
  for (i=0;i<16;i++)
  {
    dd=dazi[i+n*64];
    if (fb) dd=255-dd;
        Lcd12864_WriteData(x*8+i,y,dd);                  
    dd=dazi[i+n*64+16];
    if (fb) dd=255-dd;
    Lcd12864_WriteData(x*8+i,y+1,dd);       //显示大数字的上半部分

    dd=dazi[i+n*64+32];
    if (fb) dd=255-dd;
    Lcd12864_WriteData(x*8+i,y+2,dd);                 
    dd=dazi[i+n*64+48];
    if (fb) dd=255-dd;
    Lcd12864_WriteData(x*8+i,y+3,dd);       //显示大数字的下半部分
  }
}

/**********************************************************************
* 函数名称: void Lcd12864_DispChar(uchar x,uchar y,uchar n,uchar fb)
* 功能描述: 显示一个数字,n代表字表里第n个数字!fb==1:反白显示
             X; 0-7列,共64列, y: 0-7页
* 功能描述:  显示年月日,温度的数字
* 输入参数?:(uchar x,uchar y,uchar n,uchar fb)
*输出参数:  无??
?***********************************************************************/
void Lcd12864_DispChar(unsigned char x,unsigned char y,unsigned char n,unsigned char fb)  //显示年月日,温度的数字/8X16数据
{
  unsigned char i,dd;
  for (i=0;i<8;i++)
  {
    dd=number[i+n*16];         //8X16,0-9,:,-, .等
    if (fb) dd=255-dd;
    Lcd12864_WriteData(x*8+i,y,dd);        //显示数字的上半部分
    dd=number[i+n*16+8];
    if (fb) dd=255-dd;
    Lcd12864_WriteData(x*8+i,y+1,dd);    //显示数字的下半部分
  }
}
/***************************************************************************************
函数名称:void LCD12864_DispYanYueRi(fb)
函数功能:设置日期的时候,选中的参数可以反白显示,右屏第一行显示程序,
由which决定第几个参数黑显,如which==1时,年份黑显.
入口参数:无
出口参数:无
****************************************************************************************/
void LCD12864_DispYanYueRi(fb)              //显示年月日
{
  if(century)    //如果世纪为1
  {
       Lcd12864_DispChar(2,0,1,0);    //第1行第3列显示世纪的十位’1”
       Lcd12864_DispChar(3,0,9,0);   //第1行第4列显示世纪的个位’9”
  }
  else
  {
      Lcd12864_DispChar(2,0,2,0);   //第1行第3列显示世纪的十位’2”
      Lcd12864_DispChar(3,0,0,0);  //第1行第4列显示世纪的个位’0”
  }
           if(disflag==4 && flag==0)  //校正年的时候年闪烁
         {
                 Lcd12864_DispChar(4,0,12,fb);  //第1行第5不显示年十位数
              Lcd12864_DispChar(5,0,12,fb); //第1行第6不显示年个位数
         }
         else
         {
                  Lcd12864_DispChar(4,0,year/10,fb);  //第1行第5显示年十位数
              Lcd12864_DispChar(5,0,year%10,fb); //第1行第6显示年个位数
         }

         Lcd12864_DispChar(6,0,11,0);                   //第1行第7显示第11个数据”-”

     if(disflag==5 && flag==0)  //校正月的时候月闪烁
         {
                  Lcd12864_DispChar(7,0,12,fb);   //第1行第8不显示月十位数
              Lcd12864_DispChar(8,0,12,fb); //第1行第9列不显示月个位数
         }
         else
         {
                  Lcd12864_DispChar(7,0,month/10,fb);   //第1行第8显示月十位数
              Lcd12864_DispChar(8,0,month%10,fb); //第1行第9列显示月个位数
         }
         
     Lcd12864_DispChar(9,0,11,0);                        //第1行第10列显示第11个数据”-”
         
         if(disflag==6 && flag==0)  //校正日期的时候日闪烁
         {
                 Lcd12864_DispChar(10,0,12,fb);   //第1行第11列不显示日十位数
             Lcd12864_DispChar(11,0,12,fb);  //第1行第12列不显示日个位数
         }
         else
         {
                  Lcd12864_DispChar(10,0,day/10,fb);   //第1行第11列显示日十位数
              Lcd12864_DispChar(11,0,day%10,fb);  //第1行第12列显示日个位数
         }                       
}

/******************************************************************************
函数名称:void LCD12864_DispShiFenMiao(fb)    显示时分秒
函数功能:设置时间的时候,选中的参数可以反白显示,右屏第二行显示程序,
由which决定第几个参数黑显,如which==1时,年份黑显.
入口参数:无
出口参数:无
***********************************************************************/
void LCD12864_DispShiFenMiao(fb)                  //显示时分秒
{
          if(disflag==1 && flag==0)  //时钟小时的时候小时闪烁
          {
                   Lcd12864_DispDaShuZi(0,2,11,fb);    //第3行第1/2列不显示小时十位数
               Lcd12864_DispDaShuZi(2,2,11,fb);  //第3行第3/4列不显示小时个位数
          }
          else
          {
                    if((hour/10)!=0)                        //10点到23点显示小时的十位
                  {
                              Lcd12864_DispDaShuZi(0,2,hour/10,fb);    //第3行第1/2列显示小时十位数
                              Lcd12864_DispDaShuZi(2,2,hour%10,fb);  //第3行第3/4列显示小时个位数
                  }
                  else                                          //0点至9点不显示小时的十位0
                  {
                                  Lcd12864_DispDaShuZi(0,2,11,fb);    //第3行第1/2列不显示小时十位数
                              Lcd12864_DispDaShuZi(2,2,hour%10,fb);  //第3行第3/4列显示小时个位数
                  }
          }
          
    if(shan_count >=10 && disflag==0)         //正常走时,如果shan_count>=10        ,冒号闪烁
    {
                Lcd12864_DispDaShuZi(4,2,10,0);       //第3行第5/6列第10个大数字为显示冒号,不反白
                Lcd12864_DispDaShuZi(10,2,10,0);      //第3行第11/12列第10个大数字为显示冒号,不反白
        }
        else                                  //大于0.5秒时两点不显示形成闪烁效果
        {
                Lcd12864_DispDaShuZi(4,2,11,0);       //第3行第5/6列第11个大数字为显示空,不反白
                Lcd12864_DispDaShuZi(10,2,11,0);      //第3行第11/12列第11个大数字为显示空,不反白
        }

    if(disflag==2 && flag==0)  //设置分的时候分闪烁
        {
                Lcd12864_DispDaShuZi(6,2,11,fb);  //第3行第7/8列不显示分钟的十位数
              Lcd12864_DispDaShuZi(8,2,11,fb); //第3行第9/10列不显示分钟的个位数
        }
        else
        {
                Lcd12864_DispDaShuZi(6,2,min/10,fb);  //第3行第7/8列显示分钟的十位数
              Lcd12864_DispDaShuZi(8,2,min%10,fb); //第3行第9/10列显示分钟的个位数
        }
      
            if(disflag==3 && flag==0)  //校时的时候秒闪烁
          {
                      Lcd12864_DispDaShuZi(12,2,11,fb);  //第3行第13/14列不显示秒钟的十位数
                      Lcd12864_DispDaShuZi(14,2,11,fb); //第3行第15/16列不显示秒钟的个位数
          }
          else
          {
                      Lcd12864_DispDaShuZi(12,2,sec/10,fb);  //第3行第13/14列显示秒钟的十位数
                      Lcd12864_DispDaShuZi(14,2,sec%10,fb); //第3行第15/16列显示秒钟的个位数
          }
          
}
/******************************************************************************
函数名称:void LCD12864_DispWeek(fb)    显示  周
函数功能:设置时间的时候,选中的参数可以反白显示,右屏第一行显示程序,
由which决定第几个参数黑显,如which==1时,年份黑显.
入口参数:无
出口参数:无
*******************************************************************************/
void LCD12864_DispWeek()                          //显示星期/周          生肖属性
{
          unsigned char temp;
          Lcd12864_DispWord(12,0,27,0);            //第1行第13列第27个汉字为显示“周”字
          Conver_week();                          //调用星期阳历数据
          if(week)
                temp=week;                      //赋week值为1----6,用来显示“一”----“六”
          else
                week=26;                          //赋week值为0时,赋值26用来显示“日”
        Lcd12864_DispWord(14,0,week,0);   //第1行第14列第26个汉字为显示“日”   

                read3231();                                           //读出DS3231的各个数据
        Conversion(century,year,month,day); //得到农历日期
   if(c_moon)                                         //century=0 为21世纪,c=1 为19世纪
        temp=year_moon%12+12;       //如果是19世纪,则可直接得出年的属性          加12是因为生肖在字库的第13个开始
  else   
        temp=(year_moon+100)%12+12; //农历年也过了世纪,则农历年加100再求属性 加12是因为生肖在字库的第13个开始
        Lcd12864_DispWord(0,0,temp,1);// 第1行第1列  显示十二生肖属性         1反显
}
/******************************************************************************
函数名称:void LCD12864_DispNongLiRiQi(fb)    显示  农历日期
函数功能:第4行农历显示
由which决定第几个参数黑显,如which==1时,年份黑显.
入口参数:无
出口参数:无
*******************************************************************************/
void LCD12864_DispNongLiRiQi()                  //显示农历日期
{
  unsigned char temp1,temp2;
//  verify_time();
  Conversion(century,year,month,day);   //得到农历日期,世纪/年/月/日
  temp1=month_moon/10;                          //农历月份高位   两位农历月份求模送显示
  temp2=month_moon%10;                          //农历月份低位   两位农历月份求模送显示
//月份高位为0,低位为1,则月份前位显"正",后位显示“月”字
  if(temp1==0&&temp2==1)  //如果农历日期,月的十位为0,个位为1,则为正月
  {
      Lcd12864_DispWord(0,6,39,0);  //第7行第1列  显示”正”字
          Lcd12864_DispWord(2,6,25,0);  //第7行第3列  显示”月”字
  }
//月份高位为0,低位都大于等于2,则月份高位显月份,后位显月。      
  else if (temp1==0&&temp2>=2)
  {
      Lcd12864_DispWord(0,6,temp2,0);//第7行第1列  显示月份
          Lcd12864_DispWord(2,6,25,0);   //第7行第3列  显示”月”字
  }
//月份高位为1,低位为0,则月份高位显“十”,后位显月。
  else if (temp1==1&&temp2==0)
  {
      Lcd12864_DispWord(0,6,0,0);  //第7行第1列  显示”十”字
          Lcd12864_DispWord(2,6,25,0); //第7行第3列  显示”月”字
  }  
//月份高位为1,低位为1,则月份高位显“冬”,后位显月。
  else if (temp1==1&&temp2==1)
  {
      Lcd12864_DispWord(0,6,29,0);    //第7行第1列  显示”冬”字
            Lcd12864_DispWord(2,6,25,0);         //第7行第3列  显示”月”字
  }
  else
  {
          Lcd12864_DispWord(0,6,30,0);  //第7行第1列  显示”腊”字
          Lcd12864_DispWord(2,6,25,0); //第7行第3列  显示”月”字
  }
                  temp1=day_moon/10;                //农历日期高位         两位农历日期求模送显示
                  temp2=day_moon%10;                 //农历日期地位          两位农历日期求余送显示

  switch (temp1)
  {      //日期高位为0,则前位显“初”
                case 0:  Lcd12864_DispWord(4,6,10,0);    //第7行第5列  显示”初”字
                                 Lcd12864_DispWord(6,6,temp2,0);//第7行第7列  显示低位字
                                 break;
        //日期高位为1且低位不为0,则前位显“十”
                case 1:  if(temp2)
                                  {
                                        Lcd12864_DispWord(4,6,0,0);      //第7行第5列  显示”十”字
                                        Lcd12864_DispWord(6,6,temp2,0); //第7行第7列  显示低位农历月份
                                        break;
                                }
                         else   //日期高位为1且低位为0,则显“初十”
                                {
                                        Lcd12864_DispWord(4,6,10,0);  //第7行第5列  显示”初”字
                                        Lcd12864_DispWord(6,6,0,0);  //第7行第7列  显示”十”字
                                        break;
                                }
                //日期高位为2,则前位显“廿”
                case 2:  Lcd12864_DispWord(4,6,11,0); //第7行第5列  显示”"廿"字
                                 Lcd12864_DispWord(6,6,temp2,0);     //第7行第7列  显示低位农历月份
                                 break;
                //日期高位为3,则前位显“三”,低位显“十”
                case 3:  Lcd12864_DispWord(4,6,3,0);      //第7行第5列  显示”三”字
                                 Lcd12864_DispWord(6,6,temp2,0); //第7行第7列  显示低位农历月份
                                 break;
    }
}

void Lcd12864_DispTemp()                //温度显示程序          正显
{
        if(temp_flag==1)//温度为正数标志
        {
                if((t_b==0)&(t_s==0))//10度以下时不显示十位
                {       
                        Lcd12864_DispWord(8,6,40,0);                 //第7行第9列10列固定显示温度"!"图标,16X16数据
                        Lcd12864_DispChar(10,6,t_g,0);       //第7行第11列/显示个位数据         8*16数据
                        Lcd12864_DispChar(11,6,13,0);                 //第7行第12列/显示数据为“.”字符           8*16数据
                        Lcd12864_DispChar(12,6,t_x,0);       //第7行第13列/显示小数位  8*16数据
                        Lcd12864_DispChar(13,6,12,0);        //第7行第14列/(12)不显示  8*16数据    第四位/1反白0正显示       
                }
                else
                {
                        Lcd12864_DispWord(8,6,40,0);                 //第7行第9列10列固定显示温度"!"图标,16X16数据
                        Lcd12864_DispChar(10,6,t_s,0);       //第7行第11列/显示十位数据         8*16数据
                        Lcd12864_DispChar(11,6,t_g,0);      //第7行第12列/显示个位数据         8*16数据
                        Lcd12864_DispChar(12,6,13,0);                 //第7行第13列/显示数据为“.”字符           8*16数据
                        Lcd12864_DispChar(13,6,t_x,0);       //第7行第14列/显示小数位  8*16数据                               
                }
        }
/*
        if(temp_flag==0)//温度为负数时
        {
                        Lcd12864_DispWord(8,6,40,0);                 //第7行第9列10列固定显示温度"!"图标,16X16数据
                         Lcd12864_DispChar(10,6,11,0);         //第7行第11列/显示-负号             8*16数据
                        Lcd12864_DispChar(11,6,f_g,0);         //第7行第12列/显示负温度个位数据                    8*16数据
                        Lcd12864_DispChar(12,6,13,0);                  //第7行第13列/显示数据为“.”字符           8*16数据
                        Lcd12864_DispChar(13,6,f_x,0);         //第7行第14列/显示负温度小数位数据             8*16数据       
        }
*/       
        Lcd12864_DispWord(14,6,28,0);                 //第7行第15列16列固定显示温度"℃"图标,16X16数据
}

/******************************************************************************
函数名称:void Lcd12864_DispTime()    显示  日期与时钟
函数功能://第一行显示年月日8X16数字,最后为周
          //第二行显示时分秒,大数字
          //第三行显示农历,温度
入口参数:无
出口参数:无
*******************************************************************************/
void Lcd12864_DispTime()                         //显示日期与时钟子程序
{  
   LCD12864_DispYanYueRi(0);        //第一行显示年月日
   LCD12864_DispShiFenMiao(0);     //第二行显示时分秒,大数字
   LCD12864_DispWeek();           //第一行显示星期         生肖
   LCD12864_DispNongLiRiQi();     //第三行显示农历
}
          
/*主程序*/
void main(void)
{
    Timer0Init();                //10毫秒@11.0592MHz
    lcd12864_Init();    //液晶初始化,此函数只起清屏的作用
    century=0;          //对世纪赋初值
    while(1)
    {
                read3231();                     //读出DS3231的各个数据
                GetTemp();                     //读取温度函数
                Lcd12864_DispTemp(); //温度显示处理函数                        
            KEY();                     //按键程序
        Lcd12864_DispTime(); //这里调用显示时间程序                          
    }
}
void Timer0Init(void)                //10毫秒@11.0592MHz
{
        TMOD=0x01;//设定定时器工作方式1,定时器定时50毫秒
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;//开总中断
        ET0=1;//允许定时器0中断
        TR0 = 1;                //定时器0开始计时
}
/**************定时器0 中断函数******************/

void timer0() interrupt 1
{
        TH0=(65536-50000)/256;                                  //1次中断50毫秒
        TL0=(65536-50000)%256;
        shan_count++;                 //时钟:号闪烁计数
        shan_js++;                   //校时闪烁计数
        if(shan_count == 20)        //:号闪烁,亮0.5秒,灭0.5秒;闪烁频率可调。
        {
                shan_count = 0;
                b1++;                         //10秒延时b1自加
        }
        if(b1>10)                  //10秒延时
        {
                b1=0;                 //10秒延时b1清零
                disflag=0;                //设置标志位清零
        }                        
        if(shan_js == 10)  //250ms闪烁一次
        {
                shan_js = 0;
                flag = !flag;         //250毫秒标志位
        }
}
回复

使用道具 举报

ID:46220 发表于 2023-6-2 15:31 | 显示全部楼层
#ifndef __DS3231_H__
#define __DS3231_H__

#define uchar unsigned char
#define uint unsigned int
#include <intrins.h>

// IO口模拟I2C通信
sbit DS3231_SCL=P3^6;        //   ds32321模拟I2C数据传送位SDA
sbit DS3231_SDA=P3^7;        //   模拟I2C时钟控制位SCL
bit        ack;                //应答标志位
/********************************************************************************************************
**         DS3231常数定义
********************************************************************************************************/
#define DS3231_WriteAddress 0xD0    //器件写地址
#define DS3231_ReadAddress  0xD1    //器件读地址
#define DS3231_SECOND       0x00    //秒
#define DS3231_MINUTE       0x01    //分
#define DS3231_HOUR         0x02    //时
#define DS3231_WEEK         0x03    //星期
#define DS3231_DAY          0x04    //日
#define DS3231_MONTH        0x05    //月
#define DS3231_YEAR         0x06    //年

#define DS3231_TEMPERATUREH 0x11    //温度寄存器高字节(8位)        整数部分
#define DS3231_TEMPERATUREL 0x12    //温度寄存器低字节(低2位) 小数部分

#define NACK    1
#define ACK     0

char hour,min,sec,year,month,day,date,week;        //定义读取3231的时分秒年月日星期变量
char Tem_L,Tem_H;                                                                   //定义读取3231的温度高字节整数部分和低字节小数部分变量
unsigned int TH3231;

//unsigned char nians,niang,yues,yueg,ris,rig,shis,shig,fens,feng,miaos,miaog;                   //定义分解变量

///***************按键端口************///
sbit KEY1=  P1^1;                  //调整
sbit KEY2=  P1^2;                  //++
sbit KEY3=  P1^3;                  //--
sbit KEY4=  P1^4;                  //退出

unsigned char  a1,a2,a3,a4;         //按键消抖用
unsigned char  disflag=0,b1;        //时间调整相关//b1用来计数进入设置到10秒后如果没有按键按下就返回时间显示

void        Delay5US()           //@12.000MHz           延时5us
{
   _nop_(); //_nop_();        _nop_();_nop_(); //1T单片机用4个nop,12T用1个nop
}
/*1T 12M 延时函数 Delay_us(1)时大约1us*/
void Delay_us(uint us)
{
  while(us--)
  {
          _nop_();
          _nop_();
  }
}
/**********************************************
//IIC Start         IIC总线产生起始信号函数
**********************************************/
void IIC_Start()
{   
   DS3231_SDA = 1;                 //拉高时钟线
   Delay_us(1);
   DS3231_SCL = 1;                 //拉高数据线
   Delay_us(5);  //起始条件建立时间大于4.7us,延时
   DS3231_SDA = 0;                 //在时钟线为高电平时,拉低数据线,产生起始信号         发送起始信号
   Delay_us(1);         
   DS3231_SCL = 0;                 //钳住I2C总线,准备发送或接收数据
   Delay_us(1);
}

/*IIC_Stop  IIC总线产生停止信号函数*/
void IIC_Stop()
{
        DS3231_SDA = 0; //拉低数据线
        Delay_us(1);
  DS3231_SCL = 0; //拉低数据线
  Delay_us(5);    //起始条件建立时间大于4.7us,延时
  DS3231_SCL = 1; //时钟时线为高电平时,拉高数据线,产生停止信号
        Delay_us(1);
  DS3231_SDA = 1; //时钟时线为高电平时,拉高数据线,产生停止信号
}


unsigned char        BCD2HEX(unsigned char val)                 //BCD转换为Byte
{
        return        ((val>>4)*10)+(val&0x0f);
}

unsigned char        HEX2BCD(unsigned char val)                 //B码转换为BCD码
{
        return        (((val%100)/10)<<4)|(val%10);
}

/*******************************************************************
                  字节数据发送函数              
函数原型:     void   SendByte(uchar Dat);
功能:      将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
           此状态位进行操作.(不应答或非应答都使ack=0)
           ack=1        发送数据正常,
           ack=0        被控器无应答或损坏。
********************************************************************/
void SendByte(unsigned char c)
{
    unsigned char BitCnt;
   
    for(BitCnt=0;BitCnt<8;BitCnt++)         //要传送的数据长度为8位
    {
        if((c<<BitCnt)&0x80)
            DS3231_SDA=1;                          //判断发送位
        else
            DS3231_SDA=0;
                Delay_us(1);             
        DS3231_SCL=1;                            //置时钟线为高,通知被控器开始接收数据位
        Delay_us(5);                       //保证时钟高电平周期大于4μs   
        DS3231_SCL=0;
    }
    DS3231_SDA=1;                                  //8位发送完后释放数据线,准备接收应答位
        Delay_us(1);
    DS3231_SCL=1;
    Delay_us(3);
    if(DS3231_SDA==1)
        ack=0;   
    else
        ack=1;                              //判断是否接收到应答信号
    DS3231_SCL=0;
    Delay_us(3);
}          
/*用来接收从器件传来的数据,并判断总线错误(不发应答信号),发完后请用应答函数应答从机*/
unsigned char RcvByte()
{
   unsigned char retc;
   unsigned char BitCnt;

   retc=0;
   DS3231_SDA=1;                           //置数据线为输入方式
   for(BitCnt=0;BitCnt<8;BitCnt++)
   {
                   Delay_us(1);
        DS3231_SCL=0;                //置时钟线为低,准备接收数据位      
        Delay_us(5);                 //时钟低电平周期大于4.7μs                       
        DS3231_SCL=1;                //置时钟线为高使数据线上数据有效
        Delay_us(3);
        retc=retc<<1;
        if(DS3231_SDA==1)
            retc=retc+1;            //读数据位,接收的数据位放入retc中
        Delay_us(2);
   }
   DS3231_SCL=0;
   Delay_us(1);
   return(retc);
}                            
/*主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)*/
void Ack_I2C(bit a)
{
        if(a==0)DS3231_SDA=0;   //在此发出应答或非应答信号
    else(DS3231_SDA=1);  
    Delay_us(3);
    DS3231_SCL=1;                     
    Delay_us(5);            //时钟低电平周期大于4us   
    DS3231_SCL=0;           //清时钟线,钳住I2C总线以便继续接收
    Delay_us(2);   
}                                            

unsigned char write_byte(unsigned char addr, unsigned char write_data)                  //DS3231写一字节数据
{
    IIC_Start();
    SendByte(DS3231_WriteAddress);                  //器件写地址0xD0
    if (ack == 0)
        return 0;
   
    SendByte(addr);   
    if (ack == 0)
        return 0;
   
    SendByte(write_data);
    if (ack == 0)
        return 0;
   
    IIC_Stop();
    Delay_us(10);     
    return 1;
}                                          

unsigned char read_current()                                          //DS3231读一字节数据
{
    unsigned char read_data;
    IIC_Start();
    SendByte(DS3231_ReadAddress);                                   //器件读地址0xD1
    if(ack==0)
        return(0);             
    read_data = RcvByte();
    Ack_I2C(1);
    IIC_Stop();
    return read_data;
}                                                 

unsigned char read_random(unsigned char random_addr)                //DS3231读时钟数据
{
    unsigned char Tmp;
        IIC_Start();
    SendByte(DS3231_WriteAddress);                                        //器件写地址0xD0
    if(ack==0)
        return(0);            
    SendByte(random_addr);
    if(ack==0)
        return(0);
        Tmp=read_current();
        if(random_addr==DS3231_HOUR)
                Tmp&=0x3f;
                                            
    return(BCD2HEX(Tmp));//都转10进制输出  //BCD转换为Byte
}

///**********************************读温度函数***********************************///
unsigned char read_random1(unsigned char random_addr)  //这个是读温度函数
{
    unsigned char Tmp;
        write_byte(0x0e,0x20);//0x0e寄存器的CONV位置1开启温度转换,要这句,温度实时刷新,这句不要,温度要64s才刷新1次
        IIC_Start();
    SendByte(DS3231_WriteAddress);
    if(ack==0)
        return(0);            
    SendByte(random_addr);
    if(ack==0)
        return(0);
        Tmp=read_current();
        return Tmp;
}
                                  
///************************DS3231时间调整和读出各项数据***************************************************////
void ModifyTime(unsigned char address,unsigned char num)                  //DS3231写时钟数据
{
    unsigned char temp=0;
           if(address>6 && address <0) return;
    temp=HEX2BCD(num);
        write_byte(address,temp);
}
void read3231()                                           //读出DS3231的各个数据
{
         year = read_random(DS3231_YEAR);                  //读出年数据
         month = read_random(DS3231_MONTH);                  //读出月数据
         day = read_random(DS3231_DAY);                           //读出日数据
         week = read_random(DS3231_WEEK);                   //读出星期数据
         hour = read_random(DS3231_HOUR);                   //读出小时数据
         min = read_random(DS3231_MINUTE) ;           //读出分钟数据
         sec = read_random(DS3231_SECOND);           //读出秒数据
         
        Tem_H=read_random1(DS3231_TEMPERATUREH);                     //读出温度 高字节 整数部分
        Tem_L=((read_random1(DS3231_TEMPERATUREL))>>6)*0.25*100;         //读出温度 低字节 小数部分
/*       
        nians=year/10;niang=year%10;
        yues=month/10;yueg=month%10;
        ris=day/10;rig=day%10;
        shis=hour/10;shig=hour%10;
        fens=min/10;feng=min%10;
        miaos=sec/10;miaog=sec%10;
*/       
}
void Set(unsigned char sel,unsigned char selby)            //年月日时分秒限定调整范围并写入时钟数据
{
    unsigned char address;
        char item;
    unsigned char max,min;   
    if(sel==1)  {address=DS3231_HOUR; max=23;min=0;}    //小时
        if(sel==2)  {address=DS3231_MINUTE; max=59;min=0;}    //分钟
    if(sel==3)  {address=DS3231_SECOND; max=59;min=0;}    //秒       
    if(sel==4)  {address=DS3231_YEAR; max=99;min=0;}    //年
        if(sel==5)  {address=DS3231_MONTH; max=12;min=1;}    //月
        if(sel==6)                                                                                         //日
        {
                if(month==2)
                {
                        if(((year%4==0)&&(year%100!=0))||(year%400==0))        //闰年2月29天 原作者if(month == 2 && year % 4 != 0)
                        {
                                  {address=DS3231_DAY; max=29;min=1;}
                        }
                        else                                                                          //非闰年2月28天
                        {
                                  {address=DS3231_DAY; max=28;min=1;}
                        }
                }
                else
                {
                           if(month==1|month==3|month==5|month==7|month==8|month==10|month==12)                 //大月 31天
                        {   
                                  {address=DS3231_DAY; max=31;min=1;}
                        }
                        if(month==4|month==6|month==9|month==11)                                //小月 30天
                        {   
                                  {address=DS3231_DAY; max=30;min=1;}
                        }
                }
        }   
    //if(sel==7)  {address=DS3231_WEEK; max=7; min=1;}    //星期 星期根据年月日数据求出,这里屏蔽掉

           item= read_random(address);                                //DS3231读时钟数据
    if (selby==0) item++;  else item--;
    if(item>max) item=min;   
    if(item<min) item=max;
           
    ModifyTime(address, item);                                 //DS3231写时间数据
}         

void KEY()                                          //按键程序
{
        if(a1==0)
   {
                if(KEY1==0)
                {
                        Delay5US();
                        if(KEY1==0)
                        {       
                                b1=0;                        //10秒延时b1清零,加这句是使每次进入设置时a1计数都能从0秒开始计数延时,极端情况刚进设置就退出来了,因为a1始终都在循环累加
                                disflag++;
                                if(disflag>=7 || KEY4==0)                   //如果需要手动调星期就disflag>=8
                                {
                                        disflag=0;                       
                                }
                            a1=1;               
                        }
                }
   }
   if(KEY1==1)
   {
                   a1=0;
   }

  if(a2==0)
        {
                if(KEY2==0)
                {
                        Delay5US();
                        if(KEY2==0)
                        {       
                                b1=0;                        //10秒延时b1清零       
                                Set(disflag,0);
                            a2=1;
                        }
                }
        }
   if(KEY2==1)
   {
           a2=0;
   }
   if(a3==0)
   {
                if(KEY3==0)
                {
                        Delay5US();
                        if(KEY3==0)
                        {       
                                b1=0;                        //10秒延时b1清零                                       
                                Set(disflag,1);        
                            a3=1;                       
                        }
                }
   }
   if(KEY3==1)
   {
                   a3=0;
   }
//********************************
        if(a4==0)
   {
                if(KEY4==0)
                {
                        Delay5US();
                        if(KEY4==0 && disflag!=0 )
                        {
                                b1=0;                        //10秒延时b1清零
                                disflag=0;
                        }
                    a4=1;
                }
   }
   if(KEY4==1)
   {
                   a4=0;
   }
}



#endif
回复

使用道具 举报

ID:46220 发表于 2023-6-2 15:32 | 显示全部楼层
#ifndef __nongli_H
#define __nongli_H
#include<reg51.h>        //51系列单片机头文件
#include<intrins.h>

/*********************************************************************************
C51写的公历转农历和星期
**********************************************************************************
公历是全世界通用的历法以地球绕太阳的一周为一年一年365 天分为12 个月1 3 5 7 8 10 12 月为
31 天2 月为28 天其余月份为30 天事实上地球绕太阳一周共365 天5 小时48 分46 秒比公历一年多出5 小时48
分46 秒为使年误差不累积公历年用闰年法来消除年误差 由于每年多出5 小时48 分46 秒每4 年累计多出23
小时15 分4 秒接近1 天天文学家就规定每4 年有一个闰年把2 月由28 天改为29 天凡是公历年代能被4 整除
的那一年就是闰年但是这样一来每4 年又少了44 分56 秒为了更准确地计时天文学家又规定凡能被100 整除
的年份只有能被400 整除才是闰年即每400 年要减掉3 个闰年经过这样处理后实际上每400 年的误差只有2 小时
53 分20 秒已相当准确了
农历与公历不同农历把月亮绕地球一周作为一月因为月亮绕地球一周不是一整天所以农历把月分为大月和小
月大月30 天小月29 天通过设置大小月使农历日始终与月亮与地球的位置相对应为了使农历的年份与公历年
相对应农历通过设置闰月的办法使它的平均年长度与公历年相等农历是中国传统文化的代表之一并与农业生产联
系密切中国人民特别是广大农民十分熟悉并喜爱农历
公历与农历是我国目前并存的两种历法各有其固有的规律农历与月球的运行相对应其影响因素多它的大小
月和闰月与天体运行有关计算十分复杂且每年都不一致因此要用单片机实现公历与农历的转换用查表法是最方
便实用的办法
51 系列单片机因其在功能上能满足大部份对速度要求不高的应用场合的要求且价格低廉开发工具普及程度高
是目前应用最多的单片机之一本文介绍一种用51 单片机实现从1901 年到2099 年2199 年公历日到农历日及星期
的转换方法并向读者提供完整的51C程序
二 基本原理
实现公历与农历的转换一般采用查表法按日查表是速度最快的方法但51 单片机寻址能力有限不可能采用
按日查表的方法除按日查外我们可以通过按月查表和按年查表的方法再通过适当的计算来确定公历日所对应的
农历日期本文采用的是按年查表法最大限度地减少表格所占的程序空间
对于农历月来说大月为30 天小月为29 天这是固定不变的这样我们就可用1 个BIT 位来表示大小月信
息农历一年如有闰月为13 个月否则是12 个月所以一年需要用13 个BIT 闰月在农历年中所在的月份并不固定
大部分闰月分布在农历2 8 月但也有少量年份在9 月以后所以要表示闰月的信息至少要4BIT 在这里我们用4BIT
的值来表示闰月的月份值为0 表示本年没有闰月有了以上信息还不足以判断公历日对应的农历日因为还需要一
个参照日我们选用农历正月初一所对应的公历日期作参照日公历日最大为31 日需要5BIT 来表示而春节所在的
月份不是1 月就是2 月用1BIT 就够了考虑到表达方便我们用2BIT 来表示春节月2BIT 的值直接表示月份这
样一年的农历信息只用3 个字节就全部包括了
计算公历日对应的农历日期的方法先计算出公历日离当年元旦的天数然后查表取得当年的春节日期计算出春
节离元旦的天数二者相减即可算出公历日离春节的天数以后只要根据大小月和闰月信息减一月天数调整一月农
历月份即可推算出公历日所对应的农历日期如公历日不到春节日期农历年要比公历年小一年农历大小月取前一
年的信息农历月从12 月向前推算
公历日是非常有规律的所以公历日所对应的星期天可以通过计算直接得到理论上公元0 年1 月1 日为星期日
只要求得公历日离公元0 年1 月1 日的日子数除7 后的余数就是星期天为了简化计算采用月校正法根据公历的
年月日可直接计算出星期天其算法是日期年份所过闰年数月校正数之和除7 的余数就是星期天但如果是在
闰年又不到3 月份上述之和要减一天再除7 其1 12 月的校正数据为6 2 2 5 0 3 5 1 4 6 2 4 在
本程序中采用1 个字节表示年份闰年数也只计算1900 年以后的闰年数所以实际校正数据也和上述数据不同

公历年对应的农历数据,每年三字节,
格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 对应农历第1-4 月的大小
第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表示农历第13 个月大小
月份对应的位为1 表示本农历月大(30 天),为0 表示小(29 天)
第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期
*************************************************************************************************/
code unsigned char year_code[597]=
{
  0x04,0xAe,0x53,    //1901
  0x0A,0x57,0x48,    //1902
  0x55,0x26,0xBd,    //1903
  0x0d,0x26,0x50,    //1904
  0x0d,0x95,0x44,    //1905
  0x46,0xAA,0xB9,    //1906
  0x05,0x6A,0x4d,    //1907
  0x09,0xAd,0x42,    //1908
  0x24,0xAe,0xB6,    //1909
  0x04,0xAe,0x4A,    //1910
  0x6A,0x4d,0xBe,    //1911
  0x0A,0x4d,0x52,    //1912
  0x0d,0x25,0x46,    //1913
  0x5d,0x52,0xBA,    //1914
  0x0B,0x54,0x4e,    //1915
  0x0d,0x6A,0x43,    //1916
  0x29,0x6d,0x37,    //1917
  0x09,0x5B,0x4B,    //1918
  0x74,0x9B,0xC1,    //1919
  0x04,0x97,0x54,    //1920
  0x0A,0x4B,0x48,    //1921
  0x5B,0x25,0xBC,    //1922
  0x06,0xA5,0x50,    //1923
  0x06,0xd4,0x45,    //1924
  0x4A,0xdA,0xB8,    //1925
  0x02,0xB6,0x4d,    //1926
  0x09,0x57,0x42,    //1927
  0x24,0x97,0xB7,    //1928
  0x04,0x97,0x4A,    //1929
  0x66,0x4B,0x3e,    //1930
  0x0d,0x4A,0x51,    //1931
  0x0e,0xA5,0x46,    //1932
  0x56,0xd4,0xBA,    //1933
  0x05,0xAd,0x4e,    //1934
  0x02,0xB6,0x44,    //1935
  0x39,0x37,0x38,    //1936
  0x09,0x2e,0x4B,    //1937
  0x7C,0x96,0xBf,    //1938
  0x0C,0x95,0x53,    //1939
  0x0d,0x4A,0x48,    //1940
  0x6d,0xA5,0x3B,    //1941
  0x0B,0x55,0x4f,    //1942
  0x05,0x6A,0x45,    //1943
  0x4A,0xAd,0xB9,    //1944
  0x02,0x5d,0x4d,    //1945
  0x09,0x2d,0x42,    //1946
  0x2C,0x95,0xB6,    //1947
  0x0A,0x95,0x4A,    //1948
  0x7B,0x4A,0xBd,    //1949
  0x06,0xCA,0x51,    //1950
  0x0B,0x55,0x46,    //1951
  0x55,0x5A,0xBB,    //1952
  0x04,0xdA,0x4e,    //1953
  0x0A,0x5B,0x43,    //1954
  0x35,0x2B,0xB8,    //1955
  0x05,0x2B,0x4C,    //1956
  0x8A,0x95,0x3f,    //1957
  0x0e,0x95,0x52,    //1958
  0x06,0xAA,0x48,    //1959
  0x7A,0xd5,0x3C,    //1960
  0x0A,0xB5,0x4f,    //1961
  0x04,0xB6,0x45,    //1962
  0x4A,0x57,0x39,    //1963
  0x0A,0x57,0x4d,    //1964
  0x05,0x26,0x42,    //1965
  0x3e,0x93,0x35,    //1966
  0x0d,0x95,0x49,    //1967
  0x75,0xAA,0xBe,    //1968
  0x05,0x6A,0x51,    //1969
  0x09,0x6d,0x46,    //1970
  0x54,0xAe,0xBB,    //1971
  0x04,0xAd,0x4f,    //1972
  0x0A,0x4d,0x43,    //1973
  0x4d,0x26,0xB7,    //1974
  0x0d,0x25,0x4B,    //1975
  0x8d,0x52,0xBf,    //1976
  0x0B,0x54,0x52,    //1977
  0x0B,0x6A,0x47,    //1978
  0x69,0x6d,0x3C,    //1979
  0x09,0x5B,0x50,    //1980
  0x04,0x9B,0x45,    //1981
  0x4A,0x4B,0xB9,    //1982
  0x0A,0x4B,0x4d,    //1983
  0xAB,0x25,0xC2,    //1984
  0x06,0xA5,0x54,    //1985
  0x06,0xd4,0x49,    //1986
  0x6A,0xdA,0x3d,    //1987
  0x0A,0xB6,0x51,    //1988
  0x09,0x37,0x46,    //1989
  0x54,0x97,0xBB,    //1990
  0x04,0x97,0x4f,    //1991
  0x06,0x4B,0x44,    //1992
  0x36,0xA5,0x37,    //1993
  0x0e,0xA5,0x4A,    //1994
  0x86,0xB2,0xBf,    //1995
  0x05,0xAC,0x53,    //1996
  0x0A,0xB6,0x47,    //1997
  0x59,0x36,0xBC,    //1998
  0x09,0x2e,0x50,    //1999
  0x0C,0x96,0x45,    //2000
  0x4d,0x4A,0xB8,    //2001
  0x0d,0x4A,0x4C,    //2002
  0x0d,0xA5,0x41,    //2003
  0x25,0xAA,0xB6,    //2004
  0x05,0x6A,0x49,    //2005
  0x7A,0xAd,0xBd,    //2006
  0x02,0x5d,0x52,    //2007
  0x09,0x2d,0x47,    //2008
  0x5C,0x95,0xBA,    //2009
  0x0A,0x95,0x4e,    //2010
  0x0B,0x4A,0x43,    //2011
  0x4B,0x55,0x37,    //2012
  0x0A,0xd5,0x4A,    //2013
  0x95,0x5A,0xBf,    //2014
  0x04,0xBA,0x53,    //2015
  0x0A,0x5B,0x48,    //2016
  0x65,0x2B,0xBC,    //2017
  0x05,0x2B,0x50,    //2018
  0x0A,0x93,0x45,    //2019
  0x47,0x4A,0xB9,    //2020
  0x06,0xAA,0x4C,    //2021
  0x0A,0xd5,0x41,    //2022
  0x24,0xdA,0xB6,    //2023
  0x04,0xB6,0x4A,    //2024
  0x69,0x57,0x3d,    //2025
  0x0A,0x4e,0x51,    //2026
  0x0d,0x26,0x46,    //2027
  0x5e,0x93,0x3A,    //2028
  0x0d,0x53,0x4d,    //2029
  0x05,0xAA,0x43,    //2030
  0x36,0xB5,0x37,    //2031
  0x09,0x6d,0x4B,    //2032
  0xB4,0xAe,0xBf,    //2033
  0x04,0xAd,0x53,    //2034
  0x0A,0x4d,0x48,    //2035
  0x6d,0x25,0xBC,    //2036
  0x0d,0x25,0x4f,    //2037
  0x0d,0x52,0x44,    //2038
  0x5d,0xAA,0x38,    //2039
  0x0B,0x5A,0x4C,    //2040
  0x05,0x6d,0x41,    //2041
  0x24,0xAd,0xB6,    //2042
  0x04,0x9B,0x4A,    //2043
  0x7A,0x4B,0xBe,    //2044
  0x0A,0x4B,0x51,    //2045
  0x0A,0xA5,0x46,    //2046
  0x5B,0x52,0xBA,    //2047
  0x06,0xd2,0x4e,    //2048
  0x0A,0xdA,0x42,    //2049
  0x35,0x5B,0x37,    //2050
  0x09,0x37,0x4B,    //2051
  0x84,0x97,0xC1,    //2052
  0x04,0x97,0x53,    //2053
  0x06,0x4B,0x48,    //2054
  0x66,0xA5,0x3C,    //2055
  0x0e,0xA5,0x4f,    //2056
  0x06,0xB2,0x44,    //2057
  0x4A,0xB6,0x38,    //2058
  0x0A,0xAe,0x4C,    //2059
  0x09,0x2e,0x42,    //2060
  0x3C,0x97,0x35,    //2061
  0x0C,0x96,0x49,    //2062
  0x7d,0x4A,0xBd,    //2063
  0x0d,0x4A,0x51,    //2064
  0x0d,0xA5,0x45,    //2065
  0x55,0xAA,0xBA,    //2066
  0x05,0x6A,0x4e,    //2067
  0x0A,0x6d,0x43,    //2068
  0x45,0x2e,0xB7,    //2069
  0x05,0x2d,0x4B,    //2070
  0x8A,0x95,0xBf,    //2071
  0x0A,0x95,0x53,    //2072
  0x0B,0x4A,0x47,    //2073
  0x6B,0x55,0x3B,    //2074
  0x0A,0xd5,0x4f,    //2075
  0x05,0x5A,0x45,    //2076
  0x4A,0x5d,0x38,    //2077
  0x0A,0x5B,0x4C,    //2078
  0x05,0x2B,0x42,    //2079
  0x3A,0x93,0xB6,    //2080
  0x06,0x93,0x49,    //2081
  0x77,0x29,0xBd,    //2082
  0x06,0xAA,0x51,    //2083
  0x0A,0xd5,0x46,    //2084
  0x54,0xdA,0xBA,    //2085
  0x04,0xB6,0x4e,    //2086
  0x0A,0x57,0x43,    //2087
  0x45,0x27,0x38,    //2088
  0x0d,0x26,0x4A,    //2089
  0x8e,0x93,0x3e,    //2090
  0x0d,0x52,0x52,    //2091
  0x0d,0xAA,0x47,    //2092
  0x66,0xB5,0x3B,    //2093
  0x05,0x6d,0x4f,    //2094
  0x04,0xAe,0x45,    //2095
  0x4A,0x4e,0xB9,    //2096
  0x0A,0x4d,0x4C,    //2097
  0x0d,0x15,0x41,    //2098
  0x2d,0x92,0xB5,    //2099
};
code unsigned char day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};//月份数据表
code unsigned int  day_code2[3]={0x111,0x130,0x14e};

bit c_moon;
data unsigned char year_moon,month_moon,day_moon;
/***************************************************************************************
* 函数名称    :get_moon_day
* 功能描述    :用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0
* 参数        :  
***************************************************************************************/
bit get_moon_day(unsigned char month_p,unsigned int table_addr)        //读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0
{
  unsigned char temp;
  switch (month_p)
  {
    case  1:{temp=year_code[table_addr]&0x08;   if (temp==0)return(0);else return(1); break;}
    case  2:{temp=year_code[table_addr]&0x04;   if (temp==0)return(0);else return(1); break;}
    case  3:{temp=year_code[table_addr]&0x02;   if (temp==0)return(0);else return(1); break;}
    case  4:{temp=year_code[table_addr]&0x01;   if (temp==0)return(0);else return(1); break;}
    case  5:{temp=year_code[table_addr+1]&0x80; if (temp==0)return(0);else return(1); break;}
    case  6:{temp=year_code[table_addr+1]&0x40; if (temp==0)return(0);else return(1); break;}
    case  7:{temp=year_code[table_addr+1]&0x20; if (temp==0)return(0);else return(1); break;}
    case  8:{temp=year_code[table_addr+1]&0x10; if (temp==0)return(0);else return(1); break;}
    case  9:{temp=year_code[table_addr+1]&0x08; if (temp==0)return(0);else return(1); break;}
    case  10:{temp=year_code[table_addr+1]&0x04; if (temp==0)return(0);else return(1); break;}
    case  11:{temp=year_code[table_addr+1]&0x02; if (temp==0)return(0);else return(1); break;}
    case  12:{temp=year_code[table_addr+1]&0x01; if (temp==0)return(0);else return(1); break;}
    case  13:{temp=year_code[table_addr+2]&0x80; if (temp==0)return(0);else return(1); break;}
             default: break;
  }
}
/*************************************************************************************
* 函数名称    :Conversion
* 功能描述    :输入阳历数据,输出阴历数据(只允许1901-2099年)
* 参数        :参数名称
****************************************************************************************/
void Conversion(bit c,char year,char month,char day)         //输入阳历数据,输出阴历数据(只允许1901-2099年)
{
//c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据           //输入输出都是10进制参数
  unsigned char temp1,temp2,temp3,month_p;
  unsigned int temp4,table_addr;
  bit flag2,flag_y;
  //定位数据表地址
  if(c==0) { table_addr=(year+0x64-1)*0x3; }
  else   { table_addr=(year-1)*0x3; }
  //定位数据表地址完成
  //取当年春节所在的公历月份
  temp1=year_code[table_addr+2]&0x60;
  temp1=_cror_(temp1,5);
  //取当年春节所在的公历月份完成
  //取当年春节所在的公历日
  temp2=year_code[table_addr+2]&0x1f;
  //取当年春节所在的公历日完成
  // 计算当年春年离当年元旦的天数,春节只会在公历1月或2月
  if(temp1==0x1) { temp3=temp2-1; }  
  else  { temp3=temp2+0x1f-1; }
  // 计算当年春年离当年元旦的天数完成

  //计算公历日离当年元旦的天数,为了减少运算,用了两个表
  //day_code1[9],day_code2[3]
  //如果公历月在九月或前,天数会少于0xff,用表day_code1[9],
  //在九月后,天数大于0xff,用表day_code2[3]
  //如输入公历日为8月10日,则公历日离元旦天数为day_code1[8-1]+10-1
  //如输入公历日为11月10日,则公历日离元旦天数为day_code2[11-10]+10-1
  if (month<10){ temp4=day_code1[month-1]+day-1; }
  else         { temp4=day_code2[month-10]+day-1;}

  if ((month>0x2)&&(year%0x4==0)&&(year!=0))
  temp4+=1; //如果公历月大于2月并且该年的2月为闰月,天数加1
  //计算公历日离当年元旦的天数完成

  //判断公历日在春节前还是春节后
  if (temp4>=temp3)
  { //公历日在春节后或就是春节当日使用下面代码进行运算
    temp4-=temp3;
    month=0x1;
    month_p=0x1;  //month_p为月份指向,公历日在春节前或就是春节当日month_p指向首月
    flag2=get_moon_day(month_p,table_addr); //检查该农历月为大小还是小月,大月返回1,小月返回0
    flag_y=0;
    if(flag2==0)temp1=0x1d; //小月29天
    else temp1=0x1e;     //大月30天
    temp2=year_code[table_addr]&0xf0;
    temp2=_cror_(temp2,4);  //从数据表中取该年的闰月月份,如为0则该年无闰月
    while(temp4>=temp1)
    {
      temp4-=temp1;
      month_p+=1;
      if(month==temp2)
          {
        flag_y=~flag_y;
        if(flag_y==0)month+=1;
      }
      else month+=1;
          flag2=get_moon_day(month_p,table_addr);
      if(flag2==0)temp1=0x1d;
      else temp1=0x1e;
    }
    day=temp4+1;
  }
  else
  {  //公历日在春节前使用下面代码进行运算
    temp3-=temp4;
    if (year==0x0){year=0x63;c=1;}
    else year-=1;
    table_addr-=0x3;
    month=0xc;
    temp2=year_code[table_addr]&0xf0;
    temp2=_cror_(temp2,4);
    if (temp2==0)month_p=0xc;
    else month_p=0xd;
        //month_p为月份指向,如果当年有闰月,一年有十三个月,月指向13,无闰月指向12

    flag_y=0;
    flag2=get_moon_day(month_p,table_addr);
      if(flag2==0)
        temp1=0x1d;
      else
        temp1=0x1e;
    while(temp3>temp1)
    {
      temp3-=temp1;
      month_p-=1;
      if(flag_y==0)month-=1;
      if(month==temp2)flag_y=~flag_y;
      flag2=get_moon_day(month_p,table_addr);
      if(flag2==0)temp1=0x1d;
      else temp1=0x1e;
    }
    day=temp1-temp3+1;
  }
  c_moon=c;
//原程序这里又把这得出的值变回BCD码。但根据我后面的程序,我不需要。
//后面用来显示的农历信息的程序分别是disp_t3()和disp_t4()
  year_moon=year;
  month_moon=month;
  day_moon=day;
}
/******************************************************************************************
* 函数名称    :Conver_week
* 功能描述    :输入BCD阳历数据,输出BCD星期数据(只允许1901-2099年)
* 参数        :  参数名称:        输入/输出?        类型                描述
* 算法:日期+年份+所过闰年数+月较正数之和除7 的余数就是星期,但如果是在
  闰年又不到3 月份上述之和要减一天再除7星期数。余数为0时,为星期天。
******************************************************************************************/
bit century;   //世纪位标志,0为20世纪,1为19世纪
code unsigned char table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表
void Conver_week()         //输入BCD阳历数据,输出BCD星期数据(只允许1901-2099年)
{//century=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据
  unsigned char temp1,temp2;
  temp1=year;
  if (century==0){temp1=temp1+100;}  //如果为21世纪,年份数加100
  temp2=temp1/4;                     //所过闰年数只算1900年之后的
  temp2=temp1+temp2;
  temp2=temp2%7;                     //为节省资源,先进行一次取余,避免数大于255
  temp2=temp2+day+table_week[month-1];
  if (year%0x4==0&&month<3)temp2-=1;
  week=temp2%7;
}
     
#endif
回复

使用道具 举报

ID:46220 发表于 2023-6-2 15:32 | 显示全部楼层
#ifndef __ziku_H
#define __ziku_H
#include<reg51.h>        //51系列单片机头文件
#include<intrins.h>

unsigned char code hz[]=/*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=16x16   --*/
{
/*0x00,0x40,0x40,0x40,0x40,0x40,0x40,0xFE,0xFE,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,/*--十--0*/

/*0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x40,0x40,0x40,0xC0,0xC0,0x80,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*--一--1*/

/*0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x18,0x18,0x08,0x08,0x08,0x08,0x00,0x00,0x00,
  0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x0C,0x04,0x04,0x04,0x04,0x04,0x06,0x06,0x06,/*--二--2*/

/*0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x98,0x88,0x88,0x88,0x08,0x00,0x00,0x00,0x00,
  0x00,0x00,0x10,0x10,0x10,0x11,0x11,0x11,0x19,0x08,0x08,0x08,0x08,0x08,0x08,0x08,/*--三--3*/

/*0x00,0x70,0xF0,0x90,0x10,0xF0,0xF0,0x10,0xF8,0xF8,0x88,0x88,0xF8,0xF8,0x00,0x00,
  0x00,0x00,0x00,0x07,0x07,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x0C,0x0F,0x07,0x00,/*--四--4*/

/*0x00,0x00,0x00,0x80,0x88,0x88,0xF8,0x7C,0x44,0x44,0xC4,0xC4,0x00,0x00,0x00,0x00,
  0x00,0x10,0x10,0x10,0x10,0x18,0x1F,0x0F,0x08,0x08,0x0F,0x0F,0x08,0x08,0x08,0x08,/*--五--5*/

/*0x00,0x40,0x40,0x40,0x40,0x40,0x44,0x4C,0x68,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
  0x00,0x00,0x10,0x10,0x18,0x0C,0x06,0x02,0x00,0x01,0x03,0x06,0x1C,0x18,0x00,0x00,/*--六--6*/

/*0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x80,0xC0,0x40,0x60,0x20,0x20,0x20,0x00,
  0x00,0x02,0x02,0x02,0x02,0x03,0x01,0x0F,0x1F,0x10,0x10,0x10,0x10,0x1C,0x1C,0x00,/*--七--7*/

/*0x00,0x00,0x00,0x00,0xC0,0xC4,0x0C,0x38,0x70,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,
  0x00,0x08,0x0C,0x06,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0x0E,0x0C,0x08,/*--八--8*/

/*0x00,0x40,0x40,0x40,0x40,0xC0,0xFE,0x3E,0x20,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,
  0x00,0x20,0x20,0x30,0x18,0x0E,0x07,0x01,0x00,0x1F,0x3F,0x20,0x20,0x20,0x20,0x3C,/*--九--9*/


/*0x00,0x20,0x20,0xA0,0xF0,0xF2,0xB6,0x84,0x20,0x20,0xE0,0xF0,0x10,0xF0,0xF0,0x00,
  0x00,0x04,0x06,0x03,0x01,0x3F,0x3F,0x13,0x1A,0x0C,0x07,0x0B,0x18,0x18,0x1F,0x07,/*--初--10*/

/*0x80,0x80,0x80,0x80,0xB8,0xF8,0xC0,0x40,0x40,0xC0,0xFE,0x3E,0x20,0x20,0x20,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x08,0x08,0x0F,0x0F,0x08,0x00,0x00,0x00,/*--廿--11*/

/*0x00,0x00,0x00,0x1C,0x7C,0x76,0xD3,0xEB,0xAA,0xBA,0xBE,0x0E,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x30,0x3F,0x1F,0x15,0x3F,0x3F,0x1A,0x0B,0x0F,0x1C,0x30,0x78,0x78,/*--鼠--12*/

/*0x00,0x00,0x00,0x40,0x78,0x38,0x10,0xFF,0xFF,0x88,0x88,0x88,0x88,0x80,0x80,0x00,
  0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,/*--牛--13*/

/*0x00,0x00,0x00,0xF0,0xF0,0x50,0x50,0xFF,0xFF,0xAA,0xAA,0xDA,0xD8,0x08,0x00,0x00,
  0x00,0x40,0x60,0x38,0x5F,0x47,0x60,0x3C,0x1E,0x02,0x3E,0x7E,0x40,0x40,0x40,0x78,/*--虎--14*/

/*0x00,0x00,0x00,0xF0,0xF8,0x2C,0xE7,0xF7,0xBC,0xDC,0xF4,0x30,0x00,0x00,0x00,0x00,
  0x00,0x00,0x20,0x20,0x31,0x19,0x0F,0x07,0x1F,0x3F,0x22,0x26,0x24,0x20,0x20,0x3C,/*--兔--15*/

/*0x00,0x00,0x20,0x20,0x20,0xE0,0xFE,0xDE,0xD0,0x10,0x12,0xD6,0xC4,0x00,0x00,0x00,
  0x00,0x20,0x30,0x18,0x0C,0x07,0x13,0x18,0x1F,0x3F,0x26,0x23,0x21,0x20,0x20,0x3C,/*--龙--16*/

/*0x00,0xE0,0xE0,0xFC,0xFC,0xF0,0xF0,0x60,0x60,0xA2,0xB6,0x14,0x90,0xB0,0x30,0x00,
  0x00,0x08,0x09,0x09,0x0F,0x07,0x06,0x06,0x04,0x00,0x1F,0x3F,0x23,0x21,0x20,0x3C,/*--蛇--17*/

/*0x00,0x00,0x00,0x00,0x84,0xF4,0x74,0x86,0xE2,0xFE,0x9E,0x80,0x80,0x80,0x00,0x00,
  0x00,0x00,0x08,0x08,0x08,0x09,0x0D,0x05,0x05,0x04,0x24,0x64,0x60,0x3F,0x1F,0x00,/*--马--18*/

/*0x00,0x00,0x00,0x00,0x10,0x52,0x56,0xFC,0xFC,0x2F,0x2B,0x09,0x00,0x00,0x00,0x00,
  0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x7F,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,/*--羊--19*/

/*0x00,0x44,0x6C,0xF8,0xFC,0x6C,0xF8,0xFE,0xE6,0xE8,0xBC,0xDC,0x5C,0x50,0x10,0x00,
  0x00,0x04,0x16,0x33,0x3F,0x1F,0x00,0x3F,0x3F,0x33,0x1A,0x0F,0x0F,0x19,0x31,0x21,/*--猴--20*/

/*0x00,0x50,0xD0,0x98,0xC8,0xF8,0x38,0xF8,0xF8,0x2F,0x67,0x7C,0x7C,0x00,0x00,0x00,
  0x00,0x08,0x0C,0x06,0x03,0x13,0x16,0x14,0x13,0x1B,0x0A,0x0B,0x49,0x49,0x7F,0x3F,/*--鸡--21*/

/*0x00,0x40,0x44,0x6C,0xB8,0xFE,0xEE,0x60,0xB8,0x9E,0x96,0x10,0x10,0xF0,0xF0,0x00,
  0x00,0x04,0x04,0x06,0x13,0x31,0x3F,0x1F,0x03,0x03,0x03,0x13,0x30,0x30,0x1F,0x0F,/*--狗--22*/

/*0x00,0x44,0x6C,0xB8,0xFC,0xEC,0x40,0x50,0xFE,0xFE,0x68,0x30,0x38,0x28,0x20,0x20,
  0x00,0x04,0x06,0x13,0x31,0x3F,0x1F,0x06,0x3F,0x3F,0x15,0x15,0x3F,0x3F,0x00,0x00,/*--猪--23*/

/*0x00,0x00,0x00,0x10,0xF8,0xEC,0x27,0x27,0xFC,0xFE,0x12,0x12,0x10,0x00,0x00,0x00,
  0x00,0x02,0x02,0x02,0x02,0x03,0x01,0x01,0x01,0x7F,0x7F,0x01,0x01,0x01,0x01,0x01,/*--年--24*/

/*0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0xB6,0x92,0x92,0xFE,0xFE,0x00,0x00,0x00,0x00,
  0x00,0x00,0x40,0x60,0x30,0x1C,0x0F,0x03,0x01,0x10,0x30,0x3F,0x1F,0x00,0x00,0x00,/*--月--25*/

/*0x00,0x00,0x00,0x00,0xF8,0xF8,0x88,0xCC,0x44,0x44,0xFC,0xFC,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x0C,0x04,0x04,0x0C,0x0F,0x0F,0x00,0x00,0x00,/*--日--26*/

/*0x00,0x00,0x00,0xFC,0xFC,0xA4,0xA4,0xFE,0x7A,0x52,0x52,0x42,0xFE,0xFE,0x00,0x00,
  0x00,0x40,0x60,0x38,0x1F,0x07,0x06,0x0E,0x0B,0x09,0x0F,0x27,0x60,0x7F,0x3F,0x00,/*--周--27*/

//* (16 X 16 , 宋体, 加粗 )
/*
  0x00,0x40,0x40,0x40,0x40,0x40,0x40,0xFE,0xFE,0x40,0x40,0x40,0x40,0x40,0x40,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//"十",0

  0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//"一",1

  0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,
  0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,//"二",2

  0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,
  0x00,0x40,0x40,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x40,0x40,0x00,//"三",3

  0x00,0x00,0xFC,0xFC,0x04,0x04,0xFC,0xFC,0x04,0xFC,0xFC,0x04,0x04,0xFC,0xFC,0x00,
  0x00,0x00,0x7F,0x7F,0x28,0x2C,0x27,0x23,0x20,0x23,0x27,0x24,0x24,0x7F,0x7F,0x00,//"四",4

  0x00,0x00,0x84,0x84,0x84,0x84,0xFC,0xFC,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,
  0x00,0x40,0x40,0x40,0x78,0x7F,0x47,0x40,0x40,0x40,0x40,0x7F,0x7F,0x40,0x40,0x00,//"五",5

  0x00,0x20,0x20,0x20,0x20,0x20,0x22,0x26,0x3C,0x38,0x20,0x20,0x20,0x20,0x20,0x00,
  0x00,0x40,0x60,0x30,0x1C,0x0F,0x03,0x00,0x00,0x01,0x03,0x06,0x1C,0x78,0x60,0x00,//"六",6

  0x00,0x80,0x80,0x80,0x80,0x80,0xFE,0xFE,0x40,0x40,0x60,0x20,0x20,0x20,0x20,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x7F,0x40,0x40,0x40,0x40,0x40,0x70,0x70,0x00,//"七",7

  0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x00,0x7E,0xFE,0x80,0x00,0x00,0x00,0x00,
  0x00,0x40,0x60,0x38,0x1F,0x07,0x00,0x00,0x00,0x00,0x07,0x1F,0x38,0x60,0x40,0x00,//"八",8

  0x00,0x00,0x10,0x10,0x10,0xFE,0xFE,0x10,0x10,0x10,0xF0,0xF0,0x00,0x00,0x00,0x00,
  0x00,0x40,0x60,0x30,0x1C,0x0F,0x03,0x00,0x00,0x00,0x3F,0x7F,0x40,0x70,0x70,0x00,//"九",9

  0x00,0x10,0x12,0xD6,0xF4,0xB0,0x90,0x08,0x08,0xF8,0xF8,0x08,0x08,0xF8,0xF8,0x00,
  0x00,0x02,0x03,0x7F,0x7F,0x47,0x66,0x30,0x1C,0x0F,0x03,0x40,0x40,0x7F,0x3F,0x00,//"初",10

  0x00,0x10,0x10,0xFE,0xFE,0x10,0x10,0x10,0x10,0x10,0x10,0xFE,0xFE,0x10,0x10,0x00,
  0x00,0x00,0x00,0x7F,0x7F,0x20,0x20,0x20,0x20,0x20,0x20,0x7F,0x7F,0x00,0x00,0x00,//"廿",11

  0x01,0x00,0x7C,0x54,0x54,0x52,0x50,0x40,0x50,0x54,0x54,0x54,0x7C,0x00,0x00,0x01,
  0x80,0x00,0x7F,0x24,0x09,0x02,0x7F,0x20,0x09,0x12,0x00,0x1F,0x20,0x78,0x00,0x80,//鼠",12

  0x01,0x80,0x60,0x1C,0x10,0x10,0x10,0xFE,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x01,
  0x80,0x02,0x02,0x02,0x02,0x02,0x02,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x80,//牛",13

  0x01,0x00,0x00,0xF0,0x10,0x90,0x90,0xFE,0x54,0x54,0x54,0x14,0x90,0x30,0x00,0x01,
  0x80,0x40,0x30,0x0F,0x40,0x20,0x1C,0x04,0x05,0x05,0x3D,0x41,0x41,0x60,0x00,0x80,//"虎",14

  0x01,0x20,0xD0,0x48,0x4E,0x48,0x48,0xC8,0x48,0x68,0x58,0x40,0xC0,0x00,0x00,0x01,
  0x80,0x40,0x43,0x22,0x12,0x0A,0x06,0x03,0x3E,0x42,0x4A,0x52,0x43,0x70,0x00,0x80,//"免",15

  0x01,0x20,0x20,0x20,0x20,0xA0,0x7E,0x20,0xE0,0x24,0x28,0x20,0xA0,0x20,0x00,0x01,
  0x80,0x40,0x20,0x10,0x0C,0x23,0x20,0x10,0x3F,0x44,0x42,0x41,0x40,0x70,0x00,0x80,//"龙",16

  0x01,0xF0,0x10,0xFE,0x10,0xF0,0x00,0x18,0xC8,0x0A,0x0C,0x08,0x08,0x98,0x00,0x01,
  0x80,0x23,0x22,0x3F,0x12,0x1B,0x30,0x00,0x3F,0x42,0x42,0x41,0x41,0x70,0x00,0x80,//"蛇",17

  0x01,0x00,0x02,0xFA,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x80,0x80,0x80,0x00,0x01,
  0x80,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x40,0x40,0x3F,0x00,0x80,//"马",18

  0x01,0x00,0x10,0x90,0x92,0x9C,0x90,0xF0,0x90,0x98,0x96,0x90,0x10,0x00,0x00,0x01,
  0x80,0x04,0x04,0x04,0x04,0x04,0x04,0x7F,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x80,//"羊",19

  0x01,0x44,0x28,0x10,0xEE,0x40,0x20,0xF8,0x06,0x20,0xE4,0xA4,0xBC,0xA0,0x00,0x01,
  0x80,0x04,0x42,0x41,0x3F,0x00,0x00,0x7F,0x00,0x45,0x34,0x0F,0x34,0x44,0x00,0x80,//"猴",20

  0x01,0x00,0x48,0x88,0x08,0xC8,0x38,0x00,0xF8,0x0C,0xAA,0x88,0xF8,0x00,0x00,0x01,
  0x80,0x20,0x10,0x0C,0x03,0x06,0x18,0x00,0x0B,0x0A,0x0A,0x4A,0x42,0x3E,0x00,0x80,//"鸡",21

  0x01,0x44,0x28,0x10,0xEE,0x00,0x20,0xD0,0x4E,0x48,0xC8,0x08,0x08,0xF8,0x00,0x01,
  0x80,0x04,0x42,0x41,0x3F,0x00,0x00,0x1F,0x08,0x08,0x0F,0x40,0x40,0x3F,0x00,0x80,//"狗",22

  0x01,0x44,0x28,0x10,0xEE,0x00,0x48,0x48,0xC8,0x7E,0x68,0x50,0x4C,0x40,0x00,0x01,
  0x80,0x04,0x42,0x41,0x3F,0x04,0x02,0x7F,0x2A,0x2A,0x2A,0x2A,0x7E,0x00,0x00,0x80,//"猪",23

  0x00,0x40,0x60,0x30,0xDE,0xCE,0x48,0x48,0xF8,0xF8,0x48,0x48,0x48,0x08,0x00,0x00,
  0x00,0x04,0x04,0x04,0x07,0x07,0x04,0x04,0x7F,0x7F,0x04,0x04,0x04,0x04,0x04,0x00,//"年",24

  0x00,0x00,0x00,0x00,0xFE,0xFE,0x22,0x22,0x22,0x22,0x22,0x22,0xFE,0xFE,0x00,0x00,
  0x00,0x00,0x40,0x70,0x3F,0x0F,0x02,0x02,0x02,0x02,0x42,0x42,0x7F,0x7F,0x00,0x00,//"月",25

  0x00,0x00,0xFE,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0xFE,0x00,0x00,
  0x00,0x00,0x7F,0x7F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7F,0x7F,0x00,0x00,//"日",26

  0x00,0x00,0x00,0xFE,0xFE,0x82,0x92,0x92,0xFE,0xFE,0x92,0x92,0x82,0xFE,0xFE,0x00,
  0x00,0x40,0x70,0x3F,0x0F,0x00,0x1E,0x1E,0x12,0x12,0x1E,0x5E,0x40,0x7F,0x7F,0x00,//"周",27


  0x00,0x0C,0x12,0x12,0xCC,0xE0,0x30,0x10,0x10,0x10,0x30,0x60,0xF0,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x0F,0x1F,0x30,0x60,0x40,0x40,0x40,0x20,0x10,0x00,0x00,0x00,//℃",28

  
  0x00,0x00,0x40,0x60,0x30,0x3E,0x6E,0xC8,0xC8,0x68,0x38,0x18,0x00,0x00,0x00,0x00,
  0x00,0x04,0x04,0x06,0x12,0x13,0x15,0x35,0x2D,0x69,0x4B,0x02,0x06,0x04,0x04,0x00,//冬",29

  0x00,0x00,0xFC,0xFC,0x44,0xFC,0xFC,0x48,0x7E,0x7E,0x48,0x7E,0x7E,0x48,0x40,0x00,
  0x00,0x40,0x7F,0x3F,0x42,0x7F,0x7F,0x7F,0x7F,0x49,0x49,0x49,0x7F,0x7F,0x00,0x00,//"腊",30
*/
//* (16 X 16 , 宋体 )共阴/列行式/点阵16*索引16/逆向/16进制/像素8/C51格式*/
  0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"十",0*/

  0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"一",1*/

  0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,
  0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,/*"二",2*/

  0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,
  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,/*"三",3*/

  0x00,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00,
  0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x7F,0x00,0x00,/*"四",4*/

  0x00,0x02,0x42,0x42,0x42,0xC2,0x7E,0x42,0x42,0x42,0x42,0xC2,0x02,0x02,0x00,0x00,
  0x40,0x40,0x40,0x40,0x78,0x47,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x00,/*"五",5*/

  0x20,0x20,0x20,0x20,0x20,0x20,0x21,0x22,0x2C,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
  0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x01,0x02,0x04,0x18,0x60,0x00,0x00,/*"六",6*/

  0x80,0x80,0x80,0x80,0x80,0x40,0xFF,0x40,0x40,0x40,0x20,0x20,0x20,0x20,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x78,0x00,0x00,/*"七",7*/

  0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x7E,0x80,0x00,0x00,0x00,0x00,0x00,
  0x00,0x80,0x60,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x30,0x40,0x80,0x00,/*"八",8*/

  0x00,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00,0x00,0x00,
  0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x78,0x00,/*"九",9*/

  0x08,0x08,0x89,0xEA,0x18,0x88,0x00,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00,
  0x02,0x01,0x00,0xFF,0x01,0x86,0x40,0x20,0x18,0x07,0x40,0x80,0x40,0x3F,0x00,0x00,/*"初",10*/

  0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x00,
  0x00,0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00,/*"廿",11*/

  0x00,0x00,0x7E,0x4A,0x4A,0x49,0x40,0x40,0x40,0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00,
  0x00,0x00,0xFF,0x80,0x49,0x12,0x00,0xFF,0x80,0x49,0x12,0x00,0x3F,0x40,0xF0,0x00,/*"鼠",12*/

  0x00,0x40,0x20,0x1E,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,
  0x02,0x02,0x02,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,/*"牛",13*/

  0x00,0x00,0xF8,0x08,0x48,0x48,0x48,0xFF,0x4A,0x2A,0x2A,0x0A,0xCA,0x18,0x00,0x00,
  0x80,0x60,0x1F,0x80,0x40,0x20,0x1C,0x04,0x05,0x05,0x7D,0x81,0x81,0xE0,0x00,0x00,/*"虎",14*/

  0x40,0x20,0xF0,0x28,0x27,0x24,0x24,0xE4,0x24,0x34,0x2C,0x20,0xE0,0x00,0x00,0x00,
  0x80,0x80,0x47,0x22,0x12,0x0A,0x06,0x03,0x7E,0x82,0x8A,0xB2,0x87,0x80,0xE0,0x00,/*"兔",15*/

  0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0xF0,0x10,0x11,0x16,0xD0,0x10,0x10,0x00,
  0x80,0x40,0x20,0x18,0x06,0x41,0x20,0x10,0x3F,0x44,0x42,0x41,0x40,0x40,0x78,0x00,/*"龙",16*/

  0x00,0xF8,0x08,0xFF,0x08,0xF8,0x20,0x18,0xC8,0x08,0x09,0x0E,0x88,0x28,0x18,0x00,
  0x20,0x63,0x21,0x1F,0x11,0x19,0x30,0x00,0x3F,0x44,0x42,0x41,0x40,0x40,0x78,0x00,/*"蛇",17*/

  0x00,0x02,0x02,0xF2,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x80,0x80,0x80,0x00,0x00,
  0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x48,0x80,0x40,0x3F,0x00,0x00,/*"马",18*/

  0x00,0x08,0x88,0x88,0x89,0x8E,0x88,0xF8,0x88,0x8C,0x8B,0x88,0x88,0x08,0x00,0x00,
  0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,/*"羊",19*/

  0x22,0x14,0x08,0xF4,0x42,0x20,0xF8,0x07,0x10,0xF2,0x92,0x92,0x9E,0x90,0x10,0x00,
  0x44,0x82,0x41,0x3F,0x00,0x00,0xFF,0x00,0x85,0x44,0x34,0x0F,0x34,0x44,0x84,0x00,/*"猴",20*/

  0x08,0x48,0x88,0x08,0xC8,0x38,0x00,0x00,0xFC,0x06,0x15,0x44,0x84,0x7C,0x00,0x00,
  0x20,0x10,0x0C,0x03,0x04,0x18,0x00,0x10,0x13,0x12,0x12,0x52,0x92,0x42,0x3E,0x00,/*"鸡",21*/

  0x40,0x22,0x14,0x08,0xF4,0x22,0x10,0xCC,0x4B,0x48,0xC8,0x08,0x08,0xF8,0x00,0x00,
  0x08,0x44,0x82,0x41,0x3F,0x00,0x00,0x0F,0x04,0x04,0x4F,0x80,0x40,0x3F,0x00,0x00,/*"狗",22*/

  0x22,0x14,0x08,0xF4,0x02,0x20,0x24,0x24,0xA4,0x7F,0x24,0x34,0x28,0x26,0x20,0x00,
  0x44,0x82,0x41,0x3F,0x00,0x04,0x02,0xFF,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,/*"猪",23*/

  0x00,0x20,0x18,0xC7,0x44,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0x44,0x04,0x00,0x00,
  0x04,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00,/*"年",24*/

  0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00,
  0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00,/*"月",25*/

  0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00,/*"日",26*/

  0x00,0x00,0xFE,0x82,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x82,0xFE,0x00,0x00,0x00,
  0x80,0x60,0x1F,0x00,0x00,0x1E,0x12,0x12,0x12,0x1E,0x40,0x80,0x7F,0x00,0x00,0x00,/*"周",27*/

  0x00,0x0C,0x12,0x12,0xCC,0xE0,0x30,0x10,0x10,0x10,0x30,0x60,0xF0,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x0F,0x1F,0x30,0x60,0x40,0x40,0x40,0x20,0x10,0x00,0x00,0x00,/*℃",28*/

  0x00,0x20,0x10,0x08,0x94,0xA7,0x44,0x44,0x44,0xA4,0x94,0x0C,0x00,0x00,0x00,0x00,
  0x02,0x02,0x01,0x01,0x20,0x24,0x24,0x44,0x48,0x88,0x10,0x01,0x01,0x02,0x02,0x00,/*"冬",29*/

  0x00,0xFE,0x22,0x22,0xFE,0x40,0x48,0x48,0x7F,0x48,0x48,0x48,0x7F,0x48,0x48,0x00,
  0x80,0x7F,0x02,0x82,0xFF,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,/*"腊",30*/

//* (16 X 16 , 宋体 )
  0x00,0x20,0x22,0xEC,0x00,0x00,0xFC,0x84,0xA4,0xFC,0xA4,0xA4,0x84,0xFC,0x00,0x00,
  0x00,0x00,0x00,0x1F,0x08,0x44,0x3F,0x00,0x1E,0x12,0x12,0x5E,0x40,0x7F,0x00,0x00,//"调",31

  0x00,0x04,0x74,0xD4,0xFE,0xD4,0x74,0x24,0x10,0xAE,0x48,0xA8,0x18,0x08,0x00,0x00,
  0x00,0x42,0x45,0x44,0x77,0x44,0x45,0x7C,0x55,0x54,0x54,0x54,0x45,0x41,0x00,0x00,//整",32

  0x00,0x00,0xF2,0x04,0x20,0x24,0x2C,0xF4,0x24,0x24,0x24,0x24,0x04,0xFC,0x00,0x00,
  0x00,0x00,0x7F,0x00,0x1F,0x01,0x01,0x7F,0x01,0x11,0x11,0x5F,0x40,0x7F,0x00,0x00,//"闹",33

  0x00,0x20,0x50,0xCE,0x48,0x48,0x00,0xF0,0x10,0x10,0xFE,0x10,0x10,0xF0,0x00,0x00,
  0x00,0x02,0x02,0x7F,0x22,0x12,0x00,0x07,0x02,0x02,0x7F,0x02,0x02,0x07,0x00,0x00,//"钟",34

  0x00,0xF8,0x88,0x88,0xF8,0x00,0x10,0x90,0x10,0x10,0x10,0xFE,0x10,0x10,0x00,0x00,
  0x00,0x1F,0x08,0x08,0x1F,0x00,0x00,0x00,0x03,0x40,0x40,0x7F,0x00,0x00,0x00,0x00,//"时",35

  0x00,0x80,0x40,0xA0,0x98,0x86,0x80,0x80,0x80,0x86,0x98,0x20,0x40,0x80,0x00,0x00,
  0x00,0x40,0x20,0x10,0x08,0x07,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,//"分",36

  0x00,0x1C,0x86,0x62,0x12,0x10,0x08,0xE8,0x08,0x08,0x10,0x12,0x62,0x86,0x1C,0x00,
  0x00,0x00,0x43,0x2C,0x10,0x10,0x20,0x21,0x21,0x21,0x11,0x11,0x2C,0x43,0x00,0x00,//闹钟,37

  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//空,38

//  0x00,0x00,0x04,0xC4,0xC4,0x04,0x04,0xFC,0xFC,0x04,0x04,0x04,0x04,0x04,0x00,0x00,
//  0x00,0x40,0x40,0x7F,0x7F,0x40,0x40,0x7F,0x7F,0x41,0x41,0x41,0x41,0x40,0x40,0x00,//正,39
  
  0x00,0x02,0x02,0xC2,0x02,0x02,0x02,0xFE,0x82,0x82,0x82,0x82,0x82,0x02,0x00,0x00,
  0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,/*"正",39*/

  0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xA9,0x01,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x38,0x7C,0xFF,0xFE,0xFE,0xFF,0x7C,0x38,0x00,0x00,0x00,0x00,//"!"温度图标,40
};

//-----------数字16*32----------------------
unsigned char code dazi[]=  /*pyhzbj取模方式:纵向取模,字节倒序*/
{   
  //0
  0x00,0xF0,0xF8,0xFC,0xFE,0x3E,0x1E,0x1E,0x1E,0x1E,0x3E,0xFE,0xFC,0xF8,0xF0,0x00,
  0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xC0,0x30,0x0C,0xFF,0xFF,0xFF,0xFF,0x00,
  0x00,0xFF,0xFF,0xFF,0xFF,0x30,0x0C,0x03,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,
  0x00,0x0F,0x1F,0x3F,0x7F,0x7C,0x78,0x78,0x78,0x78,0x7C,0x7F,0x3F,0x1F,0x0F,0x00,
  
  //1
  0x00,0x00,0x00,0x00,0x18,0x18,0x1C,0xFC,0xFE,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x7F,0x7F,0x7F,0x7F,0x60,0x60,0x00,0x00,0x00,
  
  //2
  0x00,0xF0,0xF8,0xFC,0xFE,0x3E,0x1E,0x1E,0x1E,0x1E,0x3E,0xFE,0xFC,0xF8,0xF0,0x00,
  0x00,0x1F,0x1F,0x1F,0x1F,0x00,0x00,0x00,0x80,0xC0,0xE0,0xFF,0xFF,0xFF,0x7F,0x00,
  0x00,0xC0,0xE0,0xF0,0xF8,0xFC,0x7E,0x3F,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00,
  0x00,0x7F,0x7F,0x7F,0x7F,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x00,
  
  //3
  0x00,0xF0,0xF8,0xFC,0xFE,0x3E,0x1E,0x1E,0x1E,0x1E,0x3E,0xFE,0xFC,0xF8,0xF0,0x00,
  0x00,0x07,0x07,0x07,0xC7,0xC0,0xC0,0xC0,0xC0,0xC0,0xE0,0xFF,0xFF,0x7F,0x3F,0x00,
  0x00,0xE0,0xE0,0xE0,0xE3,0x03,0x03,0x03,0x03,0x03,0x07,0xFF,0xFF,0xFE,0xFC,0x00,
  0x00,0x0F,0x1F,0x3F,0x7F,0x7C,0x78,0x78,0x78,0x78,0x7C,0x7F,0x3F,0x1F,0x0F,0x00,
  
    //4
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xF0,0xFC,0xFE,0xFE,0x00,0x00,0x00,
  0x00,0x00,0x80,0xE0,0xF8,0xFE,0x7F,0x1F,0x07,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,
  0x00,0xFE,0xFF,0xFF,0xFF,0xF1,0xF0,0xF0,0xF0,0xFF,0xFF,0xFF,0xFF,0xF0,0xF0,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x00,0x00,0x00,
  
  //5
  0x00,0xFE,0xFE,0xFE,0xFE,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x00,
  0x00,0xFF,0xFF,0xFF,0xFF,0xF0,0x78,0x78,0x78,0x78,0xF8,0xF8,0xF0,0xE0,0xC0,0x00,
  0x00,0xF1,0xF1,0xF1,0xF1,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,
  0x00,0x0F,0x1F,0x3F,0x7F,0x7C,0x78,0x78,0x78,0x78,0x7C,0x7F,0x3F,0x1F,0x0F,0x00,
  
  //6
  0x00,0xF0,0xF8,0xFC,0xFE,0x3E,0x1E,0x1E,0x1E,0x1E,0x3E,0xFE,0xFC,0xF8,0xF0,0x00,
  0x00,0xFF,0xFF,0xFF,0xFF,0xE0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF1,0xE1,0xC1,0x81,0x00,
  0x00,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0x00,
  0x00,0x0F,0x1F,0x3F,0x7F,0x7C,0x78,0x78,0x78,0x78,0x7C,0x7F,0x3F,0x1F,0x0F,0x00,
  
  //7
  0x00,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x9E,0xFE,0xFE,0xFE,0x7E,0x1E,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFC,0xFF,0xFF,0x1F,0x03,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,
  
  //8
  0x00,0xF0,0xF8,0xFC,0xFE,0x3E,0x1E,0x1E,0x1E,0x1E,0x3E,0xFE,0xFC,0xF8,0xF0,0x00,
  0x00,0x1F,0x3F,0xFF,0xFF,0xF0,0xE0,0xE0,0xE0,0xE0,0xF0,0xFF,0xFF,0x3F,0x1F,0x00,
  0x00,0xFE,0xFF,0xFF,0xFF,0x03,0x01,0x01,0x01,0x01,0x03,0xFF,0xFF,0xFF,0xFE,0x00,
  0x00,0x0F,0x1F,0x3F,0x7F,0x7C,0x78,0x78,0x78,0x78,0x7C,0x7F,0x3F,0x1F,0x0F,0x00,
  
  //9
  0x00,0xF0,0xF8,0xFC,0xFE,0x3E,0x1E,0x1E,0x1E,0x1E,0x3E,0xFE,0xFC,0xF8,0xF0,0x00,
  0x00,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0x00,
  0x00,0x81,0x83,0x87,0x8F,0x0F,0x0F,0x0F,0x0F,0x0F,0x07,0xFF,0xFF,0xFF,0xFF,0x00,
  0x00,0x0F,0x1F,0x3F,0x7F,0x7C,0x78,0x78,0x78,0x78,0x7C,0x7F,0x3F,0x1F,0x0F,0x00,

  //双方型冒号 10
  0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,
  
  //空                11
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
};

unsigned char code number[]=/*--  新宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
{
  0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*0--0*/
  0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*1--1*/
  0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*2--2*/
  0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,/*3--3*/
  0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,/*4--4*/
  0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/*5--5*/
  0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,/*6--6*/
  0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,/*7--7*/
  0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*8--8*/
  0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,/*9--9*/
  0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,/*:--10*/
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,/*---11*/
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/* --12*/
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,/*.--13*/
};





#endif
回复

使用道具 举报

ID:46220 发表于 2023-6-2 15:32 | 显示全部楼层
#ifndef __18B20_H
#define __18B20_H
#include<reg51.h>        //51系列单片机头文件
#include<intrins.h>

sbit DQ=P2^1;        //温度探测口
unsigned char a,b,t_b,t_s,t_g,t_x,f_b,f_s,f_g,f_x;           //DS18B20用变量
unsigned char temp_flag=1;  //温度正负标志
const unsigned char tabl3[]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};

//******************DS18B20温度测试部分*****************
//50微秒延时基准程序
void delay_50us(unsigned int t)
{
  unsigned char j;
  for(;t>0;t--)
  {
    for(j=19;j>0;j--);
  }
}
//8微秒延时基准程序
void delay_8us(unsigned int t)
{
while(--t);
}
//3微秒延时程序
void delay_3us()
{
  ;
  ;
}
void DS18B20_Init(void)                // 函数功能:DS18B20初始化
{
     rest:delay_3us(); //稍做延时
     delay_3us();
     DQ=1;
     delay_3us();
     DQ=0;// DQ_L; //单片机将dq_ds18b20总线拉低
     delay_8us(75);//480us<T<960us//此延时必须精确,600US大于480US(12MHZ)过小不能仿真,过大实物不显示
     DQ=1;//拉高总线  释放总线
     delay_8us(8);                   //此延时不需要精确
     if(DQ==1)          
     {  
       return;
     }  
     delay_8us(11); //延时90us
     if(DQ==1)
     {
       return;
     }  
      else
      {
       goto rest;
      }
}
//***函数名称:void Ds18b20WriteOneByte(unsigned char dat)
//***函数功能:读一个字节
unsigned char Ds18b20ReadOneByte(void)           //子程序功能:从DS18B20读一个字节
{
     unsigned char i=0;
     unsigned char byte=0;
     for(i=0;i<8;i++)
     {       
           byte>>=1;
                   DQ=0;// DQ_L;
                   delay_3us();
                   DQ=1;
                   delay_3us();
           delay_3us();
                   if(DQ==1) byte|=0x80;
                   delay_50us(1); //延时40us
      }
     return(byte);
}
//***函数名称:void Ds18b20WriteOneByte(unsigned char dat)
//***函数功能:写一个字节
void Ds18b20WriteOneByte(unsigned char dat)                        //子程序功能:向DS18B20写一字节的数据
{
     unsigned char i=0;      
     for(i=0;i<8;i++)
     {       
          DQ=0;//拉低总线
          delay_3us();//至少维持1US,表示写时序(包括写0时序或写1时序)开始
          if (dat & 0x01) DQ=1; //DQ = 1
          delay_50us(1); //延时50us 以上
          dat>>=1;
          DQ=1; ///写完后必须释放总线
     }
    delay_50us(1);
}
//***函数名称:void GetTemp(void)
//***函数功能:读取温度函数
void GetTemp(void)      //读取温度函数
{
        unsigned char temp;                 //定义温度变量
        DS18B20_Init();                        //复位
        Ds18b20WriteOneByte(0xcc);  //跳过读序列号的操作
        Ds18b20WriteOneByte(0x44);  //开启温度转换
        delay_8us(2);                        //延时
        DS18B20_Init();                            //复位
        Ds18b20WriteOneByte(0xcc);  //跳过读序列号的操作
        Ds18b20WriteOneByte(0xbe);  //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
        a=Ds18b20ReadOneByte();     //读取高速暂存字节0,温度低8位
        b=Ds18b20ReadOneByte();     //读取高速暂存字节1,温度高8位

        if((b&0xf8))//判断温度的正负性把读取到的温度值高8位跟11111000做与运算判断温度正负,若高5位全部为1即为负否则为正
    {
        temp_flag=0;     //给出温度为负的标志
                f_x=tabl3[a & 0x0f]; //计算温度的小数
                temp=b<<4;
                temp+=(a&0xf0)>>4;
                temp=~temp+1;
                f_b=temp/100%10;   //计算温度的百位数据
        f_s=temp/10%10;    //计算温度的十位数据
        f_g=temp%10;      //计算温度的个位数据
    }
    else                 //温度为正数
    {
        t_x=tabl3[a & 0x0f]; //计算温度的小数
        temp=b & 0x0f;
        temp<<=4;
        a>>=4;
        temp=temp| a;
        t_b=(temp)/100%10;  //计算温度的百位数据           -2是18B20个体补偿
        t_s=(temp)/10%10;   //计算温度的十位数据
        t_g=(temp)%10;      //计算温度的个位数据
        temp_flag=1;          //给出温度为正数的标志
    }
}

#endif
回复

使用道具 举报

ID:46220 发表于 2023-6-2 15:38 | 显示全部楼层
按我的引脚连接后就是这样正常显示的,所有功能都正常
51hei图片_20230602153623.jpg
回复

使用道具 举报

ID:46220 发表于 2023-6-2 16:09 | 显示全部楼层
有一些注释是我按自己的理解加进去的,不一定正确,看看就好,还有我这里用的是3231时钟模块,也有用1302的,区别就在包含的头文件不一样,我看你还打了版,我就是直接连线,字库也改了一些,能力有限,估计还有一些不合理的地方自己都没发现
回复

使用道具 举报

ID:529213 发表于 2023-6-2 17:40 来自手机 | 显示全部楼层
niehaitao 发表于 2023-6-2 16:09
有一些注释是我按自己的理解加进去的,不一定正确,看看就好,还有我这里用的是3231时钟模块,也有用1302的 ...

非常感谢大佬,太感谢了,既然您的运行正常,那肯定是我连错线了,我用您的程序再试试,再次感谢您
回复

使用道具 举报

ID:1081788 发表于 2023-6-3 15:18 | 显示全部楼层
很棒我觉得非常的好
回复

使用道具 举报

ID:1042173 发表于 2023-6-14 22:51 | 显示全部楼层
怎我用Kill5编译不过去呀?
回复

使用道具 举报

ID:1083996 发表于 2023-6-15 08:10 | 显示全部楼层
niehaitao 发表于 2023-6-2 16:09
有一些注释是我按自己的理解加进去的,不一定正确,看看就好,还有我这里用的是3231时钟模块,也有用1302的 ...

会不会用个外置更好的晶振,能让时间更准确一些呢?
回复

使用道具 举报

ID:877406 发表于 2023-10-13 17:53 | 显示全部楼层
量子工业 发表于 2023-6-15 08:10
会不会用个外置更好的晶振,能让时间更准确一些呢?

用DS3231时间更准确
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表