|
剛學(xué)51單片機(jī)IIC以及萬(wàn)年歷的源碼
下面直接放東西,就是個(gè)簡(jiǎn)單的萬(wàn)年歷,請(qǐng)各位大神指教
單片機(jī)源程序如下:
- /*
- LCD12864和PCF8563顯示時(shí)間 !!!
- 徐逸夫
- 2016-5-16 ~ 5-18
- */
- /* 如果要在程序中使用此代碼,請(qǐng)?jiān)诔绦蛑凶⒚魇褂昧薙TC的資料及程序 */
- #include <STC15.H>
- #include <stdio.h>
- #include "GPIO.h"
- #include "12864.h"
- #include "LCD_draw.h"
- #include "IIC.h"
- #include "Infrared.h"
- sbit HC595_SER = P4^0; //pin 14 SER data input
- sbit HC595_LCLK = P5^4; //pin 12 RCLk store (latch) clock
- sbit HC595_SCLK = P4^3; //pin 11 SRCLK Shift data clock
- /************* 紅外接收程序變量聲明 **************/
- //sbit P_IR_RX = P3^6; //定義紅外接收輸入IO口
- u8 IR_SampleCnt; //采樣計(jì)數(shù)
- u8 IR_BitCnt; //編碼位數(shù)
- u8 IR_UserH; //用戶碼(地址)高字節(jié)
- u8 IR_UserL; //用戶碼(地址)低字節(jié)
- u8 IR_data; //數(shù)據(jù)原碼
- u8 IR_DataShit; //數(shù)據(jù)移位
- bit P_IR_RX_temp; //Last sample
- bit B_IR_Sync; //已收到同步標(biāo)志
- bit B_IR_Press; //安鍵動(dòng)作發(fā)生
- u8 IR_code; //紅外鍵碼
- u16 UserCode; //用戶碼
- /*****************************************************/
- u8 week0[] = {"一"},week1[] = {"二"},week2[] = {"三"};
- u8 week3[] = {"四"},week4[] = {"五"},week5[] = {"六"},week6[] = {"天"}; //星期幾的字符集
- u8 code num2char[] = {"0123456789"}; //數(shù)字轉(zhuǎn)化為ASCII字符
- u8 Time_num[] = {"00-00-00"}; //時(shí)分秒的數(shù)字形式
- u8 YMD_num[] = {"00-00-00"}; //year,month,day的數(shù)字形式
- u16 msecond; //毫秒計(jì)數(shù)
- bit B_1ms; //1ms標(biāo)志位
- struct POINT_CLOCK //結(jié)構(gòu)體 RTC變量時(shí)分秒
- {
- u8 hour;
- u8 minute;
- u8 second;
- }RTC_Time,RTC_Time_Now;
- struct NUM_CLOCK //結(jié)構(gòu)體 RTC變量year,month,day的擴(kuò)充
- {
- u8 year;
- u8 month;
- u8 week;
- u8 day;
- }More_Time;
- void DisableHC595(void); //關(guān)閉595顯示
- void ReadRTC(); //讀取PCF8563的時(shí)間
- void WriteRTC(); //更改PCF8563的時(shí)間
- void init_ClockCirle(); //初始化表盤和刻度
- void Display_Pointer(struct POINT_CLOCK AA); //指針顯示
- void Display_ThreePointer(); //指針式時(shí)鐘顯示
- void Display_Number(struct POINT_CLOCK AA,struct NUM_CLOCK BB); //右側(cè)LCD數(shù)字顯示
-
- void DisableHC595(void) //關(guān)閉595顯示
- {
- u8 i;
- HC595_SER = 1;
- for(i=0; i<20; i++)
- {
- HC595_SCLK = 1;
- HC595_SCLK = 0;
- }
- HC595_LCLK = 1;
- HC595_LCLK = 0; //鎖存輸出數(shù)據(jù)
- HC595_LCLK = 1;
- HC595_LCLK = 0; //鎖存輸出數(shù)據(jù)
- }
- /********************** 讀RTC函數(shù) ************************/
- void ReadRTC(void)
- {
- u8 tmp[7];
- ReadNbyte(2, tmp, 7);
- RTC_Time_Now.second = ((tmp[0] >> 4) & 0x07) * 10 + (tmp[0] & 0x0f);
- RTC_Time_Now.minute = ((tmp[1] >> 4) & 0x07) * 10 + (tmp[1] & 0x0f);
- RTC_Time_Now.hour = ((tmp[2] >> 4) & 0x03) * 10 + (tmp[2] & 0x0f);
- More_Time.day = ((tmp[3] >> 4) & 0x03) * 10 + (tmp[3] & 0x0f);
- More_Time.week = ((tmp[4] >> 4) & 0x00) * 10 + (tmp[4] & 0x07);
- More_Time.month = ((tmp[5] >> 4) & 0x01) * 10 + (tmp[5] & 0x0f);
- More_Time.year = ((tmp[6] >> 4) & 0x0f) * 10 + (tmp[6] & 0x0f);
- }
- /********************** 寫(xiě)RTC函數(shù) ************************/
- void WriteRTC()
- {
- u8 tmp[7];
- tmp[0] = ((RTC_Time_Now.second / 10) << 4) + (RTC_Time_Now.second % 10);
- tmp[1] = ((RTC_Time_Now.minute / 10) << 4) + (RTC_Time_Now.minute % 10);
- tmp[2] = ((RTC_Time_Now.hour / 10) << 4) + (RTC_Time_Now.hour % 10);
- tmp[3] = ((More_Time.day / 10) << 4) + (More_Time.day % 10);
- tmp[4] = ((More_Time.week / 10) << 4) + (More_Time.week % 10);
- tmp[5] = ((More_Time.month / 10) << 4) + (More_Time.month % 10);
- tmp[6] = ((More_Time.year / 10) << 4) + (More_Time.year % 10);
- WriteNbyte(2, tmp, 7);
- }
- void init_ClockCirle() //初始化表盤
- {
- u8 i;
- draw_Circle(32,32,31,0);//畫(huà)圓 圓心坐標(biāo)(32,32) 半徑31,空心圓
- for(i=0;i<60;i++)
- {
- if((i%5)==0) //畫(huà)刻度
- {
- draw_Line(RTC_X(32,28,i),RTC_Y(32,28,i),RTC_X(32,30,i),RTC_Y(32,30,i));
- }
- }
- }
- /*========================================================================
- *name:Display_Pointer(struct POINT_CLOCK AA)
- *function:顯示時(shí)、分、秒指針
- *參 數(shù):結(jié)構(gòu)體: 時(shí)分秒
- *注: 秒針長(zhǎng)24 分針長(zhǎng)17 秒針長(zhǎng)12
- =========================================================================*/
- void Display_Pointer(struct POINT_CLOCK AA) //指針顯示 ,作為Display_ThreePointer()的子函數(shù)
- {
- draw_Line(RTC_X(32,24,AA.second),RTC_Y(32,24,AA.second),32,32); //秒針
- draw_Line(RTC_X(32,17,AA.minute),RTC_Y(32,17,AA.minute),32,32); //分針
- 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í)針
- }
- /*========================================================================
- *name:Display_ThreePointer(struct POINT_CLOCK AA,unsigned char color)
- *function:顯示時(shí)、分、秒指針
- *參 數(shù): 結(jié)構(gòu)體0:存放上一個(gè)時(shí)分秒 兩者不同時(shí),刷新顯示
- 結(jié)構(gòu)體1:存放這一個(gè)時(shí)分秒
- =========================================================================*/
- void Display_ThreePointer() //左側(cè)LCD指針式時(shí)鐘顯示
- {
- if(RTC_Time.second!=RTC_Time_Now.second) //秒刷新
- {
- dele_Line(RTC_X(32,24,RTC_Time.second),RTC_Y(32,24,RTC_Time.second),32,32);
- }
- if(RTC_Time.minute!=RTC_Time_Now.minute) //分刷新
- {
- dele_Line(RTC_X(32,17,RTC_Time.minute),RTC_Y(32,17,RTC_Time.minute),32,32);
- }
- if((RTC_Time.minute/12+5*(RTC_Time.hour%12))!=(RTC_Time_Now.minute/12+5*(RTC_Time_Now.hour%12))) //時(shí)刷新顯示
- {
- 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);
- }
- Display_Pointer(RTC_Time_Now); //現(xiàn)在的指針式時(shí)鐘顯示
- RTC_Time=RTC_Time_Now;
- }
- void Display_Number(struct POINT_CLOCK AA,struct NUM_CLOCK BB) //右側(cè)LCD數(shù)字顯示
- {
- lcdwritecmd(0x30); //普通文本模式
- ReadRTC();
- Time_num[0]=num2char[AA.hour/10],Time_num[1]=num2char[AA.hour%10];
- Time_num[3]=num2char[AA.minute/10],Time_num[4]=num2char[AA.minute%10];
- Time_num[6]=num2char[AA.second/10],Time_num[7]=num2char[AA.second%10];
- lcdshowstr(4,2,Time_num); //時(shí)分秒的數(shù)字顯示
- YMD_num[0]=num2char[BB.year/10],YMD_num[1]=num2char[BB.year%10];
- YMD_num[3]=num2char[BB.month/10],YMD_num[4]=num2char[BB.month%10];
- YMD_num[6]=num2char[BB.day/10],YMD_num[7]=num2char[BB.day%10];
- lcdshowstr(4,1,YMD_num); //年月日的數(shù)字顯示
- lcdshowstr(4,3,"星期"); //星期幾的顯示
- switch (BB.week)
- {
- case 0:lcdshowstr(6,3,week0);break; case 1:lcdshowstr(6,3,week1);break; case 2:lcdshowstr(6,3,week2);break;
- case 3:lcdshowstr(6,3,week3);break; case 4:lcdshowstr(6,3,week4);break; case 5:lcdshowstr(6,3,week5);break;
- case 6:lcdshowstr(6,3,week6);break; default:lcdshowstr(6,3,"幾");break;
- }
- }
- void AutoTime() //時(shí)間自動(dòng)調(diào)整,分針時(shí)針的加減調(diào)整和進(jìn)位
- {
- if (IR_code == 7||IR_code == 21||IR_code == 64||IR_code == 68)
- {
- if(IR_code == 7)
- {
- if(RTC_Time_Now.minute == 0)
- {
- RTC_Time_Now.minute = 59;
- if(RTC_Time_Now.hour == 0)
- {
- RTC_Time_Now.hour = 23;
- }else RTC_Time_Now.hour--;
- }else RTC_Time_Now.minute--;
- WriteRTC();IR_code=0;
- }
- if(IR_code == 21)
- {
- if(++RTC_Time_Now.minute >= 60)
- {
- RTC_Time_Now.minute = 0;
- if(++RTC_Time_Now.hour >= 24) RTC_Time_Now.hour = 0;
- }
- WriteRTC();IR_code=0;
- }
- if(IR_code == 64)
- {
- if(++RTC_Time_Now.hour >= 24)
- {
- RTC_Time_Now.hour = 0;
- }
- WriteRTC();IR_code=0;
- }
- if(IR_code == 68)
- {
- if(RTC_Time_Now.hour == 0)
- {
- RTC_Time_Now.hour = 23;
- }else RTC_Time_Now.hour--;
- WriteRTC();IR_code=0;
- }
- }
- }
- void Timer0Init(void) //1毫秒@11.0592MHz
- {
- AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TH0 = 0xFC;
- TL0 = 0xF6;
- ET0 = 1; //Timer0 interrupt enable
- TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí)
- }
- void Interrupt_Timer0() interrupt 1
- {
- B_1ms = 1; //1ms掃描顯示一位
- IR_RX_NEC(); //掃描紅外遙控
- }
- void main()
- {
- bit error;
- GPIO();
- DisableHC595(); //禁止掉學(xué)習(xí)板上的HC595顯示,省電
- Timer0Init();EA=1;
- lcdinit(); //初始化
- lcd_cls(); //清屏
- init_ClockCirle(); //畫(huà)出表盤
- ReadRTC();
- error = 1; //初始化默認(rèn)更改時(shí)間
- if(RTC_Time_Now.second >= 60) error = 1; //錯(cuò)誤
- if(RTC_Time_Now.minute >= 60) error = 1; //錯(cuò)誤
- if(RTC_Time_Now.hour >= 24) error = 1; //錯(cuò)誤
- if(error) //有錯(cuò)誤, 默認(rèn)12:00:00
- {
- RTC_Time_Now.second = 58;RTC_Time_Now.minute = 59;RTC_Time_Now.hour = 22; //更改為2016-5-18
- More_Time.day = 18;More_Time.week = 2;More_Time.month = 5 ;More_Time.year = 16; // 22:59:58
- WriteRTC(); //寫(xiě)入時(shí)間到PCF8563
- }
- while(1)
- { //根據(jù)接收到的鍵值 對(duì)時(shí)間進(jìn)行改變
- AutoTime();
- if(B_1ms) //1ms到
- {
- B_1ms = 0;
- if(B_IR_Press) //檢測(cè)到收到紅外鍵碼
- {
- B_IR_Press = 0;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
IIC以及萬(wàn)年歷.zip
(106.44 KB, 下載次數(shù): 129)
2018-6-3 13:57 上傳
點(diǎn)擊文件名下載附件
簡(jiǎn)單的萬(wàn)年歷
|
|