addison 发表于 2008-4-1 22:17:20

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

请问版主,有没有PCF8563的驱动程序呀?想参考一下

cpubbs 发表于 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,TrmBuf,slvdevice;
uchar idata controlbuf={0x00,0x00};/*control register1 clock stop,register2*/
uchar idata timebuf=/*{0x59,0x59,0x23,0x24,0x06,0x04,0x03};*/{0x12,0x13,0x14,0x15,6,0x04,0x03};/*time register*/
uchar idata alarmbuf={0x80,0x80,0x80,0x80,0x83,0x00,0x00};/*alarm registers*/
uchar idata redata;
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;
                        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=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=I2cByteRead(slvdevice,addr2);/*主机将slave的0x55单元中的数据读入它的receive 内*/
           addr2++;
        }
        DelayX1ms(10);
        redata&=0X07;
        redata&=0X9F;
        goto again;
}

cpubbs 发表于 2008-4-1 22:37:50

:lol 希望是这个,呵呵!当时是参照别人的写的!

addison 发表于 2008-4-2 07:50:56

THANKS

谢谢版主,我在第一版加了8563,准备用它作时钟,看来和24C芯片的驱动差不多,关于8563时钟问题可能还要请教版主!呵呵
页: [1]
查看完整版本: 请问版主,有没有PCF8563的驱动程序呀?