📄 pcf8563.c
字号:
#include <c8051f020.h>
#include"I2C.H"
#include "KS0108.H"
//------------------------------------------------------------------------------------
// Global CONSTANTS
//------------------------------------------------------------------------------------
#define PCF8563 0xa2
typedef union
{
unsigned char Clock[7];
struct RealClock
{
unsigned char Year,Month,Week,Day,Hour,Minute,Second;
} RT;
} SZ;
SZ xdata RealTime;
unsigned char code t_initab[16] = { 0x00,0x00,0x50,0x56,0x14,0x09,0x01,0x07,
0x07,0x80,0x80,0x80,0x80,0x00,0x00,0x5a
};//定义为2006年1月1日 星期三00:00:59,控制寄存器的命令
unsigned char code Pinbi_tab[7] = { 0xff,0x7f,0x3f,0x3f,0x07,0x9f,0xff };
//屏蔽所读取的时钟的无效位码表
/*=========================================
实时时钟PCF8563 初始化子函数
==========================================*/
void Pcf8563_Init(void)
{
unsigned char temp;
while (SM_BUSY);
SM_BUSY = 1;
SMB0CN = 0x44; //SMBus0允许,在应答周期内返回“确认”应答
COMMAND = ( PCF8563 | READ );
HIGH_ADD= 0x02;
Attrib = 0;
NByte = 1;
I2CDataBuff = &temp;
STA = 1; //当作为主器件时,若总线空闲,则发出一个起始条件
while ( SM_BUSY );
if( temp & 0x80 )
{
COMMAND = ( PCF8563 | WRITE );
HIGH_ADD= 0x00;
Attrib = 0;
NByte = 16;
I2CDataBuff = t_initab;
STA = 1;
}
}
void Read_times(void)
{
unsigned char i,j;
while (SM_BUSY);
SM_BUSY = 1;
SMB0CN = 0x44;
COMMAND = ( PCF8563 | READ );
HIGH_ADD= 0x02;
Attrib = 0;
NByte = 7;
I2CDataBuff = RealTime.Clock;
STA = 1;
while (SM_BUSY);
for( i=0;i<7;i++ )
RealTime.Clock[i]&=Pinbi_tab[i];
for( i=0;i<3;i++ )
{
j = RealTime.Clock[i];
RealTime.Clock[i] = RealTime.Clock[6-i];
RealTime.Clock[6-i] = j;
}
}
void TestI2C (void)
{
SMBus0_Init();
SM_BUSY = 0;
Pcf8563_Init();
InitLCD();
Display(0,0,"www.ecoa.com");
for (;;)
{
Read_times();
LCD_DispChar(0,2,((RealTime.RT.Hour>>4)&0x0f)+0x30);//(RealTime.RT.Hour>>4)&0x0f); //128*64 取值x=0-128 y=0-8
LCD_DispChar(8,2,(RealTime.RT.Hour&0x0f)+0x30);
LCD_DispChar(16,2,':');
LCD_DispChar(24,2,((RealTime.RT.Minute>>4)&0x0f)+0x30);
LCD_DispChar(32,2,(RealTime.RT.Minute&0x0f)+0x30);
LCD_DispChar(40,2,':');
LCD_DispChar(48,2,((RealTime.RT.Second>>4)&0x0f)+0x30);
LCD_DispChar(56,2,(RealTime.RT.Second&0x0f)+0x30);
//在0,4处显示02/01/01
LCD_DispChar(0,4,((RealTime.RT.Year>>4)&0x0f)+0x30);
LCD_DispChar(8,4,(RealTime.RT.Year&0x0f)+0x30);
LCD_DispChar(16,4,'/');
LCD_DispChar(24,4,((RealTime.RT.Month>>4)&0x0f)+0x30);
LCD_DispChar(32,4,(RealTime.RT.Month&0x0f)+0x30);
LCD_DispChar(40,4,'/');
LCD_DispChar(48,4,((RealTime.RT.Day>>4)&0x0f)+0x30);
LCD_DispChar(56,4,(RealTime.RT.Day&0x0f)+0x30);
Delay1ms(500);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -