找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 7672|回復(fù): 29
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)大數(shù)字萬(wàn)年歷電子鐘制作 帶農(nóng)歷年屬性溫度 代碼注釋和仿真圖PCB

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
這是我制作的LCD12864大數(shù)字萬(wàn)年歷電子鐘設(shè)計(jì),用了一個(gè)多星期時(shí)間,經(jīng)過(guò)實(shí)物實(shí)測(cè),每月時(shí)間相差幾分鐘,這是時(shí)鐘走時(shí)芯片決定的,溫度顯示還算正常。
附件里面包含單片機(jī)的源碼,仿真圖,PCB原檔。請(qǐng)大家多多指教。

制作出來(lái)的實(shí)物圖如下:



仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


protel99畫(huà)的PCB圖如下:(51hei附件中可下載工程文件)


單片機(jī)源程序如下:
  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;     //定義選擇顯示類(lèi)型, 定義數(shù)據(jù)或指令,1=數(shù)據(jù),0=指令
  9. sbit RW_LCD12864=P2^6;    //定義讀寫(xiě)信號(hào)控制端, 定義讀或?qū)??1=讀,??0=寫(xiě)
  10. sbit EN_LCD12864=P2^5;    //定義數(shù)據(jù)鎖存信號(hào), 定義使能操作, 1=能,??0=否
  11. #define LCD12864_Databus P0   //定義數(shù)據(jù)端
  12. #define sc0 0        
  13. #define sc1 1         
  14. uchar DS1302_flag;        //定義DS1302RAM中是否寫(xiě)數(shù)的標(biāo)志位,第一次開(kāi)機(jī)初始化后RAM中寫(xiě)1
  15. sbit CS1=P2^4;    //定義選擇芯片右半屏信號(hào)
  16. sbit CS2=P2^3;    //定義選擇芯片左半屏信號(hào)
  17. /*******DS1302時(shí)鐘端口******/
  18. sbit SCLK=P2^0;     //DS1302時(shí)鐘口
  19. sbit DATA=P2^1;    //DS1302串口數(shù)據(jù)
  20. sbit RST=P2^2;    //DS1302的復(fù)位口
  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;        //溫度探測(cè)口
  27. uchar fb;            //文字反白標(biāo)示
  28. uint tempvalue;     //溫度值,此變量若為uchar則溫度不正常
  29. uchar Temp_Flag;  //溫度正負(fù)標(biāo)志

  30. /***************按鍵端口************/
  31. sbit  set =P1^0;                 //設(shè)置
  32. sbit  key1=P1^1;               //加           
  33. sbit  key2=P1^2;                            //減
  34. sbit  key3=P1^3;                        //蜂鳴開(kāi)關(guān)
  35. sbit  key4=P1^4;                       //背光開(kāi)關(guān)

  36. uchar setflag=0;                   //按鍵計(jì)數(shù),決定調(diào)節(jié)的日期和時(shí)間
  37. sbit  bl=P3^5;                           //背光控制端
  38. sbit  bz=P3^6;                          //蜂鳴控制端
  39. uchar tempa;              //調(diào)時(shí)
  40. /*********農(nóng)歷部分********/
  41. #define uint unsigned int
  42. char sec,min,hour,day,month,year,week;    //定義全局變量,秒,分,時(shí),日,月,年和星期
  43. bit century;   //世紀(jì)位標(biāo)志,0為20世紀(jì),1為19世紀(jì)
  44. uchar sec_count=0;//定義定時(shí)計(jì)數(shù),當(dāng)sec_count==20時(shí),秒加一
  45. code uchar table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正數(shù)據(jù)表
  46. code uchar day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};//月份數(shù)據(jù)表
  47. code uint  day_code2[3]={0x111,0x130,0x14e};
  48. bit c_moon;
  49. data uchar year_moon,month_moon,day_moon;

  50. /*******函數(shù)聲明********/
  51. //讀取數(shù)據(jù)表中農(nóng)歷月的大月或小月,如果該月為大返回1,為小返回0
  52. bit get_moon_day(uchar month_p,uint table_addr);
  53. void Conversion(bit c,char year,char month,char day);//輸入陽(yáng)歷數(shù)據(jù),輸出陰歷數(shù)據(jù)
  54. void Conver_week();                 //輸入BCD陽(yáng)歷數(shù)據(jù),輸出BCD星期數(shù)據(jù)
  55. void delay_ms(uint x);

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

  58. /*************************************************************************************
  59. * 函數(shù)名稱    :Conversion
  60. * 功能描述    :輸入陽(yáng)歷數(shù)據(jù),輸出陰歷數(shù)據(jù)(只允許1901-2099年)
  61. * 參數(shù)        :參數(shù)名稱
  62. ****************************************************************************************/
  63. void Conversion(bit c,char year,char month,char day)
  64. {
  65. //c=0 為21世紀(jì),c=1 為19世紀(jì) 輸入輸出數(shù)據(jù)均為BCD數(shù)據(jù)
  66.   uchar temp1,temp2,temp3,month_p;
  67.   uint temp4,table_addr;
  68.   bit flag2,flag_y;

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

  73.   //取當(dāng)年節(jié)日所在的公歷月份
  74.   temp1=year_code[table_addr+2]&0x60;
  75.   temp1=_cror_(temp1,5);
  76.   //取當(dāng)年節(jié)日所在的公歷月份完成

  77.   //取當(dāng)年節(jié)日所在的公歷日
  78.   temp2=year_code[table_addr+2]&0x1f;
  79.   //取當(dāng)年節(jié)日所在的公歷日完成

  80.   // 計(jì)算當(dāng)年春年離當(dāng)年元旦的天數(shù),節(jié)日只會(huì)在公歷1月或2月
  81.   if(temp1==0x1) { temp3=temp2-1; }  
  82.   else  { temp3=temp2+0x1f-1; }
  83.   // 計(jì)算當(dāng)年春年離當(dāng)年元旦的天數(shù)完成

  84.   //計(jì)算公歷日離當(dāng)年元旦的天數(shù),為了減少運(yùn)算,用了兩個(gè)表
  85.   //day_code1[9],day_code2[3]
  86.   //如果公歷月在九月或前,天數(shù)會(huì)少于0xff,用表day_code1[9],
  87.   //在九月后,天數(shù)大于0xff,用表day_code2[3]
  88.   //如輸入公歷日為8月10日,則公歷日離元旦天數(shù)為day_code1[8-1]+10-1
  89.   //如輸入公歷日為11月10日,則公歷日離元旦天數(shù)為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月為閏月,天數(shù)加1
  94.   //計(jì)算公歷日離當(dāng)年元旦的天數(shù)完成

  95.   //判斷公歷日在節(jié)日前還是節(jié)日后
  96.   if (temp4>=temp3)
  97.   { //公歷日在節(jié)日后或就是節(jié)日當(dāng)日使用下面代碼進(jìn)行運(yùn)算
  98.     temp4-=temp3;
  99.     month=0x1;
  100.     month_p=0x1;  //month_p為月份指向,公歷日在節(jié)日前或就是節(jié)日當(dāng)日month_p指向首月
  101.     flag2=get_moon_day(month_p,table_addr); //檢查該農(nóng)歷月為大小還是小月,大月返回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);  //從數(shù)據(jù)表中取該年的閏月月份,如為0則該年無(wú)閏月
  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.   {  //公歷日在節(jié)日前使用下面代碼進(jìn)行運(yùn)算
  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為月份指向,如果當(dāng)年有閏月,一年有十三個(gè)月,月指向13,無(wú)閏月指向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碼。但根據(jù)我后面的程序,我不需要。
  154. //后面用來(lái)顯示的農(nóng)歷信息的程序分別是disp_t3()和disp_t4()
  155.   year_moon=year;
  156.   month_moon=month;
  157.   day_moon=day;
  158. }

  159. /******************************************************************************************
  160. * 函數(shù)名稱    :Conver_week
  161. * 功能描述    :輸入BCD陽(yáng)歷數(shù)據(jù),輸出BCD星期數(shù)據(jù)(只允許1901-2099年)
  162. * 參數(shù)        :  參數(shù)名稱:        輸入/輸出?        類(lèi)型                描述
  163. * 算法:日期+年份+所過(guò)閏年數(shù)+月較正數(shù)之和除7 的余數(shù)就是星期,但如果是在
  164.   閏年又不到3 月份上述之和要減一天再除7星期數(shù)。余數(shù)為0時(shí),為星期天。
  165. ******************************************************************************************/
  166. void Conver_week()
  167. {//century=0 為21世紀(jì),c=1 為19世紀(jì) 輸入輸出數(shù)據(jù)均為BCD數(shù)據(jù)
  168.   uchar temp1,temp2;
  169.   temp1=year;
  170.   if (century==0){temp1=temp1+100;}  //如果為21世紀(jì),年份數(shù)加100
  171.   temp2=temp1/4;                     //所過(guò)閏年數(shù)只算1900年之后的
  172.   temp2=temp1+temp2;
  173.   temp2=temp2%7;                     //為節(jié)省資源,先進(jìn)行一次取余,避免數(shù)大于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. 端口說(shuō)明:EN_LCD12864:使能端鎖存信號(hào)。RS_LCD12864:D/I 命令/數(shù)據(jù)寄存器選擇端
  181.           RW_LCD12864:讀寫(xiě)信號(hào)控制端. define LCD_Data P0
  182.           RS(D/I)=1,表示DB0-DB7顯示數(shù)據(jù); RS(D/I)=0,表示DB0-DB7顯示指令數(shù)據(jù)
  183.           RW=1,E=1,數(shù)據(jù)被讀到DB7-DB0;RW=0,E=1--0,數(shù)據(jù)被讀到DB7-DB0;數(shù)據(jù)被
  184. 寫(xiě)到IR或DR。
  185. (定義數(shù)據(jù)端口為 LCD_Data為P0口)
  186.           RST_LCD12864復(fù)位端口,不接或接高電平,低電平會(huì)導(dǎo)致復(fù)位
  187. 函數(shù)名稱:void Lcd12864_BusyChk()
  188. 函數(shù)功能:忙檢測(cè),若忙則等待,最長(zhǎng)等待時(shí)間為60MS(此判忙函數(shù)經(jīng)過(guò)仿真已OK)
  189. 入口參數(shù):無(wú)
  190. 出口參數(shù):無(wú)
  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. * 函數(shù)名稱:  void set_xy(unsigned char x,unsigned char y)
  205.                (仿真時(shí)的函數(shù),已OK)
  206. * 功能描述:  設(shè)置顯示位置! X,Y分別代表橫縱坐標(biāo)!
  207. * 輸入?yún)?shù)?: unsigned char x,unsigned char y
  208. *輸出參數(shù):  無(wú)??
  209. *參數(shù)名稱:? ?//列地址賦值,?x取值0----64,頁(yè)面地址賦值,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è)面地址賦值,y取值0----8
  227. EN_LCD12864=1;
  228. EN_LCD12864=0;
  229. LCD12864_Databus=0xff;
  230. }*/

  231. /**********************************************************************
  232. * 函數(shù)名稱:  void set_xy(unsigned char x,unsigned char y)
  233.                (實(shí)物時(shí)的函數(shù),已OK)
  234. * 功能描述:  設(shè)置顯示位置! X,Y分別代表橫縱坐標(biāo)!
  235. * 輸入?yún)?shù)?: unsigned char x,unsigned char y
  236. *輸出參數(shù):  無(wú)??
  237. *參數(shù)名稱:? ?//列地址賦值,?x取值0----64,頁(yè)面地址賦值,y取值0----8
  238. ***********************************************************************/





  239. /***************************************************************************************
  240. 函數(shù)名稱:void LCD12864_DispYanYueRi(fb)
  241. 函數(shù)功能:設(shè)置日期的時(shí)候,選中的參數(shù)可以反白顯示,右屏第一行顯示程序,
  242. 由which決定第幾個(gè)參數(shù)黑顯,如which==1時(shí),年份黑顯.
  243. 入口參數(shù):無(wú)
  244. 出口參數(shù):無(wú)
  245. ****************************************************************************************/

  246. void LCD12864_DispYanYueRi(fb)              //顯示年月日
  247. {
  248.   if(century)    //如果世紀(jì)為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列顯示年十位數(shù)
  259.      Lcd12864_DispChar(3,0,year%10,fb); //第1行第4列顯示年個(gè)位數(shù)
  260.      Lcd12864_DispChar(4,0,11,0);                   //第1行第5列顯示第11個(gè)數(shù)據(jù)”-”
  261.      Lcd12864_DispChar(5,0,month/10,fb);   //第1行第6列顯示月十位數(shù)
  262.      Lcd12864_DispChar(6,0,month%10,fb); //第1行第7列顯示月個(gè)位數(shù)
  263.      Lcd12864_DispChar(7,0,11,0);                        //第1行第8列顯示第11個(gè)數(shù)據(jù)”-”                  
  264.      Lcd12864_DispChar(8,0,day/10,fb);   //第1行第9列顯示日十位數(shù)
  265.      Lcd12864_DispChar(9,0,day%10,fb);  //第1行第10列顯示日個(gè)位數(shù)
  266. }

  267. /******************************************************************************
  268. 函數(shù)名稱:void LCD12864_DispShiFenMiao(fb)    顯示時(shí)分秒
  269. 函數(shù)功能:設(shè)置時(shí)間的時(shí)候,選中的參數(shù)可以反白顯示,右屏第二行顯示程序,
  270. 由which決定第幾個(gè)參數(shù)黑顯,如which==1時(shí),年份黑顯.
  271. 入口參數(shù):無(wú)
  272. 出口參數(shù):無(wú)
  273. ***********************************************************************/
  274. void LCD12864_DispShiFenMiao(fb)
  275. {
  276.       Lcd12864_DispDaShuZi(0,2,hour/10,fb);    //第2行第1列顯示小時(shí)十位數(shù)
  277.       Lcd12864_DispDaShuZi(2,2,hour%10,fb);  //第2行第3列顯示小時(shí)個(gè)位數(shù)
  278.   if(sec%2==0)                          //如果秒為奇數(shù)則顯示冒號(hào),否則顯示空
  279. Lcd12864_DispDaShuZi(4,2,10,0);    //第2行第4列第10個(gè)大數(shù)字為顯示冒號(hào),不反白
  280.   else
  281. Lcd12864_DispDaShuZi(4,2,11,0);   //第2行第4列第11個(gè)大數(shù)字為顯示空,不反白
  282.       Lcd12864_DispDaShuZi(6,2,min/10,fb);  //第2行第6列顯示分鐘的十位數(shù)

  283.       Lcd12864_DispDaShuZi(8,2,min%10,fb); //第2行第8列顯示分鐘的個(gè)位數(shù)
  284.   if(sec%2==0)
  285. Lcd12864_DispDaShuZi(10,2,10,0);      //第2行第10列第10個(gè)大數(shù)字為顯示冒號(hào),不反白
  286.   else
  287. Lcd12864_DispDaShuZi(10,2,11,0);      //第2行第10列第11個(gè)大數(shù)字為顯示空,不反白
  288. Lcd12864_DispDaShuZi(12,2,sec/10,fb);  //第2行第10列顯示秒鐘的十位數(shù)
  289.       Lcd12864_DispDaShuZi(14,2,sec%10,fb); //顯示秒鐘
  290. }

  291. /******************************************************************************
  292. 函數(shù)名稱:void LCD12864_DispWeek(fb)    顯示  周
  293. 函數(shù)功能:設(shè)置時(shí)間的時(shí)候,選中的參數(shù)可以反白顯示,右屏第一行顯示程序,
  294. 由which決定第幾個(gè)參數(shù)黑顯,如which==1時(shí),年份黑顯.
  295. 入口參數(shù):無(wú)
  296. 出口參數(shù):無(wú)
  297. *******************************************************************************/

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

  301.   Lcd12864_DispWord(12,0,27,0);            //第1行第13列第27個(gè)漢字為顯示“周”字
  302.   Conver_week();                          //調(diào)用星期陽(yáng)歷數(shù)據(jù)
  303.   if(week)
  304. temp=week;                      //賦week值為1----6,用來(lái)顯示“一”----“六”
  305.   else
  306. week=26;                          //賦week值為0時(shí),賦值26用來(lái)顯示“日”
  307. Lcd12864_DispWord(14,0,week,0);   //第1行第14列第26個(gè)漢字為顯示“日”   
  308. //verify_time();                     //此函數(shù)加上才能得到十二生肖后的農(nóng)歷日期
  309. ReadTime_DS1302();
  310.         GetTime_DS1302();

  311.        Conversion(century,year,month,day); //得到農(nóng)歷日期

  312.   if(c_moon)
  313. temp=year_moon%12+12;       //如果是19世紀(jì),則可直接得出年的屬性
  314.   else   
  315. temp=(year_moon+100)%12+12; //農(nóng)歷年也過(guò)了世紀(jì),則農(nóng)歷年加100再求屬性
  316.         Lcd12864_DispWord(0,6,temp,1); // 第7行第1列  顯示十二生肖屬性
  317. }

  318. /******************************************************************************
  319. 函數(shù)名稱:void LCD12864_DispNongLiRiQi(fb)    顯示  農(nóng)歷日期
  320. 函數(shù)功能:第4行農(nóng)歷顯示
  321. 由which決定第幾個(gè)參數(shù)黑顯,如which==1時(shí),年份黑顯.
  322. 入口參數(shù):無(wú)
  323. 出口參數(shù):無(wú)
  324. *******************************************************************************/

  325. void LCD12864_DispNongLiRiQi()
  326. {
  327.   uchar temp1,temp2;
  328. //  verify_time();
  329.   Conversion(century,year,month,day);   //得到農(nóng)歷日期,世紀(jì)年月日
  330.   temp1=month_moon/10;
  331.   temp2=month_moon%10;
  332. //月份高位為0,低位為1,則月份前位顯"正",后位顯示“月”字
  333.   if(temp1==0&&temp2==1)  //如果農(nóng)歷日期,月的十位為0,個(gè)位為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列  顯示低位農(nóng)歷月份
  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列  顯示低位農(nóng)歷月份
  384. break;

  385. //日期高位為3,則前位顯“三”,低位顯“十”
  386. case 3:  Lcd12864_DispWord(6,6,3,0);      //第7行第7列  顯示”三”字
  387. Lcd12864_DispWord(6,6,temp2,0); //第7行第9列  顯示低位農(nóng)歷月份
  388. break;
  389.     }
  390. }

  391. /*主程序*/
  392. void main(void)
  393. {
  394.     bl=0;
  395.     lcd12864_Init();                  //液晶初始化,此函數(shù)只起清屏的作用
  396.     century=0;                       //對(duì)世紀(jì)賦初值
  397.     Conversion(century,year,month,day);
  398.         DS1302_flag=Read_DS1302(0xc0); //讀取首地址中的值,0xc0為DS1302RAM的首地址,
  399.                                   //偶數(shù)為寫(xiě),奇數(shù)讀
  400.     if(DS1302_flag==0)
  401.         {
  402.        Init_DS1302();          //時(shí)間初始化,起決于當(dāng)前顯示的時(shí)間
  403.        Write_DS1302(0xc0,1);  
  404.     }
  405.     while(1)
  406.     {
  407.         ReadTime_DS1302();        //讀出時(shí)鐘數(shù)據(jù)
  408.             GetTime_DS1302(); //將BCD時(shí)鐘數(shù)據(jù)轉(zhuǎn)換為可以計(jì)算的HEX數(shù)據(jù)
  409.                 GetTemp();
  410.         Lcd12864_DispTemp();
  411.         KeyScan();
  412.         if(setflag==0)
  413.                 {
  414.                
  415.         Lcd12864_DispTime(); //這里調(diào)用顯示時(shí)間程序
  416.            
  417.                 }
  418.     }
  419. }
