📄 pcf8563.c
字号:
#include"PCF8563.h"
#include "Flash.h"
#include"array.h"
//Time SysTime;//系统时间。
//Time NewTime;//更新使用的缓冲区,在设置时间是使用
unsigned char g8563_store[7];
const uchar c8563_Store[7]={0x00,0x59,0x07,0x01};
void Init_Clk()
{
CLKSCL_OUT; //CLK为输出状态
CLKSDA_OUT;
CLKSDA_1;
CLKSCL_1;
}
void P8563_init()
{
if((receive_CFGbyte(HOUR_ALARM)&0X3F)!=0x00) /*检查是否第一次启动,是则初始化时间*/
{
msDelay(5000);
write_CFGbyte(0x00,0x00);
write_CFGbyte(HOUR_ALARM ,0x00); /*小时报警*/
write_CFGbyte(MIN_ALARM ,0x05); /*分钟报警*///(正式工作程序)
//write_CFGbyte(MIN_ALARM ,0x81); //测试工作程序
//write_CFGbyte(MIN_ALARM ,0x05); //测试
write_CFGbyte(0x01,0x12); /*报警有效*/
write_CFGbyte(0x02,0x50);
write_CFGbyte(0x03,0x30);
write_CFGbyte(0x04,0x23);
write_CFGbyte(0x05,0x01);
write_CFGbyte(0x06,0x01);
write_CFGbyte(0x07,0x01);
write_CFGbyte(0x08,0x01);
write_CFGbyte(0x0d,0x00);
//write_CFGbyte(0x0d,0xf0);
}
}
void P8563_Readtime()
{
unsigned char time[7];
Read_buffclk(MIN,7,time);
g8563_store[0]=time[0]&0x7f; /*秒*/
g8563_store[1]=time[1]&0x7f; /*分*/
g8563_store[2]=time[2]&0X3f; /*小时*/
g8563_store[3]=time[3]&0x3f; /*天*/
g8563_store[4]=time[4]&0x07; /*星期*/
g8563_store[5]=time[5]&0x1f; /*月*/
g8563_store[6]=time[6]; /*年*/
}
void iic_start(void)
{
CLKSDA_OUT;
CLKSDA_1; //将数据置1
CLKSCL_1;
NOP10;
CLKSDA_0; //启动
NOP2;
CLKSCL_0; //clk start
NOP8;
}
// 函数名称: iic_stop()
// 函数功能: 停止I2C总线数据传送子程序
void iic_stop(void)
{
CLKSDA_OUT;
CLKSCL_1;
CLKSDA_0;
NOP8;
CLKSDA_1;
}
void iic_NoAcknowledge(void)
{
CLKSDA_1;
CLKSCL_1;
NOP10;
CLKSDA_0;
CLKSCL_0;
}
void iic_Acknowledge(void)
{
CLKSCL_0;
NOP10;
CLKSDA_OUT;
CLKSDA_0;
CLKSCL_1;
NOP10;
CLKSCL_0;
}
void iic_ReceiveAck(void) //送回应脉冲
{
uchar i = 0;
CLKSDA_1;
CLKSDA_IN;
CLKSCL_1;
NOP4;
while (CLKSDA_VAL&& (i < 100))i++;
CLKSCL_0;
NOP8;
}
void IICSendByte( uchar writedata)
{
uchar i;
CLKSDA_OUT;
NOP4;
for(i=0; i<8; i++)
{
if (writedata & BIT7)
{CLKSDA_1;}
else
{CLKSDA_0;};
writedata <<= 1;
CLKSCL_1;
NOP10;
CLKSCL_0;
NOP10;
}
}
//--------------------------------------------------------------------------------------------------
// 函数名称: IICreceiveByte
// 返回接收的数据
// 函数功能: 接收一字节子程序
//--------------------------------------------------------------------------------------------------
uchar IICreceiveByte(void)
{
uchar i,tempdata=0;
CLKSDA_1;
CLKSDA_IN;
for (i=0; i<8; i++)
{
CLKSCL_1;
NOP10;
tempdata <<= 1;
if (CLKSDA_VAL)
tempdata |= 1;
CLKSCL_0;
NOP10;
}
return tempdata;
}
// 用户调用子程序
// 函数名称: write_CFGbyte
// 入口参数: CFG_add寄存器地址,CFG_data要写入寄存器的数值
// 函数功能: 发送n位数据子程序
//--------------------------------------------------------------------------------------------------
void write_CFGbyte(uchar addr,uchar data)
{
iic_start();
IICSendByte(WRITE_ADD); //写地址
iic_ReceiveAck();
IICSendByte(addr); //写低地址
iic_ReceiveAck();
IICSendByte(data);
iic_ReceiveAck();
iic_stop();
Delay(4800);
}
//--------------------------------------------------- ----------------------------------------------
// 用户调用子程序
// 函数名称: receiveNbyte
// 入口参数: CFG_add寄存器地址地址
// 出口参数: receive_da
// 函数功能: 接收某个寄存器数据子程序
//--------------------------------------------------------------------------------------------------
uchar receive_CFGbyte(uchar addr)
{
uchar tempdata;
iic_start();
IICSendByte(WRITE_ADD); //写地址
iic_ReceiveAck();
IICSendByte(addr); //写低地址
iic_ReceiveAck();
iic_start();
IICSendByte(READ_ADD); //读地址
iic_ReceiveAck();
tempdata = IICreceiveByte();
iic_stop();
Delay(4800);
return tempdata;
}
//写一组数据到IIC中
/***
void Write_buffclk(uchar addr, uchar len,uchar * buff)
{
uchar idx;
iic_start();
IICSendByte(WRITE_ADD); //写地址
iic_ReceiveAck();
IICSendByte(addr); //写低地址
iic_ReceiveAck();
for (idx=0;idx< len;idx++)
{
IICSendByte(buff[idx]);
iic_ReceiveAck();
}
iic_stop();
Delay(4800);
}
***/
//读一组数据到存储区
void Read_buffclk(uchar addr, uchar len,uchar * buff)
{
uchar idx;
for(idx=0;idx<len;idx++)
{
buff[idx]= receive_CFGbyte(addr++);
Delay(100);
}
}
//--------------------------------------------------------------------------------------------------
// 用户调用函数
// 函数名称: P8563_Readtime
// 函数功能: 读出时间信息
//--------------------------------------------------------------------------------------------------
/***设置时间的子程序*******/
/**
void P8563_settime()
{
unsigned char i;
for(i=2;i<=4;i++) { write_CFGbyte(i,g8563_store[i-2]); }
write_CFGbyte(6,0X01);
//write_CFGbyte(6,g8563_store[3]);
}
****/
//时间的格式为 44个字节
void ReadTimeDate(uchar *str) //读取的时间格式 ,通过短信格式发送出去
{
uchar i,nChar;
uchar *buff;
buff =str;
P8563_Readtime();
nChar =((g8563_store[5]>>4)&0x0f)*4;
g8563_store[5]=(g8563_store[5]&0x0f)*4;
for(i=0;i<4;i++)
buff[i]=row43[nChar+i];
for(i=0;i<4;i++)
buff[i+4]=row43[g8563_store[5]+i];
for(i=0;i<4;i++)
buff[i+8]=row40[i];
nChar =((g8563_store[3]>>4)&0x0f)*4;
g8563_store[3]=(g8563_store[3]&0x0f)*4;
for(i=0;i<4;i++)
buff[i+12]=row43[nChar+i];
for(i=0;i<4;i++)
buff[i+16]=row43[g8563_store[3]+i];
for(i=0;i<4;i++)
buff[i+20]=row40[i];
nChar =((g8563_store[2]>>4)&0x0f)*4;
g8563_store[2]=(g8563_store[2]&0x0f)*4;
for(i=0;i<4;i++)
buff[i+24]=row43[nChar+i];
for(i=0;i<4;i++)
buff[i+28]=row43[g8563_store[2]+i];
for(i=0;i<4;i++)
buff[i+32]=row42[i];
nChar =((g8563_store[1]>>4)&0x0f)*4;
g8563_store[1]=(g8563_store[1]&0x0f)*4;
for(i=0;i<4;i++)
buff[i+36]=row43[nChar+i];
for(i=0;i<4;i++)
buff[i+40]=row43[g8563_store[1]+i];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -