AT24C02的读写程序,24C02 read / write process
关键字:AT24C02的读写程序
AT24C02的读写程序
#include #include #include "INTRINS.H" #define uchar unsigned char #define _NOP_() _nop_() /***************************************************************************/ #define WriteDeviceAddress 0xa0 /*24c02的写地址*/ #define ReadDviceAddress 0xa1 /*24c02的读地址*/ /***************************************************************************/ sbit SCL=P1^6; sbit SDA=P1^7; sbit P1_5=P1^5; sbit P1_4=P1^4; sbit P1_3=P1^3; sbit P1_2=P1^2; unsigned char code table[]={0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01}; unsigned char table1[8]; /*********************延时程序*******************************************/ void DelayMs(unsigned int number) { unsigned char temp; for(;number!=0;number--) { for(temp=112;temp!=0;temp--); } }
/*************************************************************************** ***************************24c02开始程序************************************ ***************************************************************************/ void Start() { SDA=1; SCL=1; SDA=0; SCL=0; } /*************************************************************************** ***************************24c02停止程序************************************ ***************************************************************************/ void Stop() { SCL=0; SDA=0; SCL=1; SDA=1; }
/***************************************************************************/ void Ack() { SDA=0; SCL=1; SCL=0; SDA=1; }
/***************************************************************************/ void NoAck() { SDA=1; SCL=1; SCL=0; } /*************************************************************************** *返回错误标志,ErrorBit=SDA,为1错误,0正确********************************* ***************************************************************************/ bit TestAck() { bit ErrorBit; SDA=1; SCL=1; ErrorBit=SDA; SCL=0; return(ErrorBit); } /*************************************************************************** ***************************24c02写一个字节程序****************************** ***************************************************************************/ void Write8Bit(unsigned char input) { unsigned char temp; for(temp=8;temp!=0;temp--) { SDA=(bit)(input&0x80);/*从高位依次取input的各位*/ SCL=1; SCL=0; input=input<<1; /*相等与RLC,取了CY位*/ } } /*************************************************************************** ***************************24c02写程序************************************** ***************************************************************************/ void Write24c02(unsigned char *Wdata,unsigned char RomAddress,unsigned char number) { /*Wdata对准要写的数据的首地址 RomAddress单元地址 number几个Byte*/ Start();/*IIC开始*/ Write8Bit(WriteDeviceAddress);/*写入器件地址0xa0*/ TestAck();/*测试ACK位*/ Write8Bit(RomAddress);/*写入器件控制单元地址*/ TestAck();/*测试ACK位*/ for(;number!=0;number--) { Write8Bit(*Wdata); TestAck(); Wdata++; } Stop();/*IIC停止*/ DelayMs(10);/*延长10MS,保证数据写入*/ } /*************************************************************************** ***************************24c02读一个字节程序****************************** ***************************************************************************/ unsigned char Read8Bit() { unsigned char temp,rbyte=0; for(temp=8;temp!=0;temp--) { SCL=1; rbyte=rbyte<<1; rbyte=rbyte|((unsigned char)(SDA)); SCL=0; } /* for(temp=8;temp!=0;temp--) { SCL=1; rbyte=rbyte<<1; if(SDA==1) rbyte=rbyte|0x01; SCL=0; } */ return(rbyte); /*把数据返回*/ } /*************************************************************************** ***************************24c02读程序************************************** ***************************************************************************/ void Read24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes) { /*unsigned char temp,rbyte;*/ Start(); /*IIC开始*/ Write8Bit(WriteDeviceAddress);/*写入器件地址0xa0*/ TestAck();/*测试ACK位*/ Write8Bit(RomAddress);/*写入器件控制单元地址*/ TestAck();/*测试ACK位*/ Start();/*IIC再次发送开始*/ Write8Bit(ReadDviceAddress); TestAck();/*测试ACK位*/ while(bytes!=1) { *RamAddress=Read8Bit();/*存一个读到的数据到RamAddress+I*/ Ack();/*发送IIC再读*/ RamAddress++;/*存取地址加一*/ bytes--; } *RamAddress=Read8Bit(); NoAck();/*发送IIC停止读*/ Stop();/*IIC停止*/ } /***************************************************************************/
|