復(fù)制代碼

所有資料51hei附件下載:
Keil代碼與Proteus8.8仿真dsn文件下載: 仿真代碼.7z (127.31 KB, 下載次數(shù): 206)
protel99格式的PCB文件: protel99格式.7z (405.85 KB, 下載次數(shù): 103)


評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏24 分享淘帖 頂7 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1047454 發(fā)表于 2022-11-22 22:58 | 只看該作者
這么好的東東怎么沒(méi)人頂呀,我正想學(xué)習(xí)呢,請(qǐng)問(wèn)樓主用的屏帶中文字庫(kù)的嗎?看仿真好像不帶喲。謝謝樓主無(wú)私奉獻(xiàn)!
回復(fù)

使用道具 舉報(bào)

板凳
ID:92553 發(fā)表于 2022-12-4 15:32 | 只看該作者
要是能用在24064屏就好了,因?yàn)槲沂诸^就一個(gè)24064的屏
回復(fù)

使用道具 舉報(bào)

地板
ID:81249 發(fā)表于 2022-12-4 20:08 | 只看該作者
非常好,還沒(méi)有仔細(xì)看,非常精煉,我寫(xiě)的沒(méi)帶萬(wàn)年歷還有近4K字節(jié),要借鑒一下
回復(fù)

使用道具 舉報(bào)

5#
ID:401598 發(fā)表于 2022-12-12 09:26 | 只看該作者
謝謝分享萬(wàn)年歷。
回復(fù)

使用道具 舉報(bào)

