久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7743|回復: 29
收起左側

單片機大數字萬年歷電子鐘制作 帶農歷年屬性溫度 代碼注釋和仿真圖PCB

  [復制鏈接]
ID:877406 發表于 2022-9-16 11:28 | 顯示全部樓層 |閱讀模式
這是我制作的LCD12864大數字萬年歷電子鐘設計,用了一個多星期時間,經過實物實測,每月時間相差幾分鐘,這是時鐘走時芯片決定的,溫度顯示還算正常。
附件里面包含單片機的源碼,仿真圖,PCB原檔。請大家多多指教。

制作出來的實物圖如下:
51hei圖片_20220916112349.jpg
51hei圖片_20220916112420.jpg

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

protel99畫的PCB圖如下:(51hei附件中可下載工程文件)
51hei圖片_20220916112539.jpg

單片機源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. //#include <stdio.h>
  4. #include<string.h>
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. /******LCD12864通訊端口******/
  8. sbit RS_LCD12864=P2^7;     //定義選擇顯示類型, 定義數據或指令,1=數據,0=指令
  9. sbit RW_LCD12864=P2^6;    //定義讀寫信號控制端, 定義讀或寫??1=讀,??0=寫
  10. sbit EN_LCD12864=P2^5;    //定義數據鎖存信號, 定義使能操作, 1=能,??0=否
  11. #define LCD12864_Databus P0   //定義數據端
  12. #define sc0 0        
  13. #define sc1 1         
  14. uchar DS1302_flag;        //定義DS1302RAM中是否寫數的標志位,第一次開機初始化后RAM中寫1
  15. sbit CS1=P2^4;    //定義選擇芯片右半屏信號
  16. sbit CS2=P2^3;    //定義選擇芯片左半屏信號
  17. /*******DS1302時鐘端口******/
  18. sbit SCLK=P2^0;     //DS1302時鐘口
  19. sbit DATA=P2^1;    //DS1302串口數據
  20. sbit RST=P2^2;    //DS1302的復位口
  21. uchar code Write_RTC_ADDR[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
  22. uchar code READ_RTC_ADDR[7] ={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
  23. uchar TIME[7]={0, 0x38, 0x15, 0x25, 0x05, 0x03, 0x22};
  24. //2022年5月25星期3,15:38:00
  25. /***********DS18B20**********/
  26. sbit DQ=P3^7;        //溫度探測口
  27. uchar fb;            //文字反白標示
  28. uint tempvalue;     //溫度值,此變量若為uchar則溫度不正常
  29. uchar Temp_Flag;  //溫度正負標志

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

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

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

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

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

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

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

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

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

  84.   //計算公歷日離當年元旦的天數,為了減少運算,用了兩個表
  85.   //day_code1[9],day_code2[3]
  86.   //如果公歷月在九月或前,天數會少于0xff,用表day_code1[9],
  87.   //在九月后,天數大于0xff,用表day_code2[3]
  88.   //如輸入公歷日為8月10日,則公歷日離元旦天數為day_code1[8-1]+10-1
  89.   //如輸入公歷日為11月10日,則公歷日離元旦天數為day_code2[11-10]+10-1
  90.   if (month<10){ temp4=day_code1[month-1]+day-1; }
  91.   else         { temp4=day_code2[month-10]+day-1;}
  92.   if ((month>0x2)&&(year%0x4==0)&&(year!=0))
  93.   temp4+=1; //如果公歷月大于2月并且該年的2月為閏月,天數加1
  94.   //計算公歷日離當年元旦的天數完成

  95.   //判斷公歷日在節日前還是節日后
  96.   if (temp4>=temp3)
  97.   { //公歷日在節日后或就是節日當日使用下面代碼進行運算
  98.     temp4-=temp3;
  99.     month=0x1;
  100.     month_p=0x1;  //month_p為月份指向,公歷日在節日前或就是節日當日month_p指向首月
  101.     flag2=get_moon_day(month_p,table_addr); //檢查該農歷月為大小還是小月,大月返回1,小月返回0
  102.     flag_y=0;
  103.     if(flag2==0)temp1=0x1d; //小月29天
  104.     else temp1=0x1e;     //大小30天
  105.     temp2=year_code[table_addr]&0xf0;
  106.     temp2=_cror_(temp2,4);  //從數據表中取該年的閏月月份,如為0則該年無閏月
  107.     while(temp4>=temp1)
  108.     {
  109.       temp4-=temp1;
  110.       month_p+=1;
  111.       if(month==temp2)
  112.           {
  113.         flag_y=~flag_y;
  114.         if(flag_y==0)month+=1;
  115.       }
  116.       else month+=1;flag2=get_moon_day(month_p,table_addr);
  117.       if(flag2==0)temp1=0x1d;
  118.       else temp1=0x1e;
  119.     }
  120.     day=temp4+1;
  121.   }
  122.   else
  123.   {  //公歷日在節日前使用下面代碼進行運算
  124.     temp3-=temp4;
  125.     if (year==0x0){year=0x63;c=1;}
  126.     else year-=1;
  127.     table_addr-=0x3;
  128.     month=0xc;
  129.     temp2=year_code[table_addr]&0xf0;
  130.     temp2=_cror_(temp2,4);
  131.     if (temp2==0)month_p=0xc;
  132.     else month_p=0xd;
  133.         //month_p為月份指向,如果當年有閏月,一年有十三個月,月指向13,無閏月指向12

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

  159. /******************************************************************************************
  160. * 函數名稱    :Conver_week
  161. * 功能描述    :輸入BCD陽歷數據,輸出BCD星期數據(只允許1901-2099年)
  162. * 參數        :  參數名稱:        輸入/輸出?        類型                描述
  163. * 算法:日期+年份+所過閏年數+月較正數之和除7 的余數就是星期,但如果是在
  164.   閏年又不到3 月份上述之和要減一天再除7星期數。余數為0時,為星期天。
  165. ******************************************************************************************/
  166. void Conver_week()
  167. {//century=0 為21世紀,c=1 為19世紀 輸入輸出數據均為BCD數據
  168.   uchar temp1,temp2;
  169.   temp1=year;
  170.   if (century==0){temp1=temp1+100;}  //如果為21世紀,年份數加100
  171.   temp2=temp1/4;                     //所過閏年數只算1900年之后的
  172.   temp2=temp1+temp2;
  173.   temp2=temp2%7;                     //為節省資源,先進行一次取余,避免數大于255
  174.   temp2=temp2+day+table_week[month-1];
  175.   if (year%0x4==0&&month<3)temp2-=1;
  176.   week=temp2%7;
  177. }


  178. /********************************LCD12864部分*****************************/
  179. /******************************************************************************
  180. 端口說明:EN_LCD12864:使能端鎖存信號。RS_LCD12864:D/I 命令/數據寄存器選擇端
  181.           RW_LCD12864:讀寫信號控制端. define LCD_Data P0
  182.           RS(D/I)=1,表示DB0-DB7顯示數據; RS(D/I)=0,表示DB0-DB7顯示指令數據
  183.           RW=1,E=1,數據被讀到DB7-DB0;RW=0,E=1--0,數據被讀到DB7-DB0;數據被
  184. 寫到IR或DR。
  185. (定義數據端口為 LCD_Data為P0口)
  186.           RST_LCD12864復位端口,不接或接高電平,低電平會導致復位
  187. 函數名稱:void Lcd12864_BusyChk()
  188. 函數功能:忙檢測,若忙則等待,最長等待時間為60MS(此判忙函數經過仿真已OK)
  189. 入口參數:無
  190. 出口參數:無
  191. ***********************************************************************/
  192. void Lcd12864_BusyChk()
  193. {
  194.       LCD12864_Databus=0x00;
  195. EN_LCD12864=0;
  196. RS_LCD12864=0;
  197. RW_LCD12864=1;
  198. EN_LCD12864=1;
  199.       while(LCD12864_Databus&0x80);  //判斷P0.7口
  200. _nop_();
  201. EN_LCD12864=0;
  202. }

  203. /**********************************************************************
  204. * 函數名稱:  void set_xy(unsigned char x,unsigned char y)
  205.                (仿真時的函數,已OK)
  206. * 功能描述:  設置顯示位置! X,Y分別代表橫縱坐標!
  207. * 輸入參數?: unsigned char x,unsigned char y
  208. *輸出參數:  無??
  209. *參數名稱:? ?//列地址賦值,?x取值0----64,頁面地址賦值,y取值0----8
  210. ***********************************************************************/

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

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





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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:1047454 發表于 2022-11-22 22:58 | 顯示全部樓層
這么好的東東怎么沒人頂呀,我正想學習呢,請問樓主用的屏帶中文字庫的嗎?看仿真好像不帶喲。謝謝樓主無私奉獻!
回復

使用道具 舉報

ID:92553 發表于 2022-12-4 15:32 | 顯示全部樓層
要是能用在24064屏就好了,因為我手頭就一個24064的屏
回復

使用道具 舉報

ID:81249 發表于 2022-12-4 20:08 | 顯示全部樓層
非常好,還沒有仔細看,非常精煉,我寫的沒帶萬年歷還有近4K字節,要借鑒一下
回復

使用道具 舉報

ID:401598 發表于 2022-12-12 09:26 | 顯示全部樓層
謝謝分享萬年歷。
回復

使用道具 舉報

ID:46220 發表于 2022-12-18 09:30 | 顯示全部樓層
謝謝分享,已經制作成功,稍微作了下改動,原來秒的兩點是顯示1秒滅1秒,加了定時器大約500毫秒亮500毫秒滅,然后把小時的十位在是0的時候不顯示
51hei圖片_20221218092339.jpg
51hei圖片_20221218092349.jpg
51hei圖片_20221218093016.jpg
回復

使用道具 舉報

ID:92553 發表于 2022-12-20 14:23 | 顯示全部樓層
niehaitao 發表于 2022-12-18 09:30
謝謝分享,已經制作成功,稍微作了下改動,原來秒的兩點是顯示1秒滅1秒,加了定時器大約500毫秒亮500毫秒滅 ...

12864帶不帶字庫
回復

使用道具 舉報

ID:46220 發表于 2022-12-20 21:38 來自觸屏版 | 顯示全部樓層
紫氣東來 發表于 2022-12-20 14:23
12864帶不帶字庫

不帶字庫的,程序里面有自建的字庫文件
回復

使用道具 舉報

ID:88256 發表于 2022-12-25 17:25 | 顯示全部樓層
紫氣東來 發表于 2022-12-4 15:32
要是能用在24064屏就好了,因為我手頭就一個24064的屏

你會讓24064顯示就可以自己改顯示部分啊,或者搜索一下,比如這個顯示
回復

使用道具 舉報

ID:877406 發表于 2023-2-7 11:16 | 顯示全部樓層
hchi2006 發表于 2022-11-22 22:58
這么好的東東怎么沒人頂呀,我正想學習呢,請問樓主用的屏帶中文字庫的嗎?看仿真好像不帶喲。謝謝樓主無私 ...

用的不帶字庫屏
回復

使用道具 舉報

ID:894868 發表于 2023-2-10 15:09 | 顯示全部樓層
要對作者支持鼓勵··謝謝分享
回復

使用道具 舉報

ID:824664 發表于 2023-3-12 23:41 | 顯示全部樓層
謝謝分享,制作精良,外觀漂亮。
回復

使用道具 舉報

ID:1062292 發表于 2023-3-17 21:30 | 顯示全部樓層
太厲害了,小白仰慕
回復

使用道具 舉報

ID:707395 發表于 2023-4-17 11:29 | 顯示全部樓層

謝謝分享,制作精良,外觀漂亮。
回復

使用道具 舉報

ID:529213 發表于 2023-5-17 16:59 來自觸屏版 | 顯示全部樓層
請問各位大佬,1302的晶振焊在哪里,能發個電路圖嗎?非常感謝
回復

使用道具 舉報

ID:529213 發表于 2023-6-1 23:27 來自觸屏版 | 顯示全部樓層
按鍵調整減貌似有問題,另外就是調秒鐘時,秒鐘數字亂跳,還有鬧鐘無法調整
IMG_20230601_231400.jpg
回復

使用道具 舉報

ID:529213 發表于 2023-6-2 06:47 來自觸屏版 | 顯示全部樓層
niehaitao 發表于 2022-12-18 09:30
謝謝分享,已經制作成功,稍微作了下改動,原來秒的兩點是顯示1秒滅1秒,加了定時器大約500毫秒亮500毫秒滅 ...

請教大佬,我做出來后,按鍵減少調整不了,并且秒鐘的調整有問題,請問大佬怎么解決的,謝謝。如果解決了,能共享一下程序嗎?感激不盡
回復

使用道具 舉報

ID:46220 發表于 2023-6-2 15:30 | 顯示全部樓層
hnxtlxx 發表于 2023-6-2 06:47
請教大佬,我做出來后,按鍵減少調整不了,并且秒鐘的調整有問題,請問大佬怎么解決的,謝謝。如果解決了 ...

朋友,我是業余玩玩的,這有半年沒弄過了,不記得當時改了那些地方,壓縮上傳我也不會弄,我試試把所有文件貼在這里看行不行
回復

使用道具 舉報

ID:46220 發表于 2023-6-2 15:31 | 顯示全部樓層
#include<reg51.h>                                 //用89C52單片機
#include<intrins.h>
#include<18B20.h>                 //18B20頭文件
#include<DS3231.h>                 //DS1302頭文件
#include<nongli.h>                  //農歷轉換頭文件
#include<ziku.h>                  //字庫頭文件
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
/******LCD12864通訊端口******/
sbit RS_LCD12864=P2^7;     //定義選擇顯示類型, 定義數據或指令,1=數據,0=指令
sbit RW_LCD12864=P2^6;    //定義讀寫信號控制端, 定義讀或寫??1=讀,??0=寫
sbit EN_LCD12864=P2^5;    //定義數據鎖存信號, 定義使能操作, 1=能,??0=否
#define LCD12864_Databus P0   //定義數據端
#define sc0 0       
#define sc1 1
unsigned char fb;         

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

unsigned char shan_count; //:號閃爍計時變量
unsigned char shan_js;    //校時閃爍計時變量
bit flag;                //校時閃爍標志位

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

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

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

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

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

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

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

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

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

                read3231();                                           //讀出DS3231的各個數據
        Conversion(century,year,month,day); //得到農歷日期
   if(c_moon)                                         //century=0 為21世紀,c=1 為19世紀
        temp=year_moon%12+12;       //如果是19世紀,則可直接得出年的屬性          加12是因為生肖在字庫的第13個開始
  else   
        temp=(year_moon+100)%12+12; //農歷年也過了世紀,則農歷年加100再求屬性 加12是因為生肖在字庫的第13個開始
        Lcd12864_DispWord(0,0,temp,1);// 第1行第1列  顯示十二生肖屬性         1反顯
}
/******************************************************************************
函數名稱:void LCD12864_DispNongLiRiQi(fb)    顯示  農歷日期
函數功能:第4行農歷顯示
由which決定第幾個參數黑顯,如which==1時,年份黑顯.
入口參數:無
出口參數:無
*******************************************************************************/
void LCD12864_DispNongLiRiQi()                  //顯示農歷日期
{
  unsigned char temp1,temp2;
//  verify_time();
  Conversion(century,year,month,day);   //得到農歷日期,世紀/年/月/日
  temp1=month_moon/10;                          //農歷月份高位   兩位農歷月份求模送顯示
  temp2=month_moon%10;                          //農歷月份低位   兩位農歷月份求模送顯示
//月份高位為0,低位為1,則月份前位顯"正",后位顯示“月”字
  if(temp1==0&&temp2==1)  //如果農歷日期,月的十位為0,個位為1,則為正月
  {
      Lcd12864_DispWord(0,6,39,0);  //第7行第1列  顯示”正”字
          Lcd12864_DispWord(2,6,25,0);  //第7行第3列  顯示”月”字
  }
//月份高位為0,低位都大于等于2,則月份高位顯月份,后位顯月。      
  else if (temp1==0&&temp2>=2)
  {
      Lcd12864_DispWord(0,6,temp2,0);//第7行第1列  顯示月份
          Lcd12864_DispWord(2,6,25,0);   //第7行第3列  顯示”月”字
  }
//月份高位為1,低位為0,則月份高位顯“十”,后位顯月。
  else if (temp1==1&&temp2==0)
  {
      Lcd12864_DispWord(0,6,0,0);  //第7行第1列  顯示”十”字
          Lcd12864_DispWord(2,6,25,0); //第7行第3列  顯示”月”字
  }  
//月份高位為1,低位為1,則月份高位顯“冬”,后位顯月。
  else if (temp1==1&&temp2==1)
  {
      Lcd12864_DispWord(0,6,29,0);    //第7行第1列  顯示”冬”字
            Lcd12864_DispWord(2,6,25,0);         //第7行第3列  顯示”月”字
  }
  else
  {
          Lcd12864_DispWord(0,6,30,0);  //第7行第1列  顯示”臘”字
          Lcd12864_DispWord(2,6,25,0); //第7行第3列  顯示”月”字
  }
                  temp1=day_moon/10;                //農歷日期高位         兩位農歷日期求模送顯示
                  temp2=day_moon%10;                 //農歷日期地位          兩位農歷日期求余送顯示

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

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

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

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

使用道具 舉報

ID:46220 發表于 2023-6-2 15:31 | 顯示全部樓層
#ifndef __DS3231_H__
#define __DS3231_H__

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

// IO口模擬I2C通信
sbit DS3231_SCL=P3^6;        //   ds32321模擬I2C數據傳送位SDA
sbit DS3231_SDA=P3^7;        //   模擬I2C時鐘控制位SCL
bit        ack;                //應答標志位
/********************************************************************************************************
**         DS3231常數定義
********************************************************************************************************/
#define DS3231_WriteAddress 0xD0    //器件寫地址
#define DS3231_ReadAddress  0xD1    //器件讀地址
#define DS3231_SECOND       0x00    //秒
#define DS3231_MINUTE       0x01    //分
#define DS3231_HOUR         0x02    //時
#define DS3231_WEEK         0x03    //星期
#define DS3231_DAY          0x04    //日
#define DS3231_MONTH        0x05    //月
#define DS3231_YEAR         0x06    //年

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

#define NACK    1
#define ACK     0

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

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

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

unsigned char  a1,a2,a3,a4;         //按鍵消抖用
unsigned char  disflag=0,b1;        //時間調整相關//b1用來計數進入設置到10秒后如果沒有按鍵按下就返回時間顯示

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

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


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

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

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

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

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

unsigned char read_current()                                          //DS3231讀一字節數據
{
    unsigned char read_data;
    IIC_Start();
    SendByte(DS3231_ReadAddress);                                   //器件讀地址0xD1
    if(ack==0)
        return(0);             
    read_data = RcvByte();
    Ack_I2C(1);
    IIC_Stop();
    return read_data;
}                                                 

unsigned char read_random(unsigned char random_addr)                //DS3231讀時鐘數據
{
    unsigned char Tmp;
        IIC_Start();
    SendByte(DS3231_WriteAddress);                                        //器件寫地址0xD0
    if(ack==0)
        return(0);            
    SendByte(random_addr);
    if(ack==0)
        return(0);
        Tmp=read_current();
        if(random_addr==DS3231_HOUR)
                Tmp&=0x3f;
                                            
    return(BCD2HEX(Tmp));//都轉10進制輸出  //BCD轉換為Byte
}

///**********************************讀溫度函數***********************************///
unsigned char read_random1(unsigned char random_addr)  //這個是讀溫度函數
{
    unsigned char Tmp;
        write_byte(0x0e,0x20);//0x0e寄存器的CONV位置1開啟溫度轉換,要這句,溫度實時刷新,這句不要,溫度要64s才刷新1次
        IIC_Start();
    SendByte(DS3231_WriteAddress);
    if(ack==0)
        return(0);            
    SendByte(random_addr);
    if(ack==0)
        return(0);
        Tmp=read_current();
        return Tmp;
}
                                  
///************************DS3231時間調整和讀出各項數據***************************************************////
void ModifyTime(unsigned char address,unsigned char num)                  //DS3231寫時鐘數據
{
    unsigned char temp=0;
           if(address>6 && address <0) return;
    temp=HEX2BCD(num);
        write_byte(address,temp);
}
void read3231()                                           //讀出DS3231的各個數據
{
         year = read_random(DS3231_YEAR);                  //讀出年數據
         month = read_random(DS3231_MONTH);                  //讀出月數據
         day = read_random(DS3231_DAY);                           //讀出日數據
         week = read_random(DS3231_WEEK);                   //讀出星期數據
         hour = read_random(DS3231_HOUR);                   //讀出小時數據
         min = read_random(DS3231_MINUTE) ;           //讀出分鐘數據
         sec = read_random(DS3231_SECOND);           //讀出秒數據
         
        Tem_H=read_random1(DS3231_TEMPERATUREH);                     //讀出溫度 高字節 整數部分
        Tem_L=((read_random1(DS3231_TEMPERATUREL))>>6)*0.25*100;         //讀出溫度 低字節 小數部分
/*       
        nians=year/10;niang=year%10;
        yues=month/10;yueg=month%10;
        ris=day/10;rig=day%10;
        shis=hour/10;shig=hour%10;
        fens=min/10;feng=min%10;
        miaos=sec/10;miaog=sec%10;
*/       
}
void Set(unsigned char sel,unsigned char selby)            //年月日時分秒限定調整范圍并寫入時鐘數據
{
    unsigned char address;
        char item;
    unsigned char max,min;   
    if(sel==1)  {address=DS3231_HOUR; max=23;min=0;}    //小時
        if(sel==2)  {address=DS3231_MINUTE; max=59;min=0;}    //分鐘
    if(sel==3)  {address=DS3231_SECOND; max=59;min=0;}    //秒       
    if(sel==4)  {address=DS3231_YEAR; max=99;min=0;}    //年
        if(sel==5)  {address=DS3231_MONTH; max=12;min=1;}    //月
        if(sel==6)                                                                                         //日
        {
                if(month==2)
                {
                        if(((year%4==0)&&(year%100!=0))||(year%400==0))        //閏年2月29天 原作者if(month == 2 && year % 4 != 0)
                        {
                                  {address=DS3231_DAY; max=29;min=1;}
                        }
                        else                                                                          //非閏年2月28天
                        {
                                  {address=DS3231_DAY; max=28;min=1;}
                        }
                }
                else
                {
                           if(month==1|month==3|month==5|month==7|month==8|month==10|month==12)                 //大月 31天
                        {   
                                  {address=DS3231_DAY; max=31;min=1;}
                        }
                        if(month==4|month==6|month==9|month==11)                                //小月 30天
                        {   
                                  {address=DS3231_DAY; max=30;min=1;}
                        }
                }
        }   
    //if(sel==7)  {address=DS3231_WEEK; max=7; min=1;}    //星期 星期根據年月日數據求出,這里屏蔽掉

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

void KEY()                                          //按鍵程序
{
        if(a1==0)
   {
                if(KEY1==0)
                {
                        Delay5US();
                        if(KEY1==0)
                        {       
                                b1=0;                        //10秒延時b1清零,加這句是使每次進入設置時a1計數都能從0秒開始計數延時,極端情況剛進設置就退出來了,因為a1始終都在循環累加
                                disflag++;
                                if(disflag>=7 || KEY4==0)                   //如果需要手動調星期就disflag>=8
                                {
                                        disflag=0;                       
                                }
                            a1=1;               
                        }
                }
   }
   if(KEY1==1)
   {
                   a1=0;
   }

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



#endif
回復

使用道具 舉報

ID:46220 發表于 2023-6-2 15:32 | 顯示全部樓層
#ifndef __nongli_H
#define __nongli_H
#include<reg51.h>        //51系列單片機頭文件
#include<intrins.h>

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

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

bit c_moon;
data unsigned char year_moon,month_moon,day_moon;
/***************************************************************************************
* 函數名稱    :get_moon_day
* 功能描述    :用于讀取數據表中農歷月的大月或小月,如果該月為大返回1,為小返回0
* 參數        :  
***************************************************************************************/
bit get_moon_day(unsigned char month_p,unsigned int table_addr)        //讀取數據表中農歷月的大月或小月,如果該月為大返回1,為小返回0
{
  unsigned char temp;
  switch (month_p)
  {
    case  1:{temp=year_code[table_addr]&0x08;   if (temp==0)return(0);else return(1); break;}
    case  2:{temp=year_code[table_addr]&0x04;   if (temp==0)return(0);else return(1); break;}
    case  3:{temp=year_code[table_addr]&0x02;   if (temp==0)return(0);else return(1); break;}
    case  4:{temp=year_code[table_addr]&0x01;   if (temp==0)return(0);else return(1); break;}
    case  5:{temp=year_code[table_addr+1]&0x80; if (temp==0)return(0);else return(1); break;}
    case  6:{temp=year_code[table_addr+1]&0x40; if (temp==0)return(0);else return(1); break;}
    case  7:{temp=year_code[table_addr+1]&0x20; if (temp==0)return(0);else return(1); break;}
    case  8:{temp=year_code[table_addr+1]&0x10; if (temp==0)return(0);else return(1); break;}
    case  9:{temp=year_code[table_addr+1]&0x08; if (temp==0)return(0);else return(1); break;}
    case  10:{temp=year_code[table_addr+1]&0x04; if (temp==0)return(0);else return(1); break;}
    case  11:{temp=year_code[table_addr+1]&0x02; if (temp==0)return(0);else return(1); break;}
    case  12:{temp=year_code[table_addr+1]&0x01; if (temp==0)return(0);else return(1); break;}
    case  13:{temp=year_code[table_addr+2]&0x80; if (temp==0)return(0);else return(1); break;}
             default: break;
  }
}
/*************************************************************************************
* 函數名稱    :Conversion
* 功能描述    :輸入陽歷數據,輸出陰歷數據(只允許1901-2099年)
* 參數        :參數名稱
****************************************************************************************/
void Conversion(bit c,char year,char month,char day)         //輸入陽歷數據,輸出陰歷數據(只允許1901-2099年)
{
//c=0 為21世紀,c=1 為19世紀 輸入輸出數據均為BCD數據           //輸入輸出都是10進制參數
  unsigned char temp1,temp2,temp3,month_p;
  unsigned int temp4,table_addr;
  bit flag2,flag_y;
  //定位數據表地址
  if(c==0) { table_addr=(year+0x64-1)*0x3; }
  else   { table_addr=(year-1)*0x3; }
  //定位數據表地址完成
  //取當年春節所在的公歷月份
  temp1=year_code[table_addr+2]&0x60;
  temp1=_cror_(temp1,5);
  //取當年春節所在的公歷月份完成
  //取當年春節所在的公歷日
  temp2=year_code[table_addr+2]&0x1f;
  //取當年春節所在的公歷日完成
  // 計算當年春年離當年元旦的天數,春節只會在公歷1月或2月
  if(temp1==0x1) { temp3=temp2-1; }  
  else  { temp3=temp2+0x1f-1; }
  // 計算當年春年離當年元旦的天數完成

  //計算公歷日離當年元旦的天數,為了減少運算,用了兩個表
  //day_code1[9],day_code2[3]
  //如果公歷月在九月或前,天數會少于0xff,用表day_code1[9],
  //在九月后,天數大于0xff,用表day_code2[3]
  //如輸入公歷日為8月10日,則公歷日離元旦天數為day_code1[8-1]+10-1
  //如輸入公歷日為11月10日,則公歷日離元旦天數為day_code2[11-10]+10-1
  if (month<10){ temp4=day_code1[month-1]+day-1; }
  else         { temp4=day_code2[month-10]+day-1;}

  if ((month>0x2)&&(year%0x4==0)&&(year!=0))
  temp4+=1; //如果公歷月大于2月并且該年的2月為閏月,天數加1
  //計算公歷日離當年元旦的天數完成

  //判斷公歷日在春節前還是春節后
  if (temp4>=temp3)
  { //公歷日在春節后或就是春節當日使用下面代碼進行運算
    temp4-=temp3;
    month=0x1;
    month_p=0x1;  //month_p為月份指向,公歷日在春節前或就是春節當日month_p指向首月
    flag2=get_moon_day(month_p,table_addr); //檢查該農歷月為大小還是小月,大月返回1,小月返回0
    flag_y=0;
    if(flag2==0)temp1=0x1d; //小月29天
    else temp1=0x1e;     //大月30天
    temp2=year_code[table_addr]&0xf0;
    temp2=_cror_(temp2,4);  //從數據表中取該年的閏月月份,如為0則該年無閏月
    while(temp4>=temp1)
    {
      temp4-=temp1;
      month_p+=1;
      if(month==temp2)
          {
        flag_y=~flag_y;
        if(flag_y==0)month+=1;
      }
      else month+=1;
          flag2=get_moon_day(month_p,table_addr);
      if(flag2==0)temp1=0x1d;
      else temp1=0x1e;
    }
    day=temp4+1;
  }
  else
  {  //公歷日在春節前使用下面代碼進行運算
    temp3-=temp4;
    if (year==0x0){year=0x63;c=1;}
    else year-=1;
    table_addr-=0x3;
    month=0xc;
    temp2=year_code[table_addr]&0xf0;
    temp2=_cror_(temp2,4);
    if (temp2==0)month_p=0xc;
    else month_p=0xd;
        //month_p為月份指向,如果當年有閏月,一年有十三個月,月指向13,無閏月指向12

    flag_y=0;
    flag2=get_moon_day(month_p,table_addr);
      if(flag2==0)
        temp1=0x1d;
      else
        temp1=0x1e;
    while(temp3>temp1)
    {
      temp3-=temp1;
      month_p-=1;
      if(flag_y==0)month-=1;
      if(month==temp2)flag_y=~flag_y;
      flag2=get_moon_day(month_p,table_addr);
      if(flag2==0)temp1=0x1d;
      else temp1=0x1e;
    }
    day=temp1-temp3+1;
  }
  c_moon=c;
//原程序這里又把這得出的值變回BCD碼。但根據我后面的程序,我不需要。
//后面用來顯示的農歷信息的程序分別是disp_t3()和disp_t4()
  year_moon=year;
  month_moon=month;
  day_moon=day;
}
/******************************************************************************************
* 函數名稱    :Conver_week
* 功能描述    :輸入BCD陽歷數據,輸出BCD星期數據(只允許1901-2099年)
* 參數        :  參數名稱:        輸入/輸出?        類型                描述
* 算法:日期+年份+所過閏年數+月較正數之和除7 的余數就是星期,但如果是在
  閏年又不到3 月份上述之和要減一天再除7星期數。余數為0時,為星期天。
******************************************************************************************/
bit century;   //世紀位標志,0為20世紀,1為19世紀
code unsigned char table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正數據表
void Conver_week()         //輸入BCD陽歷數據,輸出BCD星期數據(只允許1901-2099年)
{//century=0 為21世紀,c=1 為19世紀 輸入輸出數據均為BCD數據
  unsigned char temp1,temp2;
  temp1=year;
  if (century==0){temp1=temp1+100;}  //如果為21世紀,年份數加100
  temp2=temp1/4;                     //所過閏年數只算1900年之后的
  temp2=temp1+temp2;
  temp2=temp2%7;                     //為節省資源,先進行一次取余,避免數大于255
  temp2=temp2+day+table_week[month-1];
  if (year%0x4==0&&month<3)temp2-=1;
  week=temp2%7;
}
     
#endif
回復

使用道具 舉報

ID:46220 發表于 2023-6-2 15:32 | 顯示全部樓層
#ifndef __ziku_H
#define __ziku_H
#include<reg51.h>        //51系列單片機頭文件
#include<intrins.h>

unsigned char code hz[]=/*--  楷體_GB231212;  此字體下對應的點陣為:寬x高=16x16   --*/
{
/*0x00,0x40,0x40,0x40,0x40,0x40,0x40,0xFE,0xFE,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,/*--十--0*/

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

  0x00,0x00,0xFC,0xFC,0x44,0xFC,0xFC,0x48,0x7E,0x7E,0x48,0x7E,0x7E,0x48,0x40,0x00,
  0x00,0x40,0x7F,0x3F,0x42,0x7F,0x7F,0x7F,0x7F,0x49,0x49,0x49,0x7F,0x7F,0x00,0x00,//"臘",30
*/
//* (16 X 16 , 宋體 )共陰/列行式/點陣16*索引16/逆向/16進制/像素8/C51格式*/
  0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"十",0*/

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xA9,0x01,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x38,0x7C,0xFF,0xFE,0xFE,0xFF,0x7C,0x38,0x00,0x00,0x00,0x00,//"!"溫度圖標,40
};

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

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

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





#endif
回復

使用道具 舉報

ID:46220 發表于 2023-6-2 15:32 | 顯示全部樓層
#ifndef __18B20_H
#define __18B20_H
#include<reg51.h>        //51系列單片機頭文件
#include<intrins.h>

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

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

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

#endif
回復

使用道具 舉報

ID:46220 發表于 2023-6-2 15:38 | 顯示全部樓層
按我的引腳連接后就是這樣正常顯示的,所有功能都正常
51hei圖片_20230602153623.jpg
回復

使用道具 舉報

ID:46220 發表于 2023-6-2 16:09 | 顯示全部樓層
有一些注釋是我按自己的理解加進去的,不一定正確,看看就好,還有我這里用的是3231時鐘模塊,也有用1302的,區別就在包含的頭文件不一樣,我看你還打了版,我就是直接連線,字庫也改了一些,能力有限,估計還有一些不合理的地方自己都沒發現
回復

使用道具 舉報

ID:529213 發表于 2023-6-2 17:40 來自觸屏版 | 顯示全部樓層
niehaitao 發表于 2023-6-2 16:09
有一些注釋是我按自己的理解加進去的,不一定正確,看看就好,還有我這里用的是3231時鐘模塊,也有用1302的 ...

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

使用道具 舉報

ID:1081788 發表于 2023-6-3 15:18 | 顯示全部樓層
很棒我覺得非常的好
回復

使用道具 舉報

ID:1042173 發表于 2023-6-14 22:51 | 顯示全部樓層
怎我用Kill5編譯不過去呀?
回復

使用道具 舉報

ID:1083996 發表于 2023-6-15 08:10 | 顯示全部樓層
niehaitao 發表于 2023-6-2 16:09
有一些注釋是我按自己的理解加進去的,不一定正確,看看就好,還有我這里用的是3231時鐘模塊,也有用1302的 ...

會不會用個外置更好的晶振,能讓時間更準確一些呢?
回復

使用道具 舉報

ID:877406 發表于 2023-10-13 17:53 | 顯示全部樓層
量子工業 發表于 2023-6-15 08:10
會不會用個外置更好的晶振,能讓時間更準確一些呢?

用DS3231時間更準確
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品视频在 | 中文字幕在线第一页 | 久久久影院| 日韩毛片| 爱爱免费视频 | 午夜黄色影院 | 久久久久国产精品 | 99久久久无码国产精品 | 中文字幕蜜臀 | 成人h视频在线 | 国产一区不卡 | 有码一区 | 天天看天天干 | 久久国产免费看 | 成人免费视频7777777 | 国产精品久久国产精品 | 国产一级淫片免费视频 | 亚洲九九 | 在线色网址 | av电影手机在线看 | 一区二区三区四区不卡 | 欧美在线观看免费观看视频 | 国产精品日韩欧美一区二区三区 | 91精品一区 | 亚洲一区二区中文字幕在线观看 | 一级黄色片网站 | 香蕉国产在线视频 | 涩涩视频大全 | 亚洲婷婷一区 | 国产传媒在线观看 | 欧美日韩精品亚洲 | 日韩资源 | 日韩精品一区二区三区在线播放 | 久久久久久久国产 | av影音资源 | 国产成人一区二区三区久久久 | 国产一区二区毛片 | 久久r免费视频 | 国产精品亚洲视频 | 久草视频在线播放 | 成人午夜免费在线视频 |