#include "pcf_8563.h"
/***********************************全局变量******************************/
extern unsigned char date_time[6];
/****************************************************************************
函数功能:BCD码转换
入口参数:
出口参数:
****************************************************************************/
unsigned char _BCD(unsigned char input)
{
unsigned char temp,result1=0;
temp=input/10;
result1|=(temp<<4);
temp=input%10;
temp&=(0x0f);
result1|=temp;
return result1;
}
/****************************************************************************
函数功能:BCD码转换
入口参数:
出口参数:
****************************************************************************/
unsigned char BCD_(unsigned char input)
{
unsigned char temp,result1;
result1=0;
temp=(input>>4)*10;
result1=temp+(input&0x0f);
return result1;
}
/****************************************************************************
函数功能:TWI初始化函数
入口参数:
出口参数:
****************************************************************************/
void twi_init(void)
{
TWCR= 0X00; //disable twi
TWBR= 0x00; //set bit rate
TWSR= 0x00; //set prescale
TWAR= 0x02; //set slave address
TWCR= 0x44; //enable twi
}
/****************************************************************************
函数功能:指定地址写数据
入口参数:ad=地址,da=数据
出口参数:
****************************************************************************/
void IICWrite(unsigned char ad,unsigned char da)
{
//unsigned int t;
IIC_Start();
IIC_Wait();
TWDR = OP_WRITE; //控制地址
IIC_NoneAck();
IIC_Wait();
TWDR = ad ; //地址字节高位
IIC_NoneAck();
IIC_Wait();
TWDR = da; //数据
IIC_NoneAck();
IIC_Wait();
IIC_Stop();
}
/****************************************************************************
函数功能:指定地址读数据
入口参数:ad=地址
出口参数:
****************************************************************************/
unsigned char IICRead(unsigned char ad)
{
unsigned char data;
IIC_Start();
IIC_Wait();
TWDR =OP_WRITE; //控制地址
IIC_NoneAck();
IIC_Wait();
TWDR = ad ; //地址字节高位
IIC_NoneAck();
IIC_Wait();
IIC_Start();
IIC_Wait();
TWDR = OP_READ ;
IIC_NoneAck();
IIC_Wait();
IIC_NoneAck();
IIC_Wait();
data = TWDR;
IIC_Stop();
return data;
}
/****************************************************************************
函数功能:8563操作子程序,包括写控制字和时间校准,转换成BCD码在程序中完成
入口参数:
出口参数:
****************************************************************************/
void initial_pcf_8563(unsigned char year,unsigned char month,unsigned char date,
unsigned char hour,unsigned char minute,unsigned char second)
{
IICWrite(0x00,0x20); //写控制字,寄存器锁定
IICWrite(0x02,_BCD(second)&0x7f); //写秒
IICWrite(0x03,_BCD(minute)); //写分钟
IICWrite(0x04,_BCD(hour)); //写小时
IICWrite(0x05,_BCD(date)); //写日期
IICWrite(0x07,_BCD(month)&0x7f); //写月
IICWrite(0x08,_BCD(year)); //写年
IICWrite(0x00,0x00); //写控制字,重新启动时钟
}
/****************************************************************************
函数功能:读8563,返回BCD码数组
入口参数:
出口参数:
****************************************************************************/
void read_time(void)
{
date_time[0]=BCD_(IICRead(0x08));
date_time[1]=BCD_(IICRead(0x07)&0x1F);
date_time[2]=BCD_(IICRead(0x05)&0x3F);
date_time[3]=BCD_(IICRead(0x04)&0x3F);
date_time[4]=BCD_(IICRead(0x03)&0x7F);
date_time[5]=BCD_(IICRead(0x02)&0x7F);
}
/****************************************************************************
函数功能:显示时间
入口参数:
出口参数:second,minute,hour,day,month,year
****************************************************************************/
void display_time(void)
{
unsigned char i;
for(i=0;i<6;i++)
putchar0(date_time[i]);
}