6#
ID:46220 發(fā)表于 2022-12-18 09:30 | 只看該作者
謝謝分享,已經(jīng)制作成功,稍微作了下改動(dòng),原來(lái)秒的兩點(diǎn)是顯示1秒滅1秒,加了定時(shí)器大約500毫秒亮500毫秒滅,然后把小時(shí)的十位在是0的時(shí)候不顯示

51hei圖片_20221218092339.jpg (127.68 KB, 下載次數(shù): 145)

51hei圖片_20221218092339.jpg

51hei圖片_20221218092349.jpg (127.17 KB, 下載次數(shù): 148)

51hei圖片_20221218092349.jpg

51hei圖片_20221218093016.jpg (121.03 KB, 下載次數(shù): 149)

51hei圖片_20221218093016.jpg
回復(fù)

使用道具 舉報(bào)

7#
ID:92553 發(fā)表于 2022-12-20 14:23 | 只看該作者
niehaitao 發(fā)表于 2022-12-18 09:30
謝謝分享,已經(jīng)制作成功,稍微作了下改動(dòng),原來(lái)秒的兩點(diǎn)是顯示1秒滅1秒,加了定時(shí)器大約500毫秒亮500毫秒滅 ...

12864帶不帶字庫(kù)
回復(fù)

使用道具 舉報(bào)

8#
ID:46220 發(fā)表于 2022-12-20 21:38 來(lái)自手機(jī) | 只看該作者
紫氣東來(lái) 發(fā)表于 2022-12-20 14:23
12864帶不帶字庫(kù)

不帶字庫(kù)的,程序里面有自建的字庫(kù)文件
回復(fù)

使用道具 舉報(bào)

9#
ID:88256 發(fā)表于 2022-12-25 17:25 | 只看該作者
紫氣東來(lái) 發(fā)表于 2022-12-4 15:32
要是能用在24064屏就好了,因?yàn)槲沂诸^就一個(gè)24064的屏

你會(huì)讓24064顯示就可以自己改顯示部分啊,或者搜索一下,比如這個(gè)顯示
回復(fù)

使用道具 舉報(bào)

10#
ID:877406 發(fā)表于 2023-2-7 11:16 | 只看該作者
hchi2006 發(fā)表于 2022-11-22 22:58
這么好的東東怎么沒(méi)人頂呀,我正想學(xué)習(xí)呢,請(qǐng)問(wèn)樓主用的屏帶中文字庫(kù)的嗎?看仿真好像不帶喲。謝謝樓主無(wú)私 ...

用的不帶字庫(kù)屏
回復(fù)

使用道具 舉報(bào)

11#
ID:894868 發(fā)表于 2023-2-10 15:09 | 只看該作者
要對(duì)作者支持鼓勵(lì)··謝謝分享
回復(fù)

使用道具 舉報(bào)

12#
ID:824664 發(fā)表于 2023-3-12 23:41 | 只看該作者
謝謝分享,制作精良,外觀漂亮。
回復(fù)

使用道具 舉報(bào)

13#
ID:1062292 發(fā)表于 2023-3-17 21:30 | 只看該作者
太厲害了,小白仰慕
回復(fù)

使用道具 舉報(bào)

14#
ID:707395 發(fā)表于 2023-4-17 11:29 | 只看該作者

謝謝分享,制作精良,外觀漂亮。
回復(fù)

使用道具 舉報(bào)

15#
ID:529213 發(fā)表于 2023-5-17 16:59 來(lái)自手機(jī) | 只看該作者
請(qǐng)問(wèn)各位大佬,1302的晶振焊在哪里,能發(fā)個(gè)電路圖嗎?非常感謝
回復(fù)

使用道具 舉報(bào)

16#
ID:529213 發(fā)表于 2023-6-1 23:27 來(lái)自手機(jī) | 只看該作者
按鍵調(diào)整減貌似有問(wèn)題,另外就是調(diào)秒鐘時(shí),秒鐘數(shù)字亂跳,還有鬧鐘無(wú)法調(diào)整

IMG_20230601_231400.jpg (218.9 KB, 下載次數(shù): 125)

IMG_20230601_231400.jpg
回復(fù)

使用道具 舉報(bào)

17#
ID:529213 發(fā)表于 2023-6-2 06:47 來(lái)自手機(jī) | 只看該作者
niehaitao 發(fā)表于 2022-12-18 09:30
謝謝分享,已經(jīng)制作成功,稍微作了下改動(dòng),原來(lái)秒的兩點(diǎn)是顯示1秒滅1秒,加了定時(shí)器大約500毫秒亮500毫秒滅 ...

請(qǐng)教大佬,我做出來(lái)后,按鍵減少調(diào)整不了,并且秒鐘的調(diào)整有問(wèn)題,請(qǐng)問(wèn)大佬怎么解決的,謝謝。如果解決了,能共享一下程序嗎?感激不盡
回復(fù)

使用道具 舉報(bào)

18#
ID:46220 發(fā)表于 2023-6-2 15:30 | 只看該作者
hnxtlxx 發(fā)表于 2023-6-2 06:47
請(qǐng)教大佬,我做出來(lái)后,按鍵減少調(diào)整不了,并且秒鐘的調(diào)整有問(wèn)題,請(qǐng)問(wèn)大佬怎么解決的,謝謝。如果解決了 ...

朋友,我是業(yè)余玩玩的,這有半年沒(méi)弄過(guò)了,不記得當(dāng)時(shí)改了那些地方,壓縮上傳我也不會(huì)弄,我試試把所有文件貼在這里看行不行
回復(fù)

使用道具 舉報(bào)

19#
ID:46220 發(fā)表于 2023-6-2 15:31 | 只看該作者
#include<reg51.h>                                 //用89C52單片機(jī)
#include<intrins.h>
#include<18B20.h>                 //18B20頭文件
#include<DS3231.h>                 //DS1302頭文件
#include<nongli.h>                  //農(nóng)歷轉(zhuǎn)換頭文件
#include<ziku.h>                  //字庫(kù)頭文件
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
/******LCD12864通訊端口******/
sbit RS_LCD12864=P2^7;     //定義選擇顯示類(lèi)型, 定義數(shù)據(jù)或指令,1=數(shù)據(jù),0=指令
sbit RW_LCD12864=P2^6;    //定義讀寫(xiě)信號(hào)控制端, 定義讀或?qū)??1=讀,??0=寫(xiě)
sbit EN_LCD12864=P2^5;    //定義數(shù)據(jù)鎖存信號(hào), 定義使能操作, 1=能,??0=否
#define LCD12864_Databus P0   //定義數(shù)據(jù)端
#define sc0 0       
#define sc1 1
unsigned char fb;         

sbit CS1=P2^4;    //定義選擇芯片右半屏信號(hào)
sbit CS2=P2^3;    //定義選擇芯片左半屏信號(hào)

unsigned char shan_count; //:號(hào)閃爍計(jì)時(shí)變量
unsigned char shan_js;    //校時(shí)閃爍計(jì)時(shí)變量
bit flag;                //校時(shí)閃爍標(biāo)志位

void Timer0Init();                 //聲明定時(shí)器初始化函數(shù)           10毫秒

/********************************LCD12864部分*****************************/
/******************************************************************************
端口說(shuō)明:EN_LCD12864:使能端鎖存信號(hào)。RS_LCD12864:D/I 命令/數(shù)據(jù)寄存器選擇端
          RW_LCD12864:讀寫(xiě)信號(hào)控制端. define LCD_Data P0
          RS(D/I)=1,表示DB0-DB7顯示數(shù)據(jù); RS(D/I)=0,表示DB0-DB7顯示指令數(shù)據(jù)
          RW=1,E=1,數(shù)據(jù)被讀到DB7-DB0;RW=0,E=1--0,數(shù)據(jù)被讀到DB7-DB0;數(shù)據(jù)被
寫(xiě)到IR或DR。
(定義數(shù)據(jù)端口為 LCD_Data為P0口)
          RST_LCD12864復(fù)位端口,不接或接高電平,低電平會(huì)導(dǎo)致復(fù)位
函數(shù)名稱:void Lcd12864_BusyChk()
函數(shù)功能:忙檢測(cè),若忙則等待,最長(zhǎng)等待時(shí)間為60MS(此判忙函數(shù)經(jīng)過(guò)仿真已OK)
入口參數(shù):無(wú)
出口參數(shù):無(wú)
***********************************************************************/
void Lcd12864_BusyChk()                //忙檢測(cè),若忙則等待,最長(zhǎng)等待時(shí)間為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;
}
/**********************************************************************
* 函數(shù)名稱:  void set_xy(unsigned char x,unsigned char y)
               (實(shí)物時(shí)的函數(shù),已OK)
* 功能描述:  設(shè)置顯示位置! X,Y分別代表橫縱坐標(biāo)!
* 輸入?yún)?shù)?: unsigned char x,unsigned char y
*輸出參數(shù):  無(wú)??
*參數(shù)名稱:? ?//列地址賦值,?x取值0----64,頁(yè)面地址賦值,y取值0----8
***********************************************************************/
void set_xy(unsigned char x,unsigned char y)        // 設(shè)置顯示位置! X,Y分別代表橫縱坐標(biāo)!
{
        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è)面地址賦值,y取值0----8
        EN_LCD12864=1;
        EN_LCD12864=0;
        LCD12864_Databus=0xff;
}
/*******************************************************************************
* 函數(shù)名稱: void lw(uchar x,uchar y,uchar dd)
* 功能描述: 在指定的位置顯示數(shù)據(jù)
* 輸入?yún)?shù)?:(unsigned char x,unsigned char y,uchar dd)
*輸出參數(shù):  無(wú)??
?*******************************************************************************/
void Lcd12864_WriteData(unsigned char x,unsigned char y,unsigned char dd)         //在指定的位置顯示數(shù)據(jù)
{
        set_xy(x,y);
        Lcd12864_BusyChk();
        RS_LCD12864=1;
        RW_LCD12864=0;
        LCD12864_Databus=dd;       //數(shù)據(jù)送顯
        EN_LCD12864=1;
        EN_LCD12864=0;
        LCD12864_Databus=0xff;
}
/**********************************************************************
* 函數(shù)名稱: void lcd12864_Init(void)(仿真時(shí)的函數(shù),已仿真OK)
* 功能描述: 顯示初始化
* 輸入?yún)?shù)?:無(wú)
* 輸出參數(shù): 無(wú)??
***********************************************************************/
void lcd12864_Init(void)           //12864 顯示初始化
{
        unsigned char x,y;
        RS_LCD12864=0;
        RW_LCD12864=0;
        EN_LCD12864=0;
        CS1=sc1;                  //選擇左半屏顯示
        LCD12864_Databus=0x3f;   //打開(kāi)左半屏顯示
        EN_LCD12864=1;
        EN_LCD12864=0;
        CS2=sc1;                  //選擇右半屏顯示
        LCD12864_Databus=0x3f;   //打開(kāi)右半屏顯示
        EN_LCD12864=1;
        EN_LCD12864=0;
        CS1=sc1;
        Lcd12864_BusyChk();
        RS_LCD12864=0;
        RW_LCD12864=0;
        LCD12864_Databus=0xc0;   //設(shè)置左半屏起始行,是第一行
        EN_LCD12864=1;
        EN_LCD12864=0;
        CS2=sc1;
        Lcd12864_BusyChk();
        RS_LCD12864=0;
        RW_LCD12864=0;
        LCD12864_Databus=0xc0;   //設(shè)置右半屏起始行,是第一行
        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);   //全屏清零顯示
        }
}
/**********************************************************************
* 函數(shù)名稱: void Lcd12864_DispWord(uchar x,uchar y,uchar n,uchar fb)
* 功能描述:顯示一個(gè)漢字,n代表字表里第n個(gè)字!fb==1:反白顯示
* 輸入?yún)?shù)?:(uchar x,uchar y,uchar n,uchar fb)
*輸出參數(shù):  無(wú)??
* 顯示方式為先上半部第一列,再下半部第一列,然后上半部第二列...
?***********************************************************************/

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);  //顯示漢字的下半部分
  }
}
/**********************************************************************
* 函數(shù)名稱:void Lcd12864_DispDaShuZi(uchar x,uchar y,uchar n,uchar fb)  
* 功能描述:顯示一個(gè)大的數(shù)字,n代表字表里第n個(gè)數(shù)字!fb==1:反白顯示
* 輸入?yún)?shù)?:(uchar x,uchar y,uchar n,uchar fb)
* 輸出參數(shù):  無(wú)??
* 顯示方式為先上半部第一列,再下半部第一列,然后上半部第二列...
?***********************************************************************/
void Lcd12864_DispDaShuZi(unsigned char x,unsigned char y,unsigned char n,unsigned char fb)    //顯示一個(gè)大的數(shù)字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);       //顯示大數(shù)字的上半部分

    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);       //顯示大數(shù)字的下半部分
  }
}

/**********************************************************************
* 函數(shù)名稱: void Lcd12864_DispChar(uchar x,uchar y,uchar n,uchar fb)
* 功能描述: 顯示一個(gè)數(shù)字,n代表字表里第n個(gè)數(shù)字!fb==1:反白顯示
             X; 0-7列,共64列, y: 0-7頁(yè)
* 功能描述:  顯示年月日,溫度的數(shù)字
* 輸入?yún)?shù)?:(uchar x,uchar y,uchar n,uchar fb)
*輸出參數(shù):  無(wú)??
?***********************************************************************/
void Lcd12864_DispChar(unsigned char x,unsigned char y,unsigned char n,unsigned char fb)  //顯示年月日,溫度的數(shù)字/8X16數(shù)據(jù)
{
  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);        //顯示數(shù)字的上半部分
    dd=number[i+n*16+8];
    if (fb) dd=255-dd;
    Lcd12864_WriteData(x*8+i,y+1,dd);    //顯示數(shù)字的下半部分
  }
}
/***************************************************************************************
函數(shù)名稱:void LCD12864_DispYanYueRi(fb)
函數(shù)功能:設(shè)置日期的時(shí)候,選中的參數(shù)可以反白顯示,右屏第一行顯示程序,
由which決定第幾個(gè)參數(shù)黑顯,如which==1時(shí),年份黑顯.
入口參數(shù):無(wú)
出口參數(shù):無(wú)
****************************************************************************************/
void LCD12864_DispYanYueRi(fb)              //顯示年月日
{
  if(century)    //如果世紀(jì)為1
  {
       Lcd12864_DispChar(2,0,1,0);    //第1行第3列顯示世紀(jì)的十位’1”
       Lcd12864_DispChar(3,0,9,0);   //第1行第4列顯示世紀(jì)的個(gè)位’9”
  }
  else
  {
      Lcd12864_DispChar(2,0,2,0);   //第1行第3列顯示世紀(jì)的十位’2”
      Lcd12864_DispChar(3,0,0,0);  //第1行第4列顯示世紀(jì)的個(gè)位’0”
  }
           if(disflag==4 && flag==0)  //校正年的時(shí)候年閃爍
         {
                 Lcd12864_DispChar(4,0,12,fb);  //第1行第5不顯示年十位數(shù)
              Lcd12864_DispChar(5,0,12,fb); //第1行第6不顯示年個(gè)位數(shù)
         }
         else
         {
                  Lcd12864_DispChar(4,0,year/10,fb);  //第1行第5顯示年十位數(shù)
              Lcd12864_DispChar(5,0,year%10,fb); //第1行第6顯示年個(gè)位數(shù)
         }

         Lcd12864_DispChar(6,0,11,0);                   //第1行第7顯示第11個(gè)數(shù)據(jù)”-”

     if(disflag==5 && flag==0)  //校正月的時(shí)候月閃爍
         {
                  Lcd12864_DispChar(7,0,12,fb);   //第1行第8不顯示月十位數(shù)
              Lcd12864_DispChar(8,0,12,fb); //第1行第9列不顯示月個(gè)位數(shù)
         }
         else
         {
                  Lcd12864_DispChar(7,0,month/10,fb);   //第1行第8顯示月十位數(shù)
              Lcd12864_DispChar(8,0,month%10,fb); //第1行第9列顯示月個(gè)位數(shù)
         }
         
     Lcd12864_DispChar(9,0,11,0);                        //第1行第10列顯示第11個(gè)數(shù)據(jù)”-”
         
         if(disflag==6 && flag==0)  //校正日期的時(shí)候日閃爍
         {
                 Lcd12864_DispChar(10,0,12,fb);   //第1行第11列不顯示日十位數(shù)
             Lcd12864_DispChar(11,0,12,fb);  //第1行第12列不顯示日個(gè)位數(shù)
         }
         else
         {
                  Lcd12864_DispChar(10,0,day/10,fb);   //第1行第11列顯示日十位數(shù)
              Lcd12864_DispChar(11,0,day%10,fb);  //第1行第12列顯示日個(gè)位數(shù)
         }                       
}

/******************************************************************************
函數(shù)名稱:void LCD12864_DispShiFenMiao(fb)    顯示時(shí)分秒
函數(shù)功能:設(shè)置時(shí)間的時(shí)候,選中的參數(shù)可以反白顯示,右屏第二行顯示程序,
由which決定第幾個(gè)參數(shù)黑顯,如which==1時(shí),年份黑顯.
入口參數(shù):無(wú)
出口參數(shù):無(wú)
***********************************************************************/
void LCD12864_DispShiFenMiao(fb)                  //顯示時(shí)分秒
{
          if(disflag==1 && flag==0)  //時(shí)鐘小時(shí)的時(shí)候小時(shí)閃爍
          {
                   Lcd12864_DispDaShuZi(0,2,11,fb);    //第3行第1/2列不顯示小時(shí)十位數(shù)
               Lcd12864_DispDaShuZi(2,2,11,fb);  //第3行第3/4列不顯示小時(shí)個(gè)位數(shù)
          }
          else
          {
                    if((hour/10)!=0)                        //10點(diǎn)到23點(diǎn)顯示小時(shí)的十位
                  {
                              Lcd12864_DispDaShuZi(0,2,hour/10,fb);    //第3行第1/2列顯示小時(shí)十位數(shù)
                              Lcd12864_DispDaShuZi(2,2,hour%10,fb);  //第3行第3/4列顯示小時(shí)個(gè)位數(shù)
                  }
                  else                                          //0點(diǎn)至9點(diǎn)不顯示小時(shí)的十位0
                  {
                                  Lcd12864_DispDaShuZi(0,2,11,fb);    //第3行第1/2列不顯示小時(shí)十位數(shù)
                              Lcd12864_DispDaShuZi(2,2,hour%10,fb);  //第3行第3/4列顯示小時(shí)個(gè)位數(shù)
                  }
          }
          
    if(shan_count >=10 && disflag==0)         //正常走時(shí),如果shan_count>=10        ,冒號(hào)閃爍
    {
                Lcd12864_DispDaShuZi(4,2,10,0);       //第3行第5/6列第10個(gè)大數(shù)字為顯示冒號(hào),不反白
                Lcd12864_DispDaShuZi(10,2,10,0);      //第3行第11/12列第10個(gè)大數(shù)字為顯示冒號(hào),不反白
        }
        else                                  //大于0.5秒時(shí)兩點(diǎn)不顯示形成閃爍效果
        {
                Lcd12864_DispDaShuZi(4,2,11,0);       //第3行第5/6列第11個(gè)大數(shù)字為顯示空,不反白
                Lcd12864_DispDaShuZi(10,2,11,0);      //第3行第11/12列第11個(gè)大數(shù)字為顯示空,不反白
        }

    if(disflag==2 && flag==0)  //設(shè)置分的時(shí)候分閃爍
        {
                Lcd12864_DispDaShuZi(6,2,11,fb);  //第3行第7/8列不顯示分鐘的十位數(shù)
              Lcd12864_DispDaShuZi(8,2,11,fb); //第3行第9/10列不顯示分鐘的個(gè)位數(shù)
        }
        else
        {
                Lcd12864_DispDaShuZi(6,2,min/10,fb);  //第3行第7/8列顯示分鐘的十位數(shù)
              Lcd12864_DispDaShuZi(8,2,min%10,fb); //第3行第9/10列顯示分鐘的個(gè)位數(shù)
        }
      
            if(disflag==3 && flag==0)  //校時(shí)的時(shí)候秒閃爍
          {
                      Lcd12864_DispDaShuZi(12,2,11,fb);  //第3行第13/14列不顯示秒鐘的十位數(shù)
                      Lcd12864_DispDaShuZi(14,2,11,fb); //第3行第15/16列不顯示秒鐘的個(gè)位數(shù)
          }
          else
          {
                      Lcd12864_DispDaShuZi(12,2,sec/10,fb);  //第3行第13/14列顯示秒鐘的十位數(shù)
                      Lcd12864_DispDaShuZi(14,2,sec%10,fb); //第3行第15/16列顯示秒鐘的個(gè)位數(shù)
          }
          
}
/******************************************************************************
函數(shù)名稱:void LCD12864_DispWeek(fb)    顯示  周
函數(shù)功能:設(shè)置時(shí)間的時(shí)候,選中的參數(shù)可以反白顯示,右屏第一行顯示程序,
由which決定第幾個(gè)參數(shù)黑顯,如which==1時(shí),年份黑顯.
入口參數(shù):無(wú)
出口參數(shù):無(wú)
*******************************************************************************/
void LCD12864_DispWeek()                          //顯示星期/周          生肖屬性
{
          unsigned char temp;
          Lcd12864_DispWord(12,0,27,0);            //第1行第13列第27個(gè)漢字為顯示“周”字
          Conver_week();                          //調(diào)用星期陽(yáng)歷數(shù)據(jù)
          if(week)
                temp=week;                      //賦week值為1----6,用來(lái)顯示“一”----“六”
          else
                week=26;                          //賦week值為0時(shí),賦值26用來(lái)顯示“日”
        Lcd12864_DispWord(14,0,week,0);   //第1行第14列第26個(gè)漢字為顯示“日”   

                read3231();                                           //讀出DS3231的各個(gè)數(shù)據(jù)
        Conversion(century,year,month,day); //得到農(nóng)歷日期
   if(c_moon)                                         //century=0 為21世紀(jì),c=1 為19世紀(jì)
        temp=year_moon%12+12;       //如果是19世紀(jì),則可直接得出年的屬性          加12是因?yàn)樯ぴ谧謳?kù)的第13個(gè)開(kāi)始
  else   
        temp=(year_moon+100)%12+12; //農(nóng)歷年也過(guò)了世紀(jì),則農(nóng)歷年加100再求屬性 加12是因?yàn)樯ぴ谧謳?kù)的第13個(gè)開(kāi)始
        Lcd12864_DispWord(0,0,temp,1);// 第1行第1列  顯示十二生肖屬性         1反顯
}
/******************************************************************************
函數(shù)名稱:void LCD12864_DispNongLiRiQi(fb)    顯示  農(nóng)歷日期
函數(shù)功能:第4行農(nóng)歷顯示
由which決定第幾個(gè)參數(shù)黑顯,如which==1時(shí),年份黑顯.
入口參數(shù):無(wú)
出口參數(shù):無(wú)
*******************************************************************************/
void LCD12864_DispNongLiRiQi()                  //顯示農(nóng)歷日期
{
  unsigned char temp1,temp2;
//  verify_time();
  Conversion(century,year,month,day);   //得到農(nóng)歷日期,世紀(jì)/年/月/日
  temp1=month_moon/10;                          //農(nóng)歷月份高位   兩位農(nóng)歷月份求模送顯示
  temp2=month_moon%10;                          //農(nóng)歷月份低位   兩位農(nóng)歷月份求模送顯示
//月份高位為0,低位為1,則月份前位顯"正",后位顯示“月”字
  if(temp1==0&&temp2==1)  //如果農(nóng)歷日期,月的十位為0,個(gè)位為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;                //農(nóng)歷日期高位         兩位農(nóng)歷日期求模送顯示
                  temp2=day_moon%10;                 //農(nóng)歷日期地位          兩位農(nóng)歷日期求余送顯示

  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列  顯示低位農(nóng)歷月份
                                        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列  顯示低位農(nóng)歷月份
                                 break;
                //日期高位為3,則前位顯“三”,低位顯“十”
                case 3:  Lcd12864_DispWord(4,6,3,0);      //第7行第5列  顯示”三”字
                                 Lcd12864_DispWord(6,6,temp2,0); //第7行第7列  顯示低位農(nóng)歷月份
                                 break;
    }
}

void Lcd12864_DispTemp()                //溫度顯示程序          正顯
{
        if(temp_flag==1)//溫度為正數(shù)標(biāo)志
        {
                if((t_b==0)&(t_s==0))//10度以下時(shí)不顯示十位
                {       
                        Lcd12864_DispWord(8,6,40,0);                 //第7行第9列10列固定顯示溫度"!"圖標(biāo),16X16數(shù)據(jù)
                        Lcd12864_DispChar(10,6,t_g,0);       //第7行第11列/顯示個(gè)位數(shù)據(jù)         8*16數(shù)據(jù)
                        Lcd12864_DispChar(11,6,13,0);                 //第7行第12列/顯示數(shù)據(jù)為“.”字符           8*16數(shù)據(jù)
                        Lcd12864_DispChar(12,6,t_x,0);       //第7行第13列/顯示小數(shù)位  8*16數(shù)據(jù)
                        Lcd12864_DispChar(13,6,12,0);        //第7行第14列/(12)不顯示  8*16數(shù)據(jù)    第四位/1反白0正顯示       
                }
                else
                {
                        Lcd12864_DispWord(8,6,40,0);                 //第7行第9列10列固定顯示溫度"!"圖標(biāo),16X16數(shù)據(jù)
                        Lcd12864_DispChar(10,6,t_s,0);       //第7行第11列/顯示十位數(shù)據(jù)         8*16數(shù)據(jù)
                        Lcd12864_DispChar(11,6,t_g,0);      //第7行第12列/顯示個(gè)位數(shù)據(jù)         8*16數(shù)據(jù)
                        Lcd12864_DispChar(12,6,13,0);                 //第7行第13列/顯示數(shù)據(jù)為“.”字符           8*16數(shù)據(jù)
                        Lcd12864_DispChar(13,6,t_x,0);       //第7行第14列/顯示小數(shù)位  8*16數(shù)據(jù)                               
                }
        }
/*
        if(temp_flag==0)//溫度為負(fù)數(shù)時(shí)
        {
                        Lcd12864_DispWord(8,6,40,0);                 //第7行第9列10列固定顯示溫度"!"圖標(biāo),16X16數(shù)據(jù)
                         Lcd12864_DispChar(10,6,11,0);         //第7行第11列/顯示-負(fù)號(hào)             8*16數(shù)據(jù)
                        Lcd12864_DispChar(11,6,f_g,0);         //第7行第12列/顯示負(fù)溫度個(gè)位數(shù)據(jù)                    8*16數(shù)據(jù)
                        Lcd12864_DispChar(12,6,13,0);                  //第7行第13列/顯示數(shù)據(jù)為“.”字符           8*16數(shù)據(jù)
                        Lcd12864_DispChar(13,6,f_x,0);         //第7行第14列/顯示負(fù)溫度小數(shù)位數(shù)據(jù)             8*16數(shù)據(jù)       
        }
*/       
        Lcd12864_DispWord(14,6,28,0);                 //第7行第15列16列固定顯示溫度"℃"圖標(biāo),16X16數(shù)據(jù)
}

/******************************************************************************
函數(shù)名稱:void Lcd12864_DispTime()    顯示  日期與時(shí)鐘
函數(shù)功能://第一行顯示年月日8X16數(shù)字,最后為周
          //第二行顯示時(shí)分秒,大數(shù)字
          //第三行顯示農(nóng)歷,溫度
入口參數(shù):無(wú)
出口參數(shù):無(wú)
*******************************************************************************/
void Lcd12864_DispTime()                         //顯示日期與時(shí)鐘子程序
{  
   LCD12864_DispYanYueRi(0);        //第一行顯示年月日
   LCD12864_DispShiFenMiao(0);     //第二行顯示時(shí)分秒,大數(shù)字
   LCD12864_DispWeek();           //第一行顯示星期         生肖
   LCD12864_DispNongLiRiQi();     //第三行顯示農(nóng)歷
}
          
/*主程序*/
void main(void)
{
    Timer0Init();                //10毫秒@11.0592MHz
    lcd12864_Init();    //液晶初始化,此函數(shù)只起清屏的作用
    century=0;          //對(duì)世紀(jì)賦初值
    while(1)
    {
                read3231();                     //讀出DS3231的各個(gè)數(shù)據(jù)
                GetTemp();                     //讀取溫度函數(shù)
                Lcd12864_DispTemp(); //溫度顯示處理函數(shù)                        
            KEY();                     //按鍵程序
        Lcd12864_DispTime(); //這里調(diào)用顯示時(shí)間程序                          
    }
}
void Timer0Init(void)                //10毫秒@11.0592MHz
{
        TMOD=0x01;//設(shè)定定時(shí)器工作方式1,定時(shí)器定時(shí)50毫秒
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;//開(kāi)總中斷
        ET0=1;//允許定時(shí)器0中斷
        TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
}
/**************定時(shí)器0 中斷函數(shù)******************/

void timer0() interrupt 1
{
        TH0=(65536-50000)/256;                                  //1次中斷50毫秒
        TL0=(65536-50000)%256;
        shan_count++;                 //時(shí)鐘:號(hào)閃爍計(jì)數(shù)
        shan_js++;                   //校時(shí)閃爍計(jì)數(shù)
        if(shan_count == 20)        //:號(hào)閃爍,亮0.5秒,滅0.5秒;閃爍頻率可調(diào)。
        {
                shan_count = 0;
                b1++;                         //10秒延時(shí)b1自加
        }
        if(b1>10)                  //10秒延時(shí)
        {
                b1=0;                 //10秒延時(shí)b1清零
                disflag=0;                //設(shè)置標(biāo)志位清零
        }                        
        if(shan_js == 10)  //250ms閃爍一次
        {
                shan_js = 0;
                flag = !flag;         //250毫秒標(biāo)志位
        }
}
回復(fù)

使用道具 舉報(bào)

20#
ID:46220 發(fā)表于 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數(shù)據(jù)傳送位SDA
sbit DS3231_SDA=P3^7;        //   模擬I2C時(shí)鐘控制位SCL
bit        ack;                //應(yīng)答標(biāo)志位
/********************************************************************************************************
**         DS3231常數(shù)定義
********************************************************************************************************/
#define DS3231_WriteAddress 0xD0    //器件寫(xiě)地址
#define DS3231_ReadAddress  0xD1    //器件讀地址
#define DS3231_SECOND       0x00    //秒
#define DS3231_MINUTE       0x01    //分
#define DS3231_HOUR         0x02    //時(shí)
#define DS3231_WEEK         0x03    //星期
#define DS3231_DAY          0x04    //日
#define DS3231_MONTH        0x05    //月
#define DS3231_YEAR         0x06    //年

#define DS3231_TEMPERATUREH 0x11    //溫度寄存器高字節(jié)(8位)        整數(shù)部分
#define DS3231_TEMPERATUREL 0x12    //溫度寄存器低字節(jié)(低2位) 小數(shù)部分

#define NACK    1
#define ACK     0

char hour,min,sec,year,month,day,date,week;        //定義讀取3231的時(shí)分秒年月日星期變量
char Tem_L,Tem_H;                                                                   //定義讀取3231的溫度高字節(jié)整數(shù)部分和低字節(jié)小數(shù)部分變量
unsigned int TH3231;

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

///***************按鍵端口************///
sbit KEY1=  P1^1;                  //調(diào)整
sbit KEY2=  P1^2;                  //++
sbit KEY3=  P1^3;                  //--
sbit KEY4=  P1^4;                  //退出

unsigned char  a1,a2,a3,a4;         //按鍵消抖用
unsigned char  disflag=0,b1;        //時(shí)間調(diào)整相關(guān)//b1用來(lái)計(jì)數(shù)進(jìn)入設(shè)置到10秒后如果沒(méi)有按鍵按下就返回時(shí)間顯示

