📄 24lc256.c
字号:
#include "p89v51rx2.h"
#include <intrins.h>
#define OP_READ 0xa1 // 器件地址以及读取操作
#define OP_WRITE 0xa0 // 器件地址以及写入操作
#define MAX_ADDR 0x7fff // AT24C256最大地址
sbit SDA = P3^4;
sbit SCL = P3^5;
bit bdata ack;
#define nops(); {_nop_();_nop_();_nop_();_nop_();}
//------------------------------------------------------------------------------------------------------
void IIC_start(void); //起始条件
void IIC_stop(void); //停止条件
void IIC_ack_main(bit ack_main);
void IIC_sendbyte(unsigned char senddata);
unsigned char IIC_readbyte(void);
//unsigned char IIC_read_cur_addr(unsigned char ad_main);
void IIC_RdFromROM(unsigned char ad_main,unsigned char *rddata,unsigned char addh,unsigned char addl,unsigned char num);
void IIC_WrToROM(unsigned char ad_main,unsigned char *wrdata,unsigned char addh,unsigned char addl,unsigned char num);
extern void delayms(unsigned char ms);
//=====================================24LC256================================
/*****************************************************************************
****
****
****
****
****
******************************************************************************/
void IIC_start(void)
{
// SCL=0;
SDA=1;
_nop_();
SCL=1;
//_nop_();_nop_();_nop_();_nop_();_nop_();
nops();
SDA=0;
//_nop_();_nop_();_nop_();_nop_();_nop_();
nops();
SCL=0;
_nop_();
_nop_();
}
/*****************************************************************************
****
****
****
****
****
******************************************************************************/
void IIC_stop(void)
{
// SCL=0;
SDA=0;
_nop_();
SCL=1;
// _nop_();_nop_();_nop_();_nop_();_nop_();
nops();
nops();
SDA=1;
// _nop_();_nop_();_nop_();_nop_();_nop_();
nops();
nops();
}
/*****************************************************************************
****
****
****
****
****
******************************************************************************/
void IIC_ack_main(bit ack_main)//1 应答信号 0 非应答信号
{
if(ack_main)
SDA=0; //主器件为接收方,从器件为发送方,应答信号
else
SDA=1; //主器件为接收方,从器件为发送方,非应答信号
// _nop_();_nop_();_nop_();_nop_();_nop_();
nops();
SCL=1;
// _nop_();_nop_();_nop_();_nop_();_nop_();
nops();
SCL=0;
}
/*****************************************************************************
****
****
****
****
****
******************************************************************************/
void IIC_sendbyte(unsigned char senddata)
{
unsigned char idata count=8; //bit count control
unsigned char temp;
do
{
temp=senddata;
SCL=0;
nops();
if((temp&0x80)==0x80)
{
SDA=1;
}
else
{
SDA=0;
}
SCL=1;
senddata=senddata<<1;
count--;
}while(count);
SCL=0; //不考虑从应答位|但要控制好时序 */
}
/*****************************************************************************
****
****
****
****
****
******************************************************************************/
unsigned char IIC_readbyte(void)
{
unsigned char idata count,temp,temp1;
temp=0;
temp1=0;
count=8;
SDA=1;
do
{
_nop_();
SCL=0;
nops();
SCL=1;
nops();
if(SDA)
{
temp=temp|0x01;
}
else
{
temp=temp&0xfe;
}
if(count-1)
{
temp1=temp<<1;
temp=temp1;
}
count--;
}while(count);
SCL=0;
_nop_();
_nop_();
return temp;
}
void IIC_WrToROM(unsigned char ad_main,unsigned char *wrdata,unsigned char addh,unsigned char addl,unsigned char num)
{
unsigned char idata i;
IIC_start();
IIC_sendbyte(ad_main);
IIC_ack_main(1);
IIC_sendbyte(addh);
IIC_ack_main(1);
IIC_sendbyte(addl);
IIC_ack_main(1);
for(i=0;i<num;i++)
{
IIC_sendbyte(*(wrdata+i));
IIC_ack_main(1);
}
IIC_stop();
delayms(20);
}
void IIC_RdFromROM(unsigned char ad_main,unsigned char *rddata,unsigned char addh,unsigned char addl,unsigned char num)
{
unsigned char i; // ,j
i=0;
IIC_start();
IIC_sendbyte(ad_main);
IIC_ack_main(1);
IIC_sendbyte(addh);
IIC_ack_main(1);
IIC_sendbyte(addl);
IIC_ack_main(1);
IIC_start();
IIC_sendbyte(ad_main+1);
IIC_ack_main(1);
for(i=0;i<num-1;i++)
{
*(rddata+i)=IIC_readbyte();
IIC_ack_main(1);
}
*(rddata+num-1)=IIC_readbyte();
IIC_ack_main(0);
IIC_stop();
}
/*void delayms(unsigned char ms)
// 延时子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 125; i++);
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -