cpubbs论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 5264|回复: 3

请问版主,有没有PCF8563的驱动程序呀?

[复制链接]
发表于 2008-4-1 22:17:20 | 显示全部楼层 |阅读模式
请问版主,有没有PCF8563的驱动程序呀?想参考一下
发表于 2008-4-1 22:37:03 | 显示全部楼层
我在大学的时候写过一个,不知道是不是这个:

#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define unit unsigned int
sbit ISCL=P1^3;
sbit ISDA=P1^2;
uchar idata sdata,rece[7],TrmBuf[16],slvdevice;
uchar idata controlbuf[2]={0x00,0x00};/*control register1 clock stop,register2*/
uchar idata timebuf[7]=/*{0x59,0x59,0x23,0x24,0x06,0x04,0x03};*/{0x12,0x13,0x14,0x15,6,0x04,0x03};/*time register*/
uchar idata alarmbuf[7]={0x80,0x80,0x80,0x80,0x83,0x00,0x00};/*alarm registers*/
uchar idata redata[7];
void I2cWait(void)/*I2CBUS等待*/
{
        _nop_();
        _nop_();
}

void DelayX1ms(unit count)/*延时XmS子程序*/
{
        unit i;
        uchar j;
        for(i=0;i<count;i++)
                for(j=0;j<110;j++);        
}

void I2cStart(void)/*I2CBUS起始信号*/
{       
        ISDA=1;
        ISCL=1;
        I2cWait();
        ISDA=0;
        I2cWait();
        ISCL=0;
}

void I2cStop(void) /*I2CBUS停止信号*/
{
        ISDA=0;
        I2cWait();
        ISCL=1;
        I2cWait();
        ISDA=1;
}

void I2cInit(void)/*I2CBUS初始化*/
{
        ISDA=1;
        ISCL=1;
}

bit slave_ack(void)/*I2CBUS应答信号*/
{
        bit ack;
        _nop_();_nop_();
        ISCL=0;
        _nop_();
        ISDA=1;
        _nop_();_nop_();
        ISCL=1;
        _nop_();_nop_();
        ack=ISDA;
        ISCL=0;
        return ack;
}

bit I2cSendByte(uchar bytedata)/*传送一个字节到slave*/
{
        uchar i;
        bit ack;
        for (i=0;i<8;i++)
        {
                if (bytedata&0x80)ISDA=1;
                 else ISDA=0;
                 bytedata<<=1;
                 ISCL=1;
                 I2cWait();
                 ISCL=0;
                 I2cWait();
        }
        ack=slave_ack();
        return ack;
}

uchar I2cReceiveByte(void) /*从slave接收一个字节*/
{
        uchar i,bytedata=0;
        for (i=0;i<8;i++)
                {
                         ISCL=1;
                         I2cWait();
                         bytedata<<=1;
                         if (ISDA) bytedata|=0x01;
                         ISCL=0;
                         I2cWait();
                }
        return bytedata;
}


void I2cSendAckmowledge(bit ack)/*传送确认信号至slave*/
{
        ISDA=ack;
        ISCL=1;
        I2cWait();
        ISCL=0;
}

void RETWDT(void)/*1161看门狗定时器复位*/
{
        ISDA=0;
        _nop_();
        ISDA=1;
}

void I2cByteWrite(uchar device,uchar address,uchar bytedata)/*主机将一字节数据写入指定slave地址中*/
{
        bit ack;
        I2cStart();
        resent1:I2cSendByte(device);
        if (ack==1)
                goto resent1;
        resent2:I2cSendByte(address);
        if (ack==1)
                goto resent2;
        resent3:I2cSendByte(bytedata);
        if (ack==1)
                goto resent3;
        I2cStop();
        DelayX1ms(10);
}

void I2c16ByteWrite(uchar device,uchar address)      /*the master send 16 bytes data to the slave*/
{
        bit ack;
        uchar j;
        I2cStart();
        resent4:I2cSendByte(device);
        if (ack==1)
                goto resent4;
        resent5:I2cSendByte(address);
        if (ack==1)
                goto resent5;
        for (j=0;j<16;j++)
                {
                        sdata = TrmBuf[j];
                        resent6:I2cSendByte(sdata);
                        if (ack==1)
                            goto resent6;
                }
        I2cStop();
        DelayX1ms(10);
}

uchar I2cByteRead(uchar device,uchar address)/*主机从指定slave地址中读一字节数据*/
{
        uchar ldata;
        bit ack;
        resent7:I2cStart();
        _nop_();
        if (ack==1)
                goto resent7;
        resent8:I2cSendByte(device);
        _nop_();
        if (ack==1)
                goto resent8;
        resent9:I2cSendByte(address);
        _nop_();
        if (ack==1)
                goto resent9;
        I2cStart();
        resent10:I2cSendByte(device|0x01);
        _nop_();
        if (ack==1)
                goto resent10;
        ldata=I2cReceiveByte();
        I2cSendAckmowledge(1);
        I2cStop();
        return ldata;
}


void I2c7ByteRead(uchar device,uchar address)/*主机从指定slave地址中读一字节数据*/
{
        uchar j;
        bit ack;
        I2cStart();
        resent11:I2cSendByte(device);
        if (ack==1)
                goto resent11;
        resent12:I2cSendByte(address);    /*here is added just now*/
        if (ack==1)
                goto resent12;
        for (j=0;j<7;j++)
                {
                        rece[j]=I2cReceiveByte();
                        _nop_();
                        if (j!=6)
                                I2cSendAckmowledge(0);
                }
        I2cSendAckmowledge(1);
        I2cStop();
}

void main (void)
{
        uchar idata send,receive,j;
        uchar idata addr1,addr2,addr3;
        uchar idata i,control1;
        again:
        I2cInit();  /*here should init the i2c bus--lwg*/
        slvdevice = 0xa2;
        addr1 =0x00;
        addr2 =0x02;
        addr3 =0x09;
       
        for (i=0;i<2;i++)/*send control bytes 1,2*/
        {       
                control1=controlbuf;
                I2cByteWrite(slvdevice,addr1,control1);
                addr1++;
        }
        for (i=0;i<7;i++)/*send timebuf*/
        {       
                control1=timebuf;
                I2cByteWrite(slvdevice,addr2,control1);
                addr2++;
        }
        for (i=0;i<7;i++)/*send alarmbuf*/
        {       
                control1=alarmbuf;
                I2cByteWrite(slvdevice,addr3,control1);
                addr3++;
        }

        addr2=0x02;
        for (j=0;j<7;j++)
        {
           redata[j]=I2cByteRead(slvdevice,addr2);/*主机将slave的0x55单元中的数据读入它的receive 内*/
           addr2++;
        }
        DelayX1ms(10);
        redata[4]&=0X07;
        redata[5]&=0X9F;
        goto again;
}
发表于 2008-4-1 22:37:50 | 显示全部楼层
希望是这个,呵呵!当时是参照别人的写的!
 楼主| 发表于 2008-4-2 07:50:56 | 显示全部楼层

THANKS

谢谢版主,我在第一版加了8563,准备用它作时钟,看来和24C芯片的驱动差不多,关于8563时钟问题可能还要请教版主!呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2025-4-7 14:57 , Processed in 0.796513 second(s), 6 queries , Gzip On, File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表