void        Delay5US()           //@12.000MHz           延時(shí)5us
{
   _nop_(); //_nop_();        _nop_();_nop_(); //1T單片機(jī)用4個(gè)nop,12T用1個(gè)nop
}
/*1T 12M 延時(shí)函數(shù) Delay_us(1)時(shí)大約1us*/
void Delay_us(uint us)
{
  while(us--)
  {
          _nop_();
          _nop_();
  }
}
/**********************************************
//IIC Start         IIC總線產(chǎn)生起始信號(hào)函數(shù)
**********************************************/
void IIC_Start()
{   
   DS3231_SDA = 1;                 //拉高時(shí)鐘線
   Delay_us(1);
   DS3231_SCL = 1;                 //拉高數(shù)據(jù)線
   Delay_us(5);  //起始條件建立時(shí)間大于4.7us,延時(shí)
   DS3231_SDA = 0;                 //在時(shí)鐘線為高電平時(shí),拉低數(shù)據(jù)線,產(chǎn)生起始信號(hào)         發(fā)送起始信號(hào)
   Delay_us(1);         
   DS3231_SCL = 0;                 //鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
   Delay_us(1);
}

/*IIC_Stop  IIC總線產(chǎn)生停止信號(hào)函數(shù)*/
void IIC_Stop()
{
        DS3231_SDA = 0; //拉低數(shù)據(jù)線
        Delay_us(1);
  DS3231_SCL = 0; //拉低數(shù)據(jù)線
  Delay_us(5);    //起始條件建立時(shí)間大于4.7us,延時(shí)
  DS3231_SCL = 1; //時(shí)鐘時(shí)線為高電平時(shí),拉高數(shù)據(jù)線,產(chǎn)生停止信號(hào)
        Delay_us(1);
  DS3231_SDA = 1; //時(shí)鐘時(shí)線為高電平時(shí),拉高數(shù)據(jù)線,產(chǎn)生停止信號(hào)
}


unsigned char        BCD2HEX(unsigned char val)                 //BCD轉(zhuǎn)換為Byte
{
        return        ((val>>4)*10)+(val&0x0f);
}

unsigned char        HEX2BCD(unsigned char val)                 //B碼轉(zhuǎn)換為BCD碼
{
        return        (((val%100)/10)<<4)|(val%10);
}

/*******************************************************************
                  字節(jié)數(shù)據(jù)發(fā)送函數(shù)              
函數(shù)原型:     void   SendByte(uchar Dat);
功能:      將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對(duì)
           此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0)
           ack=1        發(fā)送數(shù)據(jù)正常,
           ack=0        被控器無(wú)應(yīng)答或損壞。
********************************************************************/
void SendByte(unsigned char c)
{
    unsigned char BitCnt;
   
    for(BitCnt=0;BitCnt<8;BitCnt++)         //要傳送的數(shù)據(jù)長(zhǎng)度為8位
    {
        if((c<<BitCnt)&0x80)
            DS3231_SDA=1;                          //判斷發(fā)送位
        else
            DS3231_SDA=0;
                Delay_us(1);             
        DS3231_SCL=1;                            //置時(shí)鐘線為高,通知被控器開(kāi)始接收數(shù)據(jù)位
        Delay_us(5);                       //保證時(shí)鐘高電平周期大于4μs   
        DS3231_SCL=0;
    }
    DS3231_SDA=1;                                  //8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位
        Delay_us(1);
    DS3231_SCL=1;
    Delay_us(3);
    if(DS3231_SDA==1)
        ack=0;   
    else
        ack=1;                              //判斷是否接收到應(yīng)答信號(hào)
    DS3231_SCL=0;
    Delay_us(3);
}          
/*用來(lái)接收從器件傳來(lái)的數(shù)據(jù),并判斷總線錯(cuò)誤(不發(fā)應(yīng)答信號(hào)),發(fā)完后請(qǐng)用應(yīng)答函數(shù)應(yīng)答從機(jī)*/
unsigned char RcvByte()
{
   unsigned char retc;
   unsigned char BitCnt;

   retc=0;
   DS3231_SDA=1;                           //置數(shù)據(jù)線為輸入方式
   for(BitCnt=0;BitCnt<8;BitCnt++)
   {
                   Delay_us(1);
        DS3231_SCL=0;                //置時(shí)鐘線為低,準(zhǔn)備接收數(shù)據(jù)位      
        Delay_us(5);                 //時(shí)鐘低電平周期大于4.7μs                       
        DS3231_SCL=1;                //置時(shí)鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效
        Delay_us(3);
        retc=retc<<1;
        if(DS3231_SDA==1)
            retc=retc+1;            //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中
        Delay_us(2);
   }
   DS3231_SCL=0;
   Delay_us(1);
   return(retc);
}                            
/*主控器進(jìn)行應(yīng)答信號(hào)(可以是應(yīng)答或非應(yīng)答信號(hào),由位參數(shù)a決定)*/
void Ack_I2C(bit a)
{
        if(a==0)DS3231_SDA=0;   //在此發(fā)出應(yīng)答或非應(yīng)答信號(hào)
    else(DS3231_SDA=1);  
    Delay_us(3);
    DS3231_SCL=1;                     
    Delay_us(5);            //時(shí)鐘低電平周期大于4us   
    DS3231_SCL=0;           //清時(shí)鐘線,鉗住I2C總線以便繼續(xù)接收
    Delay_us(2);   
}                                            

