3036|0

10

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

求大神看看这个pcf8563程序 [复制链接]

之前还发了个ds1337的程序,    这个是pcf8563的程序,请问一下怎么调用啊?能否每秒rtc向单片机发送中断
又怎么初始化?
c:/***IAR环境编译,直接把这个文件包括进去,然后调用里边的函数就可以用***/
#include "config.h"
#include "PCF8563.h"
//extern uchar xdata TX_buf[50];
extern void Hard_Uart_SendByteB(uint8 x);

uint8 g8563_Store[6] = {0,0,0,0,0,0}; /*时间交换区,全局变量声明*/
uint8 g8563_Write[6] = {0,0,0,0,0,0}; /*时间交换区,全局变量声明*/
uint8 c8563_Store[6]={0x10,0x09,0x18,0x10,0x40,0x00}; /*写入时间初值:星期一 07:59:00*/

/********************************************
内部函数,延时1
********************************************/
void Delay(uint8 i)
{
        while(i--)
        {
                __delay_cycles(1);/*根据晶振频率制定延时时间*/
        }
}
/********************************************
内部函数,I2C开始
********************************************/
void Start()
{
      //  _CLI();
        _WDR();
        PCF8563T_SDA_ON;
        Delay(4);
        PCF8563T_SCL_ON;
        Delay(8);
        PCF8563T_SDA_OFF;
        Delay(4);
        PCF8563T_SCL_OFF;
        Delay(4);
        _WDR();
}
/********************************************
内部函数,I2C结束
********************************************/
void Stop()
{
        _WDR();
        PCF8563T_SCL_OFF;
        Delay(4);
        PCF8563T_SDA_OFF;
        Delay(8);
        PCF8563T_SCL_ON;
        Delay(4);
        PCF8563T_SDA_ON;
        Delay(4);
        _WDR();
        //_SEI();
}
/********************************************
内部函数,输出ACK ,每个字节传输完成,输出ack=0,结束读书据,ack=1;
********************************************/
void WriteACK(uint8 ack)
{
        _WDR();
        if(ack)
                PCF8563T_SDA_ON;
        else
                PCF8563T_SDA_OFF;
        Delay(4);
        PCF8563T_SCL_ON;
        Delay(4);
        PCF8563T_SCL_OFF;
        _WDR();
}
/********************************************
内部函数,等待ACK
********************************************/
void WaitACK()
{  
        uint8 errtime = 50;
        //PCF8563T_SDA_ON;
       // Delay(4); /*读ACK*/
        PCF8563T_DAT_PIN;
        PCF8563T_SCL_ON;
        Delay(4);
        while(PCF8563T_SDA_PIN)
        {  
            errtime--;
            if(!errtime)
               Stop();
        }
        PCF8563T_SCL_OFF;
        PCF8563T_DAT_POUT;  //改变数据线端口方向为输出状态
}
/********************************************
内部函数.输出数据字节
入口:B=数据
********************************************/
void writebyte(uint8 wdata)
{
        uint8 i;
        _WDR();
        for(i=0;i<8;i++)
        {
            if(wdata&0x80)
               PCF8563T_SDA_ON;
            else
               PCF8563T_SDA_OFF;
            wdata <<= 1;
            PCF8563T_SCL_ON;
            Delay(4);
            PCF8563T_SCL_OFF;
        }
        WaitACK();     //I2C器件或通讯出错,将会退出I2C通讯
        _WDR();
}
/********************************************
内部函数.输入数据
出口:B
********************************************/
uint8 Readbyte()
{
        uint8 i = 0;
        uint8 bytedata = 0;
        PCF8563T_DAT_PIN;
        Delay(8);
        for(i=0;i<8;i++)
        {
                PCF8563T_SCL_ON;  
                bytedata<<=1;
                bytedata |= ((PINA&0x08)>>3);
                PCF8563T_SCL_OFF;
                Delay(4);
        }
        PCF8563T_DAT_POUT;
        return(bytedata);
}
/********************************************
输出数据->pcf8563
********************************************/
void writeData(uint8 address,uint8 mdata)
{
        Start();
        writebyte(0xa2); /*写命令*/
        writebyte(address); /*写地址*/
        writebyte(mdata); /*写数据*/
        Stop();
}
/********************************************
输入数据<-pcf8563
********************************************/
uint8 ReadData(uint8 address) /*单字节*/
{  
        uint8 rdata = 0;
        Start();
        writebyte(0xa2); /*写命令*/
        writebyte(address); /*写地址*/
        Start();
        writebyte(0xa3); /*读命令*/
        rdata=Readbyte();
        WriteACK(1);
        Stop();
        return(rdata);
}
void ReadData1(uint8 address,uint8 count,uint8 * buff) /*多字节*/
{  
        uint8 i;
        Start();
        writebyte(0xa2); /*写命令*/
        writebyte(address); /*写地址*/
        Start();
        writebyte(0xa3); /*读命令*/
        for(i=0;i         {
                buff[i]=Readbyte();
                if(i         }
        WriteACK(1);
        Stop();
}  
/********************************************
内部函数,读入时间到内部缓冲区
********************************************/
void P8563_Read()
{   
        uint8 time[7] = {0,0,0,0,0,0,0};
        _WDR();
        ReadData1(0x02,0x07,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[5]&0x1f; /*月 */
        g8563_Store[5]=time[6]; /*年  */
        _WDR();
        /*PORTA |= (1<         Hard_Uart_SendByteB(g8563_Store[5]);
        __delay_cycles(10000);__delay_cycles(10000);
        Hard_Uart_SendByteB(g8563_Store[4]);
        __delay_cycles(10000);__delay_cycles(10000);
        Hard_Uart_SendByteB(g8563_Store[3]);
        __delay_cycles(10000);__delay_cycles(10000);
        Hard_Uart_SendByteB(g8563_Store[2]);
        __delay_cycles(10000);__delay_cycles(10000);
        Hard_Uart_SendByteB(g8563_Store[1]);
        __delay_cycles(10000);__delay_cycles(10000);
        Hard_Uart_SendByteB(g8563_Store[0]);
        __delay_cycles(10000);__delay_cycles(10000);__delay_cycles(10000);
         PORTA &= ~(1< }
/********************************************
读入时间到内部缓冲区----外部调用
********************************************/
void P8563_gettime()
{   
        //_CLI();
        _WDR();
        P8563_Read();
        if(g8563_Store[0]==0)
                P8563_Read(); /*如果为秒=0,为防止时间变化,再读一次*/
        _WDR();
        //_SEI();
}       
/********************************************
写时间修改值
********************************************/
void P8563_settime()        //设置时间
{
        ///_CLI();
        _WDR();
        writeData(8,g8563_Write[0]); //年
        writeData(7,g8563_Write[1]); //月
        writeData(5,g8563_Write[2]); //日
        writeData(4,g8563_Write[3]); //时
           writeData(3,g8563_Write[4]); //分  
        writeData(2,g8563_Write[5]); //秒
        _WDR();
        //_SEI();
}
/********************************************
P8563的初始化-----外部调用
********************************************/
void P8563_init()
{
       // uint8 i;
        //for(i=0;i<=5;i++) g8563_Write[i]=c8563_Store[i]; /*初始化时间*/
        //        P8563_settime();  

}





h:/*********************函数声明***************************************/
void P8563_init() ;
void P8563_gettime();

/****************PCF8563 I2C接口定义*****************/
#define PCF8563T_SDA_ON      PORTA|=0x08       //i2c数据线高电平
#define PCF8563T_SDA_OFF     PORTA&=~0x08      //i2c数据线底电平
#define PCF8563T_SCL_ON      PORTA|=0x04      //i2c数据线底电平
#define PCF8563T_SCL_OFF     PORTA&=~0x04      //i2c数据线底电平
#define PCF8563T_DAT_PIN     PORTA|=0x08;DDRA&=~0x08       //i2c数据线端口置为输入
#define PCF8563T_DAT_POUT    DDRA|=0x08        //i2c数据线端口置为输出
#define PCF8563T_SDA_PIN     (PINA&0x08)        //i2c数据线输入电平

/****************PCF8563 寄存器接口定义*****************/
#define PCF8563T_GET_ADR      0xA3              //PCF8563读统一地址
#define PCF8563T_SEND_ADR     0xA2              //PCF8563写统一地址
#define PCF8563T_SYS1         0x00              //PCF8563状态寄存器地址1
#define PCF8563T_SYS2         0x01              //PCF8563状态寄存器地址2
#define PCF8563T_S            0x02              //秒
#define PCF8563T_MIN          0x03              //分
#define PCF8563T_OUR          0x04              //时
#define PCF8563T_DAT          0x05              //日
#define PCF8563T_             0x06              //星期
#define PCF8563T_MATH         0x07              //月
#define PCF8563T_YER          0x08              //年
#define PCF8563T_BJ1          0x09               //分钟报警
#define PCF8563T_BJ2          0x0A               //小时报警
#define PCF8563T_BJ3          0x0B               //日报警
#define PCF8563T_BJ4          0x0C               //星期报警
#define PCF8563T_CLK          0x0D              //时钟测试
#define PCF8563T_CT           0x0E              //定时器工作方式
#define PCF8563T_COUNT        0x0F              //定时器工作方式




pcf。c。bak是什么:#include "config.h"
#include "PCF8563.h"
//extern uchar xdata TX_buf[50];
extern void Hard_Uart_SendByteB(uint8 x);

uint8 g8563_Store[6] = {0,0,0,0,0,0}; /*时间交换区,全局变量声明*/
uint8 g8563_Write[6] = {0,0,0,0,0,0}; /*时间交换区,全局变量声明*/
uint8 c8563_Store[6]={0x10,0x09,0x18,0x10,0x40,0x00}; /*写入时间初值:星期一 07:59:00*/

/********************************************
内部函数,延时1
********************************************/
void Delay(uint8 i)
{
        while(i--)
        {
                __delay_cycles(1);/*根据晶振频率制定延时时间*/
        }
}
/********************************************
内部函数,I2C开始
********************************************/
void Start()
{
      //  _CLI();
        _WDR();
        PCF8563T_SDA_ON;
        Delay(4);
        PCF8563T_SCL_ON;
        Delay(8);
        PCF8563T_SDA_OFF;
        Delay(4);
        PCF8563T_SCL_OFF;
        Delay(4);
        _WDR();
}
/********************************************
内部函数,I2C结束
********************************************/
void Stop()
{
        _WDR();
        PCF8563T_SCL_OFF;
        Delay(4);
        PCF8563T_SDA_OFF;
        Delay(8);
        PCF8563T_SCL_ON;
        Delay(4);
        PCF8563T_SDA_ON;
        Delay(4);
        _WDR();
        //_SEI();
}
/********************************************
内部函数,输出ACK ,每个字节传输完成,输出ack=0,结束读书据,ack=1;
********************************************/
void WriteACK(uint8 ack)
{
        _WDR();
        if(ack)
                PCF8563T_SDA_ON;
        else
                PCF8563T_SDA_OFF;
        Delay(4);
        PCF8563T_SCL_ON;
        Delay(4);
        PCF8563T_SCL_OFF;
        _WDR();
}
/********************************************
内部函数,等待ACK
********************************************/
void WaitACK()
{  
        uint8 errtime = 50;
        //PCF8563T_SDA_ON;
       // Delay(4); /*读ACK*/
        PCF8563T_DAT_PIN;
        PCF8563T_SCL_ON;
        Delay(4);
        while(PCF8563T_SDA_PIN)
        {  
            errtime--;
            if(!errtime)
               Stop();
        }
        PCF8563T_SCL_OFF;
        PCF8563T_DAT_POUT;  //改变数据线端口方向为输出状态
}
/********************************************
内部函数.输出数据字节
入口:B=数据
********************************************/
void writebyte(uint8 wdata)
{
        uint8 i;
        _WDR();
        for(i=0;i<8;i++)
        {
            if(wdata&0x80)
               PCF8563T_SDA_ON;
            else
               PCF8563T_SDA_OFF;
            wdata <<= 1;
            PCF8563T_SCL_ON;
            Delay(4);
            PCF8563T_SCL_OFF;
        }
        WaitACK();     //I2C器件或通讯出错,将会退出I2C通讯
        _WDR();
}
/********************************************
内部函数.输入数据
出口:B
********************************************/
uint8 Readbyte()
{
        uint8 i = 0;
        uint8 bytedata = 0;
        PCF8563T_DAT_PIN;
        Delay(8);
        for(i=0;i<8;i++)
        {
                PCF8563T_SCL_ON;  
                bytedata<<=1;
                bytedata |= ((PINA&0x08)>>3);
                PCF8563T_SCL_OFF;
                Delay(4);
        }
        PCF8563T_DAT_POUT;
        return(bytedata);
}
/********************************************
输出数据->pcf8563
********************************************/
void writeData(uint8 address,uint8 mdata)
{
        Start();
        writebyte(0xa2); /*写命令*/
        writebyte(address); /*写地址*/
        writebyte(mdata); /*写数据*/
        Stop();
}
/********************************************
输入数据<-pcf8563
********************************************/
uint8 ReadData(uint8 address) /*单字节*/
{  
        uint8 rdata = 0;
        Start();
        writebyte(0xa2); /*写命令*/
        writebyte(address); /*写地址*/
        Start();
        writebyte(0xa3); /*读命令*/
        rdata=Readbyte();
        WriteACK(1);
        Stop();
        return(rdata);
}
void ReadData1(uint8 address,uint8 count,uint8 * buff) /*多字节*/
{  
        uint8 i;
        Start();
        writebyte(0xa2); /*写命令*/
        writebyte(address); /*写地址*/
        Start();
        writebyte(0xa3); /*读命令*/
        for(i=0;i         {
                buff[i]=Readbyte();
                if(i         }
        WriteACK(1);
        Stop();
}  
/********************************************
内部函数,读入时间到内部缓冲区
********************************************/
void P8563_Read()
{   
        uint8 time[7] = {0,0,0,0,0,0,0};
        _WDR();
        ReadData1(0x02,0x07,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[5]&0x1f; /*月 */
        g8563_Store[5]=time[6]; /*年  */
        _WDR();
        /*PORTA |= (1<         Hard_Uart_SendByteB(g8563_Store[5]);
        __delay_cycles(10000);__delay_cycles(10000);
        Hard_Uart_SendByteB(g8563_Store[4]);
        __delay_cycles(10000);__delay_cycles(10000);
        Hard_Uart_SendByteB(g8563_Store[3]);
        __delay_cycles(10000);__delay_cycles(10000);
        Hard_Uart_SendByteB(g8563_Store[2]);
        __delay_cycles(10000);__delay_cycles(10000);
        Hard_Uart_SendByteB(g8563_Store[1]);
        __delay_cycles(10000);__delay_cycles(10000);
        Hard_Uart_SendByteB(g8563_Store[0]);
        __delay_cycles(10000);__delay_cycles(10000);__delay_cycles(10000);
         PORTA &= ~(1< }
/********************************************
读入时间到内部缓冲区----外部调用
********************************************/
void P8563_gettime()
{   
        //_CLI();
        _WDR();
        P8563_Read();
        if(g8563_Store[0]==0)
                P8563_Read(); /*如果为秒=0,为防止时间变化,再读一次*/
        _WDR();
        //_SEI();
}       
/********************************************
写时间修改值
********************************************/
void P8563_settime()        //设置时间
{
        ///_CLI();
        _WDR();
        writeData(8,g8563_Write[0]); //年
        writeData(7,g8563_Write[1]); //月
        writeData(5,g8563_Write[2]); //日
        writeData(4,g8563_Write[3]); //时
           writeData(3,g8563_Write[4]); //分  
        writeData(2,g8563_Write[5]); //秒
        _WDR();
        //_SEI();
}
/********************************************
P8563的初始化-----外部调用
********************************************/
void P8563_init()
{
       // uint8 i;
        //for(i=0;i<=5;i++) g8563_Write[i]=c8563_Store[i]; /*初始化时间*/
        //        P8563_settime();  

}
 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表