標(biāo)題:
LCD12864和PCF8563 IIC總線(萬年歷)顯示時(shí)間的單片機(jī)源碼
[打印本頁]
作者:
biaji
時(shí)間:
2018-6-3 13:58
標(biāo)題:
LCD12864和PCF8563 IIC總線(萬年歷)顯示時(shí)間的單片機(jī)源碼
剛學(xué)51單片機(jī)IIC以及萬年歷的源碼
下面直接放東西,就是個(gè)簡單的萬年歷,請各位大神指教
0.png
(47.63 KB, 下載次數(shù): 72)
下載附件
2018-6-4 02:48 上傳
單片機(jī)源程序如下:
/*
LCD12864和PCF8563顯示時(shí)間 !!!
徐逸夫
2016-5-16 ~ 5-18
*/
/* 如果要在程序中使用此代碼,請?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);
}
/********************** 寫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);//畫圓 圓心坐標(biāo)(32,32) 半徑31,空心圓
for(i=0;i<60;i++)
{
if((i%5)==0) //畫刻度
{
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í)分秒
*注: 秒針長24 分針長17 秒針長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開始計(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(); //畫出表盤
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(); //寫入時(shí)間到PCF8563
}
while(1)
{ //根據(jù)接收到的鍵值 對時(shí)間進(jìn)行改變
AutoTime();
if(B_1ms) //1ms到
{
B_1ms = 0;
if(B_IR_Press) //檢測到收到紅外鍵碼
{
B_IR_Press = 0;
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
IIC以及萬年歷.zip
(106.44 KB, 下載次數(shù): 129)
2018-6-3 13:57 上傳
點(diǎn)擊文件名下載附件
簡單的萬年歷
下載積分: 黑幣 -5
作者:
zxy2266
時(shí)間:
2020-3-1 12:35
PCF8563就是595的程序吧,我一直在找這個(gè)
作者:
chinarenxx
時(shí)間:
2020-3-28 16:44
剛好有個(gè)8583的時(shí)鐘芯片,下載來試試看學(xué)習(xí)下。
作者:
maijinzhi
時(shí)間:
2020-3-28 22:18
剛好有個(gè)8583的時(shí)鐘芯片,學(xué)習(xí)下。
作者:
2541959167
時(shí)間:
2020-12-7 16:06
剛好用到,感謝大佬
作者:
小強(qiáng)快跑
時(shí)間:
2022-2-18 03:39
硬件i2c oled pcf 8563
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1