unsigned char write_byte(unsigned char addr, unsigned char write_data)                  //DS3231寫(xiě)一字節(jié)數(shù)據(jù)
{
    IIC_Start();
    SendByte(DS3231_WriteAddress);                  //器件寫(xiě)地址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讀一字節(jié)數(shù)據(jù)
{
    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讀時(shí)鐘數(shù)據(jù)
{
    unsigned char Tmp;
        IIC_Start();
    SendByte(DS3231_WriteAddress);                                        //器件寫(xiě)地址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));//都轉(zhuǎn)10進(jìn)制輸出  //BCD轉(zhuǎn)換為Byte
}

///**********************************讀溫度函數(shù)***********************************///
unsigned char read_random1(unsigned char random_addr)  //這個(gè)是讀溫度函數(shù)
{
    unsigned char Tmp;
        write_byte(0x0e,0x20);//0x0e寄存器的CONV位置1開(kāi)啟溫度轉(zhuǎn)換,要這句,溫度實(shí)時(shí)刷新,這句不要,溫度要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時(shí)間調(diào)整和讀出各項(xiàng)數(shù)據(jù)***************************************************////
void ModifyTime(unsigned char address,unsigned char num)                  //DS3231寫(xiě)時(shí)鐘數(shù)據(jù)
{
    unsigned char temp=0;
           if(address>6 && address <0) return;
    temp=HEX2BCD(num);
        write_byte(address,temp);
}
void read3231()                                           //讀出DS3231的各個(gè)數(shù)據(jù)
{
         year = read_random(DS3231_YEAR);                  //讀出年數(shù)據(jù)
         month = read_random(DS3231_MONTH);                  //讀出月數(shù)據(jù)
         day = read_random(DS3231_DAY);                           //讀出日數(shù)據(jù)
         week = read_random(DS3231_WEEK);                   //讀出星期數(shù)據(jù)
         hour = read_random(DS3231_HOUR);                   //讀出小時(shí)數(shù)據(jù)
         min = read_random(DS3231_MINUTE) ;           //讀出分鐘數(shù)據(jù)
         sec = read_random(DS3231_SECOND);           //讀出秒數(shù)據(jù)
         
        Tem_H=read_random1(DS3231_TEMPERATUREH);                     //讀出溫度 高字節(jié) 整數(shù)部分
        Tem_L=((read_random1(DS3231_TEMPERATUREL))>>6)*0.25*100;         //讀出溫度 低字節(jié) 小數(shù)部分
/*       
        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)            //年月日時(shí)分秒限定調(diào)整范圍并寫(xiě)入時(shí)鐘數(shù)據(jù)
{
    unsigned char address;
        char item;
    unsigned char max,min;   
    if(sel==1)  {address=DS3231_HOUR; max=23;min=0;}    //小時(shí)
        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;}    //星期 星期根據(jù)年月日數(shù)據(jù)求出,這里屏蔽掉

           item= read_random(address);                                //DS3231讀時(shí)鐘數(shù)據(jù)
    if (selby==0) item++;  else item--;
    if(item>max) item=min;   
    if(item<min) item=max;
           
    ModifyTime(address, item);                                 //DS3231寫(xiě)時(shí)間數(shù)據(jù)
}         

void KEY()                                          //按鍵程序
{
        if(a1==0)
   {
                if(KEY1==0)
                {
                        Delay5US();
                        if(KEY1==0)
                        {       
                                b1=0;                        //10秒延時(shí)b1清零,加這句是使每次進(jìn)入設(shè)置時(shí)a1計(jì)數(shù)都能從0秒開(kāi)始計(jì)數(shù)延時(shí),極端情況剛進(jìn)設(shè)置就退出來(lái)了,因?yàn)閍1始終都在循環(huán)累加
                                disflag++;
                                if(disflag>=7 || KEY4==0)                   //如果需要手動(dòng)調(diào)星期就disflag>=8
                                {
                                        disflag=0;                       
                                }
                            a1=1;               
                        }
                }
   }
   if(KEY1==1)
   {
                   a1=0;
   }

  if(a2==0)
        {
                if(KEY2==0)
                {
                        Delay5US();
                        if(KEY2==0)
                        {       
                                b1=0;                        //10秒延時(shí)b1清零       
                                Set(disflag,0);
                            a2=1;
                        }
                }
        }
   if(KEY2==1)
   {
           a2=0;
   }
   if(a3==0)
   {
                if(KEY3==0)
                {
                        Delay5US();
                        if(KEY3==0)
                        {       
                                b1=0;                        //10秒延時(shí)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秒延時(shí)b1清零
                                disflag=0;
                        }
                    a4=1;
                }
   }
   if(KEY4==1)
   {
                   a4=0;
   }
}



#endif
回復(fù)

使用道具 舉報(bào)

21#
ID:46220 發(fā)表于 2023-6-2 15:32 | 只看該作者
#ifndef __nongli_H
#define __nongli_H
#include<reg51.h>        //51系列單片機(jī)頭文件
#include<intrins.h>

/*********************************************************************************
C51寫(xiě)的公歷轉(zhuǎn)農(nóng)歷和星期
**********************************************************************************
公歷是全世界通用的歷法以地球繞太陽(yáng)的一周為一年一年365 天分為12 個(gè)月1 3 5 7 8 10 12 月為
31 天2 月為28 天其余月份為30 天事實(shí)上地球繞太陽(yáng)一周共365 天5 小時(shí)48 分46 秒比公歷一年多出5 小時(shí)48
分46 秒為使年誤差不累積公歷年用閏年法來(lái)消除年誤差 由于每年多出5 小時(shí)48 分46 秒每4 年累計(jì)多出23
小時(shí)15 分4 秒接近1 天天文學(xué)家就規(guī)定每4 年有一個(gè)閏年把2 月由28 天改為29 天凡是公歷年代能被4 整除
的那一年就是閏年但是這樣一來(lái)每4 年又少了44 分56 秒為了更準(zhǔn)確地計(jì)時(shí)天文學(xué)家又規(guī)定凡能被100 整除
的年份只有能被400 整除才是閏年即每400 年要減掉3 個(gè)閏年經(jīng)過(guò)這樣處理后實(shí)際上每400 年的誤差只有2 小時(shí)
53 分20 秒已相當(dāng)準(zhǔn)確了
農(nóng)歷與公歷不同農(nóng)歷把月亮繞地球一周作為一月因?yàn)樵铝晾@地球一周不是一整天所以農(nóng)歷把月分為大月和小
月大月30 天小月29 天通過(guò)設(shè)置大小月使農(nóng)歷日始終與月亮與地球的位置相對(duì)應(yīng)為了使農(nóng)歷的年份與公歷年
相對(duì)應(yīng)農(nóng)歷通過(guò)設(shè)置閏月的辦法使它的平均年長(zhǎng)度與公歷年相等農(nóng)歷是中國(guó)傳統(tǒng)文化的代表之一并與農(nóng)業(yè)生產(chǎn)聯(lián)
系密切中國(guó)人民特別是廣大農(nóng)民十分熟悉并喜愛(ài)農(nóng)歷
公歷與農(nóng)歷是我國(guó)目前并存的兩種歷法各有其固有的規(guī)律農(nóng)歷與月球的運(yùn)行相對(duì)應(yīng)其影響因素多它的大小
月和閏月與天體運(yùn)行有關(guān)計(jì)算十分復(fù)雜且每年都不一致因此要用單片機(jī)實(shí)現(xiàn)公歷與農(nóng)歷的轉(zhuǎn)換用查表法是最方
便實(shí)用的辦法
51 系列單片機(jī)因其在功能上能滿足大部份對(duì)速度要求不高的應(yīng)用場(chǎng)合的要求且價(jià)格低廉開(kāi)發(fā)工具普及程度高
是目前應(yīng)用最多的單片機(jī)之一本文介紹一種用51 單片機(jī)實(shí)現(xiàn)從1901 年到2099 年2199 年公歷日到農(nóng)歷日及星期
的轉(zhuǎn)換方法并向讀者提供完整的51C程序
二 基本原理
實(shí)現(xiàn)公歷與農(nóng)歷的轉(zhuǎn)換一般采用查表法按日查表是速度最快的方法但51 單片機(jī)尋址能力有限不可能采用
按日查表的方法除按日查外我們可以通過(guò)按月查表和按年查表的方法再通過(guò)適當(dāng)?shù)挠?jì)算來(lái)確定公歷日所對(duì)應(yīng)的
農(nóng)歷日期本文采用的是按年查表法最大限度地減少表格所占的程序空間
對(duì)于農(nóng)歷月來(lái)說(shuō)大月為30 天小月為29 天這是固定不變的這樣我們就可用1 個(gè)BIT 位來(lái)表示大小月信
息農(nóng)歷一年如有閏月為13 個(gè)月否則是12 個(gè)月所以一年需要用13 個(gè)BIT 閏月在農(nóng)歷年中所在的月份并不固定
大部分閏月分布在農(nóng)歷2 8 月但也有少量年份在9 月以后所以要表示閏月的信息至少要4BIT 在這里我們用4BIT
的值來(lái)表示閏月的月份值為0 表示本年沒(méi)有閏月有了以上信息還不足以判斷公歷日對(duì)應(yīng)的農(nóng)歷日因?yàn)檫€需要一
個(gè)參照日我們選用農(nóng)歷正月初一所對(duì)應(yīng)的公歷日期作參照日公歷日最大為31 日需要5BIT 來(lái)表示而春節(jié)所在的
月份不是1 月就是2 月用1BIT 就夠了考慮到表達(dá)方便我們用2BIT 來(lái)表示春節(jié)月2BIT 的值直接表示月份這
樣一年的農(nóng)歷信息只用3 個(gè)字節(jié)就全部包括了
計(jì)算公歷日對(duì)應(yīng)的農(nóng)歷日期的方法先計(jì)算出公歷日離當(dāng)年元旦的天數(shù)然后查表取得當(dāng)年的春節(jié)日期計(jì)算出春
節(jié)離元旦的天數(shù)二者相減即可算出公歷日離春節(jié)的天數(shù)以后只要根據(jù)大小月和閏月信息減一月天數(shù)調(diào)整一月農(nóng)
歷月份即可推算出公歷日所對(duì)應(yīng)的農(nóng)歷日期如公歷日不到春節(jié)日期農(nóng)歷年要比公歷年小一年農(nóng)歷大小月取前一
年的信息農(nóng)歷月從12 月向前推算
公歷日是非常有規(guī)律的所以公歷日所對(duì)應(yīng)的星期天可以通過(guò)計(jì)算直接得到理論上公元0 年1 月1 日為星期日
只要求得公歷日離公元0 年1 月1 日的日子數(shù)除7 后的余數(shù)就是星期天為了簡(jiǎn)化計(jì)算采用月校正法根據(jù)公歷的
年月日可直接計(jì)算出星期天其算法是日期年份所過(guò)閏年數(shù)月校正數(shù)之和除7 的余數(shù)就是星期天但如果是在
閏年又不到3 月份上述之和要減一天再除7 其1 12 月的校正數(shù)據(jù)為6 2 2 5 0 3 5 1 4 6 2 4 在
本程序中采用1 個(gè)字節(jié)表示年份閏年數(shù)也只計(jì)算1900 年以后的閏年數(shù)所以實(shí)際校正數(shù)據(jù)也和上述數(shù)據(jù)不同

公歷年對(duì)應(yīng)的農(nóng)歷數(shù)據(jù),每年三字節(jié),
格式第一字節(jié)BIT7-4 位表示閏月月份,值為0 為無(wú)閏月,BIT3-0 對(duì)應(yīng)農(nóng)歷第1-4 月的大小
第二字節(jié)BIT7-0 對(duì)應(yīng)農(nóng)歷第5-12 月大小,第三字節(jié)BIT7 表示農(nóng)歷第13 個(gè)月大小
月份對(duì)應(yīng)的位為1 表示本農(nóng)歷月大(30 天),為0 表示小(29 天)
第三字節(jié)BIT6-5 表示春節(jié)的公歷月份,BIT4-0 表示春節(jié)的公歷日期
*************************************************************************************************/
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};//月份數(shù)據(jù)表
code unsigned int  day_code2[3]={0x111,0x130,0x14e};

bit c_moon;
data unsigned char year_moon,month_moon,day_moon;
/***************************************************************************************
* 函數(shù)名稱    :get_moon_day
* 功能描述    :用于讀取數(shù)據(jù)表中農(nóng)歷月的大月或小月,如果該月為大返回1,為小返回0
* 參數(shù)        :  
***************************************************************************************/
bit get_moon_day(unsigned char month_p,unsigned int table_addr)        //讀取數(shù)據(jù)表中農(nóng)歷月的大月或小月,如果該月為大返回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;
  }
}
/*************************************************************************************
* 函數(shù)名稱    :Conversion
* 功能描述    :輸入陽(yáng)歷數(shù)據(jù),輸出陰歷數(shù)據(jù)(只允許1901-2099年)
* 參數(shù)        :參數(shù)名稱
****************************************************************************************/
void Conversion(bit c,char year,char month,char day)         //輸入陽(yáng)歷數(shù)據(jù),輸出陰歷數(shù)據(jù)(只允許1901-2099年)
{
//c=0 為21世紀(jì),c=1 為19世紀(jì) 輸入輸出數(shù)據(jù)均為BCD數(shù)據(jù)           //輸入輸出都是10進(jìn)制參數(shù)
  unsigned char temp1,temp2,temp3,month_p;
  unsigned int temp4,table_addr;
  bit flag2,flag_y;
  //定位數(shù)據(jù)表地址
  if(c==0) { table_addr=(year+0x64-1)*0x3; }
  else   { table_addr=(year-1)*0x3; }
  //定位數(shù)據(jù)表地址完成
  //取當(dāng)年春節(jié)所在的公歷月份
  temp1=year_code[table_addr+2]&0x60;
  temp1=_cror_(temp1,5);
  //取當(dāng)年春節(jié)所在的公歷月份完成
  //取當(dāng)年春節(jié)所在的公歷日
  temp2=year_code[table_addr+2]&0x1f;
  //取當(dāng)年春節(jié)所在的公歷日完成
  // 計(jì)算當(dāng)年春年離當(dāng)年元旦的天數(shù),春節(jié)只會(huì)在公歷1月或2月
  if(temp1==0x1) { temp3=temp2-1; }  
  else  { temp3=temp2+0x1f-1; }
  // 計(jì)算當(dāng)年春年離當(dāng)年元旦的天數(shù)完成

  //計(jì)算公歷日離當(dāng)年元旦的天數(shù),為了減少運(yùn)算,用了兩個(gè)表
  //day_code1[9],day_code2[3]
  //如果公歷月在九月或前,天數(shù)會(huì)少于0xff,用表day_code1[9],
  //在九月后,天數(shù)大于0xff,用表day_code2[3]
  //如輸入公歷日為8月10日,則公歷日離元旦天數(shù)為day_code1[8-1]+10-1
  //如輸入公歷日為11月10日,則公歷日離元旦天數(shù)為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月為閏月,天數(shù)加1
  //計(jì)算公歷日離當(dāng)年元旦的天數(shù)完成

  //判斷公歷日在春節(jié)前還是春節(jié)后
  if (temp4>=temp3)
  { //公歷日在春節(jié)后或就是春節(jié)當(dāng)日使用下面代碼進(jìn)行運(yùn)算
    temp4-=temp3;
    month=0x1;
    month_p=0x1;  //month_p為月份指向,公歷日在春節(jié)前或就是春節(jié)當(dāng)日month_p指向首月
    flag2=get_moon_day(month_p,table_addr); //檢查該農(nóng)歷月為大小還是小月,大月返回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);  //從數(shù)據(jù)表中取該年的閏月月份,如為0則該年無(wú)閏月
    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
  {  //公歷日在春節(jié)前使用下面代碼進(jìn)行運(yùn)算
    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為月份指向,如果當(dāng)年有閏月,一年有十三個(gè)月,月指向13,無(wú)閏月指向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碼。但根據(jù)我后面的程序,我不需要。
//后面用來(lái)顯示的農(nóng)歷信息的程序分別是disp_t3()和disp_t4()
  year_moon=year;
  month_moon=month;
  day_moon=day;
}
/******************************************************************************************
* 函數(shù)名稱    :Conver_week
* 功能描述    :輸入BCD陽(yáng)歷數(shù)據(jù),輸出BCD星期數(shù)據(jù)(只允許1901-2099年)
* 參數(shù)        :  參數(shù)名稱:        輸入/輸出?        類(lèi)型                描述
* 算法:日期+年份+所過(guò)閏年數(shù)+月較正數(shù)之和除7 的余數(shù)就是星期,但如果是在
  閏年又不到3 月份上述之和要減一天再除7星期數(shù)。余數(shù)為0時(shí),為星期天。
******************************************************************************************/
bit century;   //世紀(jì)位標(biāo)志,0為20世紀(jì),1為19世紀(jì)
code unsigned char table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正數(shù)據(jù)表
void Conver_week()         //輸入BCD陽(yáng)歷數(shù)據(jù),輸出BCD星期數(shù)據(jù)(只允許1901-2099年)
{//century=0 為21世紀(jì),c=1 為19世紀(jì) 輸入輸出數(shù)據(jù)均為BCD數(shù)據(jù)
  unsigned char temp1,temp2;
  temp1=year;
  if (century==0){temp1=temp1+100;}  //如果為21世紀(jì),年份數(shù)加100
  temp2=temp1/4;                     //所過(guò)閏年數(shù)只算1900年之后的
  temp2=temp1+temp2;
  temp2=temp2%7;                     //為節(jié)省資源,先進(jìn)行一次取余,避免數(shù)大于255
  temp2=temp2+day+table_week[month-1];
  if (year%0x4==0&&month<3)temp2-=1;
  week=temp2%7;
}
     
#endif
回復(fù)

使用道具 舉報(bào)

22#
ID:46220 發(fā)表于 2023-6-2 15:32 | 只看該作者
#ifndef __ziku_H
#define __ziku_H
#include<reg51.h>        //51系列單片機(jī)頭文件
#include<intrins.h>

unsigned char code hz[]=/*--  楷體_GB231212;  此字體下對(duì)應(yīng)的點(diǎn)陣為:寬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 , 宋體 )共陰/列行式/點(diǎn)陣16*索引16/逆向/16進(jìn)制/像素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,//"調(diào)",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,//"時(shí)",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,//"!"溫度圖標(biāo),40
};

//-----------數(shù)字16*32----------------------
unsigned char code dazi[]=  /*pyhzbj取模方式:縱向取模,字節(jié)倒序*/
{   
  //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,

  //雙方型冒號(hào) 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;  此字體下對(duì)應(yīng)的點(diǎn)陣為:寬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
回復(fù)

使用道具 舉報(bào)

23#
ID:46220 發(fā)表于 2023-6-2 15:32 | 只看該作者
#ifndef __18B20_H
#define __18B20_H
#include<reg51.h>        //51系列單片機(jī)頭文件
#include<intrins.h>

sbit DQ=P2^1;        //溫度探測(cè)口
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;  //溫度正負(fù)標(biāo)志
const unsigned char tabl3[]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};

//******************DS18B20溫度測(cè)試部分*****************
//50微秒延時(shí)基準(zhǔn)程序
void delay_50us(unsigned int t)
{
  unsigned char j;
  for(;t>0;t--)
  {
    for(j=19;j>0;j--);
  }
}
//8微秒延時(shí)基準(zhǔn)程序
void delay_8us(unsigned int t)
{
while(--t);
}
//3微秒延時(shí)程序
void delay_3us()
{
  ;
  ;
}
void DS18B20_Init(void)                // 函數(shù)功能:DS18B20初始化
{
     rest:delay_3us(); //稍做延時(shí)
     delay_3us();
     DQ=1;
     delay_3us();
     DQ=0;// DQ_L; //單片機(jī)將dq_ds18b20總線拉低
     delay_8us(75);//480us<T<960us//此延時(shí)必須精確,600US大于480US(12MHZ)過(guò)小不能仿真,過(guò)大實(shí)物不顯示
     DQ=1;//拉高總線  釋放總線
     delay_8us(8);                   //此延時(shí)不需要精確
     if(DQ==1)          
     {  
       return;
     }  
     delay_8us(11); //延時(shí)90us
     if(DQ==1)
     {
       return;
     }  
      else
      {
       goto rest;
      }
}
//***函數(shù)名稱:void Ds18b20WriteOneByte(unsigned char dat)
//***函數(shù)功能:讀一個(gè)字節(jié)
unsigned char Ds18b20ReadOneByte(void)           //子程序功能:從DS18B20讀一個(gè)字節(jié)
{
     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); //延時(shí)40us
      }
     return(byte);
}
//***函數(shù)名稱:void Ds18b20WriteOneByte(unsigned char dat)
//***函數(shù)功能:寫(xiě)一個(gè)字節(jié)
void Ds18b20WriteOneByte(unsigned char dat)                        //子程序功能:向DS18B20寫(xiě)一字節(jié)的數(shù)據(jù)
{
     unsigned char i=0;      
     for(i=0;i<8;i++)
     {       
          DQ=0;//拉低總線
          delay_3us();//至少維持1US,表示寫(xiě)時(shí)序(包括寫(xiě)0時(shí)序或?qū)?時(shí)序)開(kāi)始
          if (dat & 0x01) DQ=1; //DQ = 1
          delay_50us(1); //延時(shí)50us 以上
          dat>>=1;
          DQ=1; ///寫(xiě)完后必須釋放總線
     }
    delay_50us(1);
}
//***函數(shù)名稱:void GetTemp(void)
//***函數(shù)功能:讀取溫度函數(shù)
void GetTemp(void)      //讀取溫度函數(shù)
{
        unsigned char temp;                 //定義溫度變量
        DS18B20_Init();                        //復(fù)位
        Ds18b20WriteOneByte(0xcc);  //跳過(guò)讀序列號(hào)的操作
        Ds18b20WriteOneByte(0x44);  //開(kāi)啟溫度轉(zhuǎn)換
        delay_8us(2);                        //延時(shí)
        DS18B20_Init();                            //復(fù)位
        Ds18b20WriteOneByte(0xcc);  //跳過(guò)讀序列號(hào)的操作
        Ds18b20WriteOneByte(0xbe);  //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
        a=Ds18b20ReadOneByte();     //讀取高速暫存字節(jié)0,溫度低8位
        b=Ds18b20ReadOneByte();     //讀取高速暫存字節(jié)1,溫度高8位

        if((b&0xf8))//判斷溫度的正負(fù)性把讀取到的溫度值高8位跟11111000做與運(yùn)算判斷溫度正負(fù),若高5位全部為1即為負(fù)否則為正
    {
        temp_flag=0;     //給出溫度為負(fù)的標(biāo)志
                f_x=tabl3[a & 0x0f]; //計(jì)算溫度的小數(shù)
                temp=b<<4;
                temp+=(a&0xf0)>>4;
                temp=~temp+1;
                f_b=temp/100%10;   //計(jì)算溫度的百位數(shù)據(jù)
        f_s=temp/10%10;    //計(jì)算溫度的十位數(shù)據(jù)
        f_g=temp%10;      //計(jì)算溫度的個(gè)位數(shù)據(jù)
    }
    else                 //溫度為正數(shù)
    {
        t_x=tabl3[a & 0x0f]; //計(jì)算溫度的小數(shù)
        temp=b & 0x0f;
        temp<<=4;
        a>>=4;
        temp=temp| a;
        t_b=(temp)/100%10;  //計(jì)算溫度的百位數(shù)據(jù)           -2是18B20個(gè)體補(bǔ)償
        t_s=(temp)/10%10;   //計(jì)算溫度的十位數(shù)據(jù)
        t_g=(temp)%10;      //計(jì)算溫度的個(gè)位數(shù)據(jù)
        temp_flag=1;          //給出溫度為正數(shù)的標(biāo)志
    }
}

#endif
回復(fù)

使用道具 舉報(bào)

24#
ID:46220 發(fā)表于 2023-6-2 15:38 | 只看該作者
按我的引腳連接后就是這樣正常顯示的,所有功能都正常

51hei圖片_20230602153623.jpg (107.71 KB, 下載次數(shù): 124)

51hei圖片_20230602153623.jpg
回復(fù)

使用道具 舉報(bào)

25#
ID:46220 發(fā)表于 2023-6-2 16:09 | 只看該作者
有一些注釋是我按自己的理解加進(jìn)去的,不一定正確,看看就好,還有我這里用的是3231時(shí)鐘模塊,也有用1302的,區(qū)別就在包含的頭文件不一樣,我看你還打了版,我就是直接連線,字庫(kù)也改了一些,能力有限,估計(jì)還有一些不合理的地方自己都沒(méi)發(fā)現(xiàn)
回復(fù)

使用道具 舉報(bào)

26#
ID:529213 發(fā)表于 2023-6-2 17:40 來(lái)自手機(jī) | 只看該作者
niehaitao 發(fā)表于 2023-6-2 16:09
有一些注釋是我按自己的理解加進(jìn)去的,不一定正確,看看就好,還有我這里用的是3231時(shí)鐘模塊,也有用1302的 ...

非常感謝大佬,太感謝了,既然您的運(yùn)行正常,那肯定是我連錯(cuò)線了,我用您的程序再試試,再次感謝您
回復(fù)

使用道具 舉報(bào)

27#
ID:1081788 發(fā)表于 2023-6-3 15:18 | 只看該作者
很棒我覺(jué)得非常的好
回復(fù)

使用道具 舉報(bào)

28#
ID:1042173 發(fā)表于 2023-6-14 22:51 | 只看該作者
怎我用Kill5編譯不過(guò)去呀?
回復(fù)

使用道具 舉報(bào)

29#
ID:1083996 發(fā)表于 2023-6-15 08:10 | 只看該作者
niehaitao 發(fā)表于 2023-6-2 16:09
有一些注釋是我按自己的理解加進(jìn)去的,不一定正確,看看就好,還有我這里用的是3231時(shí)鐘模塊,也有用1302的 ...

會(huì)不會(huì)用個(gè)外置更好的晶振,能讓時(shí)間更準(zhǔn)確一些呢?
回復(fù)

使用道具 舉報(bào)

30#
ID:877406 發(fā)表于 2023-10-13 17:53 | 只看該作者
量子工業(yè) 發(fā)表于 2023-6-15 08:10
會(huì)不會(huì)用個(gè)外置更好的晶振,能讓時(shí)間更準(zhǔn)確一些呢?

用DS3231時(shí)間更準(zhǔn)確
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表