找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6511|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

LCD12864和PCF8563 IIC總線(萬年歷)顯示時間的單片機源碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:343963 發(fā)表于 2018-6-3 13:58 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
剛學(xué)51單片機IIC以及萬年歷的源碼
下面直接放東西,就是個簡單的萬年歷,請各位大神指教



單片機源程序如下:
  1. /*
  2. LCD12864和PCF8563顯示時間 !!!
  3. 徐逸夫
  4. 2016-5-16  ~  5-18
  5. */
  6. /* 如果要在程序中使用此代碼,請在程序中注明使用了STC的資料及程序 */
  7. #include <STC15.H>
  8. #include <stdio.h>
  9. #include "GPIO.h"                                                        
  10. #include "12864.h"
  11. #include "LCD_draw.h"
  12. #include "IIC.h"
  13. #include "Infrared.h"
  14. sbit        HC595_SER   = P4^0;        //pin 14        SER                data input
  15. sbit        HC595_LCLK  = P5^4;        //pin 12        RCLk        store (latch) clock
  16. sbit        HC595_SCLK = P4^3;        //pin 11        SRCLK        Shift data clock

  17. /*************  紅外接收程序變量聲明    **************/
  18. //sbit    P_IR_RX = P3^6;         //定義紅外接收輸入IO口
  19. u8  IR_SampleCnt;       //采樣計數(shù)
  20. u8  IR_BitCnt;          //編碼位數(shù)
  21. u8  IR_UserH;           //用戶碼(地址)高字節(jié)
  22. u8  IR_UserL;           //用戶碼(地址)低字節(jié)
  23. u8  IR_data;            //數(shù)據(jù)原碼
  24. u8  IR_DataShit;        //數(shù)據(jù)移位

  25. bit P_IR_RX_temp;       //Last sample
  26. bit B_IR_Sync;          //已收到同步標(biāo)志
  27. bit B_IR_Press;         //安鍵動作發(fā)生
  28. u8  IR_code;            //紅外鍵碼
  29. u16 UserCode;           //用戶碼
  30. /*****************************************************/

  31. u8 week0[] = {"一"},week1[] = {"二"},week2[] = {"三"};
  32. u8 week3[] = {"四"},week4[] = {"五"},week5[] = {"六"},week6[] = {"天"};                //星期幾的字符集
  33. u8 code num2char[] = {"0123456789"};                //數(shù)字轉(zhuǎn)化為ASCII字符
  34. u8 Time_num[] = {"00-00-00"};                                                //時分秒的數(shù)字形式
  35. u8 YMD_num[] = {"00-00-00"};                                                //year,month,day的數(shù)字形式

  36. u16 msecond;                                                                                                                //毫秒計數(shù)
  37. bit B_1ms;                                                                                                                        //1ms標(biāo)志位

  38. struct POINT_CLOCK                                        //結(jié)構(gòu)體   RTC變量時分秒
  39. {
  40.         u8 hour;
  41.         u8 minute;
  42.         u8 second;
  43. }RTC_Time,RTC_Time_Now;

  44. struct NUM_CLOCK                                        //結(jié)構(gòu)體   RTC變量year,month,day的擴充
  45. {
  46.         u8 year;
  47.         u8 month;
  48.         u8 week;
  49.         u8 day;
  50. }More_Time;

  51. void  DisableHC595(void);                                                 //關(guān)閉595顯示
  52. void  ReadRTC();                                                                                //讀取PCF8563的時間
  53. void  WriteRTC();                                                                                //更改PCF8563的時間
  54. void  init_ClockCirle();                                                 //初始化表盤和刻度
  55. void  Display_Pointer(struct POINT_CLOCK AA);        //指針顯示
  56. void  Display_ThreePointer();       //指針式時鐘顯示
  57. void  Display_Number(struct POINT_CLOCK AA,struct NUM_CLOCK BB);        //右側(cè)LCD數(shù)字顯示
  58.         
  59. void DisableHC595(void) //關(guān)閉595顯示
  60. {               
  61.         u8        i;
  62.         HC595_SER   = 1;
  63.         for(i=0; i<20; i++)
  64.         {
  65.                 HC595_SCLK = 1;
  66.                 HC595_SCLK = 0;
  67.         }
  68.         HC595_LCLK = 1;
  69.         HC595_LCLK = 0;                                                        //鎖存輸出數(shù)據(jù)
  70.         HC595_LCLK = 1;
  71.         HC595_LCLK = 0;                                                        //鎖存輸出數(shù)據(jù)
  72. }


  73. /********************** 讀RTC函數(shù) ************************/
  74. void    ReadRTC(void)
  75. {
  76.         u8  tmp[7];
  77.         ReadNbyte(2, tmp, 7);
  78.         RTC_Time_Now.second = ((tmp[0] >> 4) & 0x07) * 10 + (tmp[0] & 0x0f);
  79.         RTC_Time_Now.minute = ((tmp[1] >> 4) & 0x07) * 10 + (tmp[1] & 0x0f);
  80.         RTC_Time_Now.hour   = ((tmp[2] >> 4) & 0x03) * 10 + (tmp[2] & 0x0f);
  81.         More_Time.day       = ((tmp[3] >> 4) & 0x03) * 10 + (tmp[3] & 0x0f);
  82.         More_Time.week      = ((tmp[4] >> 4) & 0x00) * 10 + (tmp[4] & 0x07);
  83.         More_Time.month     = ((tmp[5] >> 4) & 0x01) * 10 + (tmp[5] & 0x0f);
  84.         More_Time.year      = ((tmp[6] >> 4) & 0x0f) * 10 + (tmp[6] & 0x0f);
  85. }

  86. /********************** 寫RTC函數(shù) ************************/
  87. void    WriteRTC()
  88. {
  89.         u8  tmp[7];
  90.         tmp[0] = ((RTC_Time_Now.second / 10) << 4) + (RTC_Time_Now.second % 10);
  91.         tmp[1] = ((RTC_Time_Now.minute / 10) << 4) + (RTC_Time_Now.minute % 10);
  92.         tmp[2] = ((RTC_Time_Now.hour / 10) << 4) + (RTC_Time_Now.hour % 10);
  93.         tmp[3] = ((More_Time.day / 10) << 4) + (More_Time.day % 10);
  94.         tmp[4] = ((More_Time.week / 10) << 4) + (More_Time.week % 10);
  95.         tmp[5] = ((More_Time.month / 10) << 4) + (More_Time.month % 10);
  96.         tmp[6] = ((More_Time.year / 10) << 4) + (More_Time.year % 10);
  97.         WriteNbyte(2, tmp, 7);
  98. }

  99. void init_ClockCirle()                         //初始化表盤
  100. {
  101.         u8 i;
  102.         draw_Circle(32,32,31,0);//畫圓  圓心坐標(biāo)(32,32) 半徑31,空心圓
  103.         for(i=0;i<60;i++)
  104.         {
  105.                 if((i%5)==0)      //畫刻度
  106.                 {
  107.                         draw_Line(RTC_X(32,28,i),RTC_Y(32,28,i),RTC_X(32,30,i),RTC_Y(32,30,i));                                       
  108.                 }
  109.         }
  110. }
  111. /*========================================================================
  112. *name:Display_Pointer(struct POINT_CLOCK AA)
  113. *function:顯示時、分、秒指針
  114. *參    數(shù):結(jié)構(gòu)體: 時分秒   
  115. *注:                秒針長24                        分針長17                        秒針長12
  116. =========================================================================*/
  117. void Display_Pointer(struct POINT_CLOCK AA)        //指針顯示 ,作為Display_ThreePointer()的子函數(shù)
  118. {
  119.         draw_Line(RTC_X(32,24,AA.second),RTC_Y(32,24,AA.second),32,32);         //秒針
  120.         draw_Line(RTC_X(32,17,AA.minute),RTC_Y(32,17,AA.minute),32,32);                //分針
  121.         draw_Line(RTC_X(32,12,AA.minute/12+5*(AA.hour%12)),RTC_Y(32,12,AA.minute/12+5*(AA.hour%12)),32,32);  //時針        
  122. }

  123. /*========================================================================
  124. *name:Display_ThreePointer(struct POINT_CLOCK AA,unsigned char color)
  125. *function:顯示時、分、秒指針
  126. *參    數(shù):        結(jié)構(gòu)體0:存放上一個時分秒   兩者不同時,刷新顯示
  127.                                                 結(jié)構(gòu)體1:存放這一個時分秒   
  128. =========================================================================*/
  129. void Display_ThreePointer()        //左側(cè)LCD指針式時鐘顯示
  130. {
  131.         if(RTC_Time.second!=RTC_Time_Now.second)      //秒刷新
  132.         {
  133.                 dele_Line(RTC_X(32,24,RTC_Time.second),RTC_Y(32,24,RTC_Time.second),32,32);
  134.         }
  135.         if(RTC_Time.minute!=RTC_Time_Now.minute)    //分刷新
  136.         {
  137.                 dele_Line(RTC_X(32,17,RTC_Time.minute),RTC_Y(32,17,RTC_Time.minute),32,32);        
  138.         }
  139.         if((RTC_Time.minute/12+5*(RTC_Time.hour%12))!=(RTC_Time_Now.minute/12+5*(RTC_Time_Now.hour%12)))   //時刷新顯示
  140.         {
  141.                 dele_Line(RTC_X(32,12,RTC_Time.minute/12+5*(RTC_Time.hour%12)),RTC_Y(32,12,RTC_Time.minute/12+5*(RTC_Time.hour%12)),32,32);        
  142.         }
  143.         Display_Pointer(RTC_Time_Now);        //現(xiàn)在的指針式時鐘顯示
  144.         RTC_Time=RTC_Time_Now;
  145. }

  146. void Display_Number(struct POINT_CLOCK AA,struct NUM_CLOCK BB)        //右側(cè)LCD數(shù)字顯示
  147. {
  148.         lcdwritecmd(0x30);                                                //普通文本模式
  149.         ReadRTC();
  150.         Time_num[0]=num2char[AA.hour/10],Time_num[1]=num2char[AA.hour%10];
  151.         Time_num[3]=num2char[AA.minute/10],Time_num[4]=num2char[AA.minute%10];        
  152.         Time_num[6]=num2char[AA.second/10],Time_num[7]=num2char[AA.second%10];
  153.         lcdshowstr(4,2,Time_num);                                                //時分秒的數(shù)字顯示
  154.         YMD_num[0]=num2char[BB.year/10],YMD_num[1]=num2char[BB.year%10];
  155.         YMD_num[3]=num2char[BB.month/10],YMD_num[4]=num2char[BB.month%10];
  156.         YMD_num[6]=num2char[BB.day/10],YMD_num[7]=num2char[BB.day%10];
  157.         lcdshowstr(4,1,YMD_num);                                                //年月日的數(shù)字顯示
  158.         lcdshowstr(4,3,"星期");                                                //星期幾的顯示
  159.         switch (BB.week)
  160.         {
  161.                 case 0:lcdshowstr(6,3,week0);break;                case 1:lcdshowstr(6,3,week1);break;                case 2:lcdshowstr(6,3,week2);break;
  162.                 case 3:lcdshowstr(6,3,week3);break;                case 4:lcdshowstr(6,3,week4);break;                case 5:lcdshowstr(6,3,week5);break;
  163.                 case 6:lcdshowstr(6,3,week6);break;                default:lcdshowstr(6,3,"幾");break;
  164.         }
  165. }
  166. void        AutoTime()                                                        //時間自動調(diào)整,分針時針的加減調(diào)整和進位
  167. {
  168.         if (IR_code == 7||IR_code == 21||IR_code == 64||IR_code == 68)                                
  169.                 {
  170.                         if(IR_code == 7)
  171.                         {
  172.                                 if(RTC_Time_Now.minute == 0)
  173.                                 {
  174.                                         RTC_Time_Now.minute = 59;
  175.                                         if(RTC_Time_Now.hour == 0)
  176.                                         {
  177.                                                 RTC_Time_Now.hour = 23;
  178.                                         }else RTC_Time_Now.hour--;
  179.                                 }else RTC_Time_Now.minute--;
  180.                                 WriteRTC();IR_code=0;
  181.                         }
  182.                         if(IR_code == 21)
  183.                         {
  184.                                 if(++RTC_Time_Now.minute >= 60)
  185.                                 {
  186.                                         RTC_Time_Now.minute = 0;
  187.                                         if(++RTC_Time_Now.hour >= 24)        RTC_Time_Now.hour = 0;
  188.                                 }
  189.                                 WriteRTC();IR_code=0;
  190.                         }
  191.                         if(IR_code == 64)
  192.                         {
  193.                                 if(++RTC_Time_Now.hour >= 24)
  194.                                 {
  195.                                         RTC_Time_Now.hour = 0;
  196.                                 }
  197.                                 WriteRTC();IR_code=0;
  198.                         }
  199.                         if(IR_code == 68)
  200.                         {
  201.                                 if(RTC_Time_Now.hour == 0)
  202.                                 {
  203.                                         RTC_Time_Now.hour = 23;
  204.                                 }else RTC_Time_Now.hour--;
  205.                                 WriteRTC();IR_code=0;
  206.                         }
  207.                 }
  208. }
  209.         void Timer0Init(void)                //1毫秒@11.0592MHz
  210. {
  211.         AUXR |= 0x80;                //定時器時鐘1T模式
  212.         TMOD &= 0xF0;                //設(shè)置定時器模式
  213.         TH0 = 0xFC;
  214.         TL0 = 0xF6;
  215.         ET0 = 1;    //Timer0 interrupt enable
  216.         TR0 = 1;                //定時器0開始計時
  217. }

  218. void Interrupt_Timer0() interrupt 1
  219. {        
  220.         B_1ms = 1;                                        //1ms掃描顯示一位
  221.         IR_RX_NEC();                                //掃描紅外遙控
  222. }

  223. void main()
  224. {
  225.         bit error;
  226.         GPIO();
  227.         DisableHC595();                //禁止掉學(xué)習(xí)板上的HC595顯示,省電
  228.         Timer0Init();EA=1;
  229.   lcdinit();                                //初始化
  230.         lcd_cls();                                                        //清屏
  231.         init_ClockCirle();                        //畫出表盤
  232.         ReadRTC();
  233.         error = 1;                                                        //初始化默認更改時間
  234.         if(RTC_Time_Now.second >= 60)    error = 1; //錯誤
  235.         if(RTC_Time_Now.minute >= 60)    error = 1; //錯誤
  236.         if(RTC_Time_Now.hour   >= 24)    error = 1; //錯誤
  237.         if(error)  //有錯誤, 默認12:00:00
  238.         {
  239.                         RTC_Time_Now.second = 58;RTC_Time_Now.minute = 59;RTC_Time_Now.hour  = 22;                                //更改為2016-5-18
  240.                         More_Time.day = 18;More_Time.week = 2;More_Time.month = 5 ;More_Time.year =  16;        //        22:59:58
  241.                         WriteRTC();                                                                //寫入時間到PCF8563
  242.         }
  243.         while(1)
  244.         {        //根據(jù)接收到的鍵值 對時間進行改變
  245.                 AutoTime();
  246.                 if(B_1ms)   //1ms到
  247.                 {
  248.                         B_1ms = 0;
  249.                         if(B_IR_Press)                      //檢測到收到紅外鍵碼
  250.                         {
  251.                                 B_IR_Press = 0;
  252. ……………………

  253. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
IIC以及萬年歷.zip (106.44 KB, 下載次數(shù): 129)




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

使用道具 舉報

沙發(fā)
ID:198286 發(fā)表于 2020-3-1 12:35 | 只看該作者
PCF8563就是595的程序吧,我一直在找這個
回復(fù)

使用道具 舉報

板凳
ID:214276 發(fā)表于 2020-3-28 16:44 | 只看該作者
剛好有個8583的時鐘芯片,下載來試試看學(xué)習(xí)下。
回復(fù)

使用道具 舉報

地板
ID:398094 發(fā)表于 2020-3-28 22:18 | 只看該作者
剛好有個8583的時鐘芯片,學(xué)習(xí)下。
回復(fù)

使用道具 舉報

5#
ID:852976 發(fā)表于 2020-12-7 16:06 | 只看該作者
剛好用到,感謝大佬
回復(fù)

使用道具 舉報

6#
ID:170645 發(fā)表于 2022-2-18 03:39 來自觸屏版 | 只看該作者
硬件i2c oled pcf 8563
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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