当前位置:首页 > 单片机 > 单片机
[导读]用c语言实现24LC256读写(非软件模拟方式)#include unsignedCHARi=0; unsignedCHARreceive=0x00; void i2c_start() { SEN=1;//启动 do{ }while(SSPIF==0); SSPIF=0; } void i2c_stop() { PEN=1;//

用c语言实现24LC256读写(非软件模拟方式)

#include
unsignedCHARi=0;
unsignedCHARreceive=0x00;

void i2c_start()
{
SEN=1;//启动
do{
}while(SSPIF==0);
SSPIF=0;
}

void i2c_stop()
{
PEN=1;//产生停止条件
do{
;
}while(SSPIF==0);
SSPIF=0;
}

void i2c_restart()
{
RSEN=1;//启动,反复启动
do{
;
}while(SSPIF==0);
SSPIF=0;
}

void i2c_dataout()//数据发送等待过程
{
do{
;
}while(SSPIF==0);
SSPIF=0;
}

void i2c_datain()//读取24LC256时,不是读的最后一个字节时使用
{
RCEN=1;
do{
;
}while(SSPIF==0);
SSPIF=0;
receive=SSPBUF;
ACKDT=0;
ACKEN=1;
do{
;
}while(SSPIF==0);
SSPIF=0;
}

void i2c_datainlast()//读取最后一个字节,或只读取24LC256中一个字节
{
SSPIF=0;
RCEN=1;
do{
;
}while(SSPIF==0);
SSPIF=0;
receive=SSPBUF;
ACKDT=1 ;
ACKEN=1;
do{
;
}while(SSPIF==0);
SSPIF=0;

}

void i2c_error()
{
i2c_stop();
return;
}

void write(unsigned int addr,unsignedCHARdata,unsigned int n)//向iic写入一字节数据 地址,数据,字节个数
{
i2c_start();
SSPBUF=0xA0;//EEPROM寻址码和写操作命令码
i2c_dataout(); //发送

if(ACKSTAT)
i2c_error();//无应答,错误!
else if(!ACKSTAT)
SSPBUF=addr/256;
//高eeaddr/256,取EEPROM数据地址高字节
i2c_dataout(); //发送

if(ACKSTAT)
i2c_error();//无应答,错误!
else if(!ACKSTAT)
SSPBUF=addr%256;//低eeaddr%256 ,取EEPROM数据地址低字节
i2c_dataout(); //发送

for(i=0;i{
if(ACKSTAT)//应答
i2c_error();//无应答,错误!
else if(!ACKSTAT)
SSPBUF=data;//eedata入EEPROM的数据
i2c_dataout();//发送
}

if(ACKSTAT)//应答
i2c_error();

i2c_stop();//产生停止位,启动EEPROM内部些过程

do{
i2c_start();
SSPBUF=0xA0;
i2c_dataout();
i2c_stop();
if(!ACKSTAT)break;
}while(ACKSTAT);
}

unsigned int current_read(void)//current address read ok!
{
i2c_start();
SSPBUF=0xA1;//寻址命令码0xA0 和 读命令
i2c_dataout();
if(ACKSTAT)//应答
i2c_error();
else if(!ACKSTAT)
i2c_datainlast();
i2c_stop();

return ((unsigned int)receive);
}

unsigned int random_read(unsigned intEEPROMaddress)
{
i2c_start();
SSPBUF=0xA0;//EEPROM寻址码和写操作命令码
i2c_dataout(); //发送

if(ACKSTAT)
i2c_error();//无应答,错误!
else if(!ACKSTAT)
SSPBUF=EEPROMaddress/256;
//高eeaddr/256,取EEPROM数据地址高字节
i2c_dataout(); //发送

if(ACKSTAT)
i2c_error();//无应答,错误!
else if(!ACKSTAT)
SSPBUF=EEPROMaddress%256;//低eeaddr%256 ,取EEPROM数据地址低字节
i2c_dataout(); //发送

if(ACKSTAT)
i2c_error();//无应答,错误!
else if(!ACKSTAT)

i2c_restart();
SSPBUF=0xA1;//寻址命令码0xA0 和 读命令
i2c_dataout();

if(ACKSTAT)//应答
i2c_error();
else if(!ACKSTAT)
i2c_datainlast();
i2c_stop();
return ((unsigned int)receive);

}

void i2c_init()
{
SSPSTAT=0x00;
TRISC=0xD8;
SSPADD=19;
SSPIE=0;
SSPCON=0x28;
}


//在主程序中,先i2c_init();然后开始读/写24LC256中数据,经多次运行
no bug
//程序中的寄存器必须芯片内部包含,否则无法实现硬件iic读写。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

pic单片机应用很多,生活中到处都有pic单片机的身影。小编个人也是从事pic单片机开发的人员之一,对于pic单片机有一定的理解。今天,小编将带领大家一起看一下pic单片所具备的8大优势。

关键字: pic 单片机 寄存器

SpiceJet 成为首家借力Q400客机提升盈利潜力的航空公司 加拿大多伦多, Sept. 24, 2018 (GLOBE NEWSWIRE) -- Bombardier Commercial

关键字: pic ce

什么是PIC单片机?你知道多少?时代的变迁,PIC单片机是这个时代的新宠。之前我们对pic单片机的I/O接口进行过阐述,不是很详细。本期对关于PIC单片机的各种内部硬件资源加以介绍,以帮助大家全面掌握pic单片机打下夯实...

关键字: pic 单片机 电路

pic单片机具备很多应用,对于pic单片机,想必大家并不陌生。往期文章中,小编对pic单片机做过诸多介绍。本文中,小编将为大家带来6个pic单片机问题,并予以解答。而在之后的pic单片机文章中,小编将带来另外6个问题。如...

关键字: pic pic单片机 单片机 指数

对于c编译器,大家应早已熟悉。往期文章中,小编带来诸多c编译器相关文章,尤其是gcc c编译器。本文中,小编将对gcc c编译器如何编译c程序予以介绍,并在文章的后半部分向大家讲解如果选择pic单片机的c编译器。如果你对...

关键字: c编译器 gcc pic 指数

​2020年2月13日,北京——是德科技宣布,该公司即将与国家信息光电子创新中心(NOEIC)和CompoundTek展开合作,三方携手建立光子集成电路(PIC)自动化测试的布局设计标准。

关键字: pic 自动化测试 fdr

​Microchip PIC18-Q43系列产品将更多的独立于内核的外设(CIP)及功能丰富的开发工具生态系统相结合,可改善实时控制和互联应用的设计

关键字: MCU pic cip

还有一个问题也是值得注意的,就是在中断服务程序中避免打开全局中断允许位,因为PIC单片机不支持中断嵌套,否则在执行一个中断服务程序还未结束就进入另一个中断服务程序后,上一个中断的现场参数将遭到破坏,从而导致程序产生不可预...

关键字: pic 单片机 电源技术解析

Pic单片机的学习是存在一定难度的,一是因为必须具备一定的pic单片机基础知识,二是需对pic单片机的所有引脚等有一定的了解。这篇文章是小编在学习pic单片机写的一篇比较适合pic单片机初入门朋友阅读的文章,一起了解下吧...

关键字: pic pic单片机 单片机

Microchip Technology Inc.(美国微芯科技公司)今日宣布推出最新版本的统一软件框架MPLAB® Harmony 3.0(v3),首次为SAM MCU提供支持。

关键字: Microchip pic am单片机
关闭