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

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

QQ登錄

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

搜索
查看: 6483|回復(fù): 5
收起左側(cè)

LCD12864和PCF8563 IIC總線(萬(wàn)年歷)顯示時(shí)間的單片機(jī)源碼

  [復(fù)制鏈接]
ID:343963 發(fā)表于 2018-6-3 13:58 | 顯示全部樓層 |閱讀模式
剛學(xué)51單片機(jī)IIC以及萬(wàn)年歷的源碼
下面直接放東西,就是個(gè)簡(jiǎn)單的萬(wàn)年歷,請(qǐng)各位大神指教

0.png

單片機(jī)源程序如下:
  1. /*
  2. LCD12864和PCF8563顯示時(shí)間 !!!
  3. 徐逸夫
  4. 2016-5-16  ~  5-18
  5. */
  6. /* 如果要在程序中使用此代碼,請(qǐng)?jiān)诔绦蛑凶⒚魇褂昧薙TC的資料及程序 */
  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;       //采樣計(jì)數(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;         //安鍵動(dòng)作發(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í)分秒的數(shù)字形式
  35. u8 YMD_num[] = {"00-00-00"};                                                //year,month,day的數(shù)字形式

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

  38. struct POINT_CLOCK                                        //結(jié)構(gòu)體   RTC變量時(shí)分秒
  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的擴(kuò)充
  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的時(shí)間
  53. void  WriteRTC();                                                                                //更改PCF8563的時(shí)間
  54. void  init_ClockCirle();                                                 //初始化表盤和刻度
  55. void  Display_Pointer(struct POINT_CLOCK AA);        //指針顯示
  56. void  Display_ThreePointer();       //指針式時(shí)鐘顯示
  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. /********************** 寫(xiě)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);//畫(huà)圓  圓心坐標(biāo)(32,32) 半徑31,空心圓
  103.         for(i=0;i<60;i++)
  104.         {
  105.                 if((i%5)==0)      //畫(huà)刻度
  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:顯示時(shí)、分、秒指針
  114. *參    數(shù):結(jié)構(gòu)體: 時(shí)分秒   
  115. *注:                秒針長(zhǎng)24                        分針長(zhǎng)17                        秒針長(zhǎng)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);  //時(shí)針        
  122. }

  123. /*========================================================================
  124. *name:Display_ThreePointer(struct POINT_CLOCK AA,unsigned char color)
  125. *function:顯示時(shí)、分、秒指針
  126. *參    數(shù):        結(jié)構(gòu)體0:存放上一個(gè)時(shí)分秒   兩者不同時(shí),刷新顯示
  127.                                                 結(jié)構(gòu)體1:存放這一個(gè)時(shí)分秒   
  128. =========================================================================*/
  129. void Display_ThreePointer()        //左側(cè)LCD指針式時(shí)鐘顯示
  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)))   //時(shí)刷新顯示
  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)在的指針式時(shí)鐘顯示
  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í)分秒的數(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()                                                        //時(shí)間自動(dòng)調(diào)整,分針時(shí)針的加減調(diào)整和進(jìn)位
  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;                //定時(shí)器時(shí)鐘1T模式
  212.         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  213.         TH0 = 0xFC;
  214.         TL0 = 0xF6;
  215.         ET0 = 1;    //Timer0 interrupt enable
  216.         TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
  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();                        //畫(huà)出表盤
  232.         ReadRTC();
  233.         error = 1;                                                        //初始化默認(rèn)更改時(shí)間
  234.         if(RTC_Time_Now.second >= 60)    error = 1; //錯(cuò)誤
  235.         if(RTC_Time_Now.minute >= 60)    error = 1; //錯(cuò)誤
  236.         if(RTC_Time_Now.hour   >= 24)    error = 1; //錯(cuò)誤
  237.         if(error)  //有錯(cuò)誤, 默認(rèn)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();                                                                //寫(xiě)入時(shí)間到PCF8563
  242.         }
  243.         while(1)
  244.         {        //根據(jù)接收到的鍵值 對(duì)時(shí)間進(jìn)行改變
  245.                 AutoTime();
  246.                 if(B_1ms)   //1ms到
  247.                 {
  248.                         B_1ms = 0;
  249.                         if(B_IR_Press)                      //檢測(cè)到收到紅外鍵碼
  250.                         {
  251.                                 B_IR_Press = 0;
  252. ……………………

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

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




回復(fù)

使用道具 舉報(bào)

ID:198286 發(fā)表于 2020-3-1 12:35 | 顯示全部樓層
PCF8563就是595的程序吧,我一直在找這個(gè)
回復(fù)

使用道具 舉報(bào)

ID:214276 發(fā)表于 2020-3-28 16:44 | 顯示全部樓層
剛好有個(gè)8583的時(shí)鐘芯片,下載來(lái)試試看學(xué)習(xí)下。
回復(fù)

使用道具 舉報(bào)

ID:398094 發(fā)表于 2020-3-28 22:18 | 顯示全部樓層
剛好有個(gè)8583的時(shí)鐘芯片,學(xué)習(xí)下。
回復(fù)

使用道具 舉報(bào)

ID:852976 發(fā)表于 2020-12-7 16:06 | 顯示全部樓層
剛好用到,感謝大佬
回復(fù)

使用道具 舉報(bào)

6#
無(wú)效樓層,該帖已經(jīng)被刪除
ID:170645 發(fā)表于 2022-2-18 03:39 來(lái)自觸屏版 | 顯示全部樓層
硬件i2c oled pcf 8563
回復(fù)

使用道具 舉報(bào)

8#
無(wú)效樓層,該帖已經(jīng)被刪除

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品大全 | 97久久精品 | 中文一区二区 | 一区二区三区成人 | 国产成人久久av免费高清密臂 | 亚洲欧美日韩在线一区二区 | 一级片免费视频 | 亚洲精品视频三区 | 久久精品99 | 国户精品久久久久久久久久久不卡 | 国产精品免费一区二区三区四区 | 日韩有码一区 | 久久这里有精品 | 国产精品久久久久久久久久久久久 | 91欧美激情一区二区三区成人 | 全部免费毛片在线播放网站 | 日韩精品视频在线 | 国产精品亚洲第一 | 国产欧美二区 | 国产一区二区三区四区 | 日韩中文字幕区 | 欧美日韩精品 | 久久久网 | 国产高清视频在线观看播放 | 在线观看中文字幕一区二区 | 亚洲欧美日韩精品久久亚洲区 | 亚洲一区影院 | 红桃成人在线 | 亚洲免费成人 | 91精品久久久久久久久中文字幕 | 国产精品乱码一区二三区小蝌蚪 | 91精品国产自产在线老师啪 | jizz视频 | 久久88 | 欧美高清一级片 | 国产在线精品区 | 精品一区二区三区中文字幕 | 国产成人午夜精品影院游乐网 | 中文字幕电影在线观看 | 一级午夜aaa免费看三区 | 免费国产视频 |