龙啸九天的标准IIC程序,PCF8563T
单片机源程序如下:
- /**————————————————————
- 2 〖说明〗I2C总线驱动程序(用两个普通IO模拟I2C总线)
- 3 包括100Khz(T=10us)的标准模式(慢速模式)选择,
- 4 和400Khz(T=2.5us)的快速模式选择,
- 5 默认11.0592Mhz的晶振。
- 9 〖版本〗V1.00A Build 0803
- 10 ————————————
- /**/
- #include <reg66x.h> /* special function registers */
- #include <INTRINS.H>
- #define uchar unsigned char
- #define uint unsigned int
- #define Byte unsigned char
- #define Word unsigned int
- #define bool bit
- #define true 1
- #define false 0
- uchar SystemError;
- #define SomeNOP() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- extern void delay(int n);
- /**--------------------------------------------------------------------------------
- 30 调用方式:void I2CStart(void) ﹫2001/07/0 4
- 31 函数说明:私有函数,I2C专用
- 32 ---------------------------------------------------------------------------------*/
- void I2CStart(void)
- {
- EA=0;
- SDA=1; SCL=1; SomeNOP();//INI
- SDA=0; SomeNOP(); //START
- SCL=0;
- }
- /**--------------------------------------------------------------------------------
- 42 调用方式:void I2CStop(void) ﹫2001/07/0 4
- 43 函数说明:私有函数,I2C专用
- 44 ---------------------------------------------------------------------------------*/
- void I2CStop(void)
- {
- SCL=0; SDA=0; SomeNOP(); //INI
- SCL=1; SomeNOP(); SDA=1; //STOP
- EA=1;
- }
- /**--------------------------------------------------------------------------------
- 53 调用方式:bit I2CAck(void) ﹫2001/07/0 4
- 54 函数说明:私有函数,I2C专用,等待从器件接收方的应答
- 55 ---------------------------------------------------------------------------------*/
- bool WaitAck(void)
- {
- uchar errtime=255;//因故障接收方无ACK,超时值为255。
- SDA=1;SomeNOP();
- SCL=1;SomeNOP();
- while(SDA) {errtime--; if (!errtime) {I2CStop();SystemError=0x11;return false;}}
- SCL=0;
- return true;
- //第1 页
- //文件: PCF8563T.C 2001-11-27, 18:39:20
- }
- /**--------------------------------------------------------------------------------
- 67 调用方式:void SendAck(void) ﹫2001/07/0 4
- 68 函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
- 69 ---------------------------------------------------------------------------------*/
- void SendAck(void)
- {
- SDA=0; SomeNOP();
- SCL=1; SomeNOP();
- SCL=0;
- }
- /**--------------------------------------------------------------------------------
- 78 调用方式:void SendAck(void) ﹫2001/07/0 4
- 79 函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
- 80 }**--------------------------------------------------------------------------------
- */
- void SendNotAck(void)
- {
- SDA=1; SomeNOP();
- SCL=1; SomeNOP();
- SCL=0;
- }
- /**--------------------------------------------------------------------------------
- 89 调用方式:void I2CSend(uchar ch) ﹫2001/07/0 5
- 90 函数说明:私有函数,I2C专用
- 91 ---------------------------------------------------------------------------------*/
- void I2CSendByte(Byte ch)
- {
- uchar i=8;
- while (i--)
- {
- SCL=0;_nop_();
- SDA=(bit)(ch&0x80); ch<<=1; SomeNOP();
- SCL=1; SomeNOP();
- }
- SCL=0;
- }
- /**--------------------------------------------------------------------------------
- 105 调用方式:uchar I2CReceive(void) ﹫2001/07/0 5
- 106 函数说明:私有函数,I2C专用
- 107 ---------------------------------------------------------------------------------*/
- Byte I2CReceiveByte(void)
- {
- uchar i=8;
- Byte ddata=0;
- SDA=1;
- while (i--)
- {
- ddata<<=1;
- SCL=0;SomeNOP();
- SCL=1;SomeNOP();
- ddata|=SDA;
- }
- SCL=0;
- return ddata;
- }
- //---------------------------------------------------------------------------
- //开始PCF8563T驱动程序
- //第2 页
- //文件: PCF8563T.C 2001-11-27, 18:39:20
- /**--------------------------------------------------------------------------------
- 128 调用方式:void GetPCF8563(uchar firsttype,uchar count,uchar *buff) ﹫2001/08/0 7
- 129 函数说明:读取时钟芯片PCF8563的时间,设置要读的第一个时间类型firsttype,并设置读取
- 130 的字节数,则会一次把时间读取到buff中。顺序是:
- 131 0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
- 132 ---------------------------------------------------------------------------------*/
- void GetPCF8563(uchar firsttype,uchar count,uchar *buff)
- {
- uchar i;
- I2CStart();
- I2CSendByte(0xA2);
- WaitAck();
- I2CSendByte(firsttype);
- WaitAck();
- I2CStart();
- I2CSendByte(0xA3);
- WaitAck();
- for (i=0;i<count;i++)
- {
- buff[i]=I2CReceiveByte();
- if (i!=count-1) SendAck();//除最后一个字节外,其他都要从MASTER发应答。
- }
- SendNotAck();
- I2CStop();
- }
- /**--------------------------------------------------------------------------------
- 158 调用方式:void SetPCF8563(uchar timetype,uchar value) ﹫2001/08/0 7
- 159 函数说明:调整时钟。timetype是要改的时间类型,value是新设置的时间值(BCD格式)。
- 160 0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
- 161 ---------------------------------------------------------------------------------*/
- void SetPCF8563(uchar timetype,uchar value)
- {
- I2CStart();
- I2CSendByte(0xA2);
- WaitAck();
- I2CSendByte(timetype);
- WaitAck();
- I2CSendByte(value);
- WaitAck();
- I2CStop();
- }
- /**--------------------------------------------------------------------------------
- 175 调用方式:void SetAlarmHour(uchar count) ﹫2001/08/0 7
- 176 函数说明:设置报警闹钟在一天的第count点报警。例如:count=23,则在晚上11点报警。
- 177 ---------------------------------------------------------------------------------
- void SetAlarm(uchar alarmtype,uchar count)
- {
- SetPCF8563(0x01,0x02);
- SetPCF8563(alarmtype,count);
- }
- */
- /**--------------------------------------------------------------------------------
- 85 调用方式:void CleanAlarm(void) ﹫2001/08/0 7
- 186 函数说明:清除所有报警设置。
- 187 ---------------------------------------------------------------------------------
- void CleanAlarm(void)
- {
- //第3 页
- //文件: PCF8563T.C 2001-11-27, 18:39:20
- SetPCF8563(0x01,0x00);
- SetPCF8563(0x09,0x80);
- SetPCF8563(0x0A,0x80);
- SetPCF8563(0x0B,0x80);
- SetPCF8563(0x0C,0x80);
- // SetPCF8563(0x0D,0x00);
- // SetPCF8563(0x0E,0x03);
- }
- */
- /*--------------------------------------------------------------------------------
- 201 调用方式:uchar read1380(uchar command )
- 202 函数说明:read1380()返回当前时间, command指要返回的时间类型。
- 203 秒:81H 分钟:83H 小时:85H 日期:87H 星期:89H 星期几:8BH 年:8D H
- 204 ---------------------------------------------------------------------------------*/
- // uchar read1380 (uchar command)
- // {
- // uchar time;
- // GetPCF8563(command,1,&time);
- // return time;
- // }
- //---------------------------------------------------------------------------
- //开始CAT1161驱动程序
- //第2 页
- //文件: CAT1161.C 2001-11-27, 18:39:20
- /**--------------------------------------------------------------------------------
- 128 调用方式:void GetCAT1161(uchar catadd,uchar count,uchar *buff) ﹫2001/08/0 7
- 129 函数说明:读取时钟芯片PCF8563的时间,设置要读的第一个时间类型firsttype,并设置读取
- 130 的字节数,则会一次把时间读取到buff中。顺序是:
- 131 0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
- 132 ---------------------------------------------------------------------------------
- void GetCAT1161(uchar catadd,uchar *buff)
- {
- // uchar i;
- I2CStart();
- I2CSendByte(0xA0);
- WaitAck();
- I2CSendByte(catadd);
- WaitAck();
- I2CStart();
- I2CSendByte(0xA1);
- WaitAck();
- I2CSendByte(catadd);
- WaitAck();
- // for (i=0;i<count;i++)
- // {
- *buff=I2CReceiveByte();
- // if (i!=count-1) SendAck();//除最后一个字节外,其他都要从MASTER发应答。
- // }
- SendNotAck();
- I2CStop();
- }
- /**--------------------------------------------------------------------------------
- 158 调用方式:void SetCAT1161(uchar timetype,uchar value) ﹫2001/08/0 7
- 159 函数说明:调整时钟。timetype是要改的时间类型,value是新设置的时间值(BCD格式)。
- 160 0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
- 161 ---------------------------------------------------------------------------------
- void SetCAT1161(uchar catadd,uchar value)
- {
- I2CStart();
- I2CSendByte(0xA0);
- WaitAck();
- I2CSendByte(catadd);
- WaitAck();
- I2CSendByte(value);
- WaitAck();
- I2CStop();
- }
- */
- //---------------------------------------------------------------------------
- //开始AT24C02驱动程序
- /**--------------------------------------------------------------------------------
- 128 调用方式:void AT24C02(uchar firstadd,uchar count,uchar *buff) ﹫2001/08/0 7
- 129 函数说明:
- 132 ---------------------------------------------------------------------------------*/
- void ReadAT24C02(uchar *buff)
- {
- unsigned char i=0;
- unsigned char nLen=26;
- I2CStart();
- I2CSendByte(0xA0);
- WaitAck();
- I2CSendByte(0x00); //ram的第一个地址
- WaitAck();
- I2CStart();
- I2CSendByte(0xA1);
- WaitAck();
- while(--nLen)
- {
- buff[i]=I2CReceiveByte(); //读出内容
- i++; //指针加1
- SendAck(); //发确认信号
- }
- buff[i]=I2CReceiveByte(); //读一字节
- SendNotAck(); //没有确认信号
- I2CStop();
- }
- /**--------------------------------------------------------------------------------
- 158 调用方式:void SetAT24C02(uchar firstadd,uchar count,uchar *buff) ﹫2005/12/28
- 159 函数说明:
- 161 ---------------------------------------------------------------------------------*/
- void WriteAT24C02(uchar *buff)
- {
- unsigned char i,temp,Addr;
- unsigned char k=0;
- unsigned char nLen=26;
- Addr=0x00;
- I2CStart();
- I2CSendByte(0xA0);
- WaitAck();
- I2CSendByte(Addr);
- WaitAck();
- for(i = 0;i < nLen;i++)
- {
- if(Addr%8==0) //每页8字节 //换页
- {
- I2CStop();
- delay(10000);
- SomeNOP();
- I2CStart();
- I2CSendByte(0xA0);
- WaitAck();
- I2CSendByte(Addr);
- WaitAck();
- }
- temp = buff[k];
- I2CSendByte(temp);
- WaitAck();
- k++;
- Addr++;
- }
- I2CStop();
- }
复制代码
以上程序51hei提供下载:
pcf8563t.rar
(2.37 KB, 下载次数: 92)
|