16F877A和24C02通信汇编语言,pic单片机IIC通信读24C02程序例 16F877A 主频4M

文本名为 iic.h #ifndef _iic_h_

#define _iic_h_//pic单片机IIC通信初始化函数声明

void iiccsh(void);

//pic单片机IIC通信读外围设备函数声明

//功能:传送一个8位地址,返回一个8位数据

unsigned char iicread(unsigned char data);

//pic单片机IIC通信给外围器件发送函数声明

//功能:传送一个8位地址,传送一个8位数据或指令

void iicwrite(unsigned char diz,unsigned char data);

#endif 文本名为 iic.c#ifndef _iic_h_ //立即写,立即读,在写读之间要有一定的延时(unsigned int sdf; sdf=400; while(sdf)--sdf;)

#define _iic_h_

#include

//pic单片机IIC通信初始化函数

void iiccsh(void)

{

TRISC3=1;

TRISC4=1; //PIC单片机(对16F877A单片机而言IIC通信是RC3和RC4引脚)IIC通信时时钟引脚和数据引脚要设置成输入

SSPCON=0X28; //SSPCON同步串口控制寄存器设置成IIC通信功能使能和单片机主控方式

SSPCON2=0; //SSPCON2同步串口控制寄存器置0

SSPSTAT=0X80; //SSPSTAT同步串口状态寄存器设置成采用标准S模式(100Kb/s)和输入电平满足IIC总线标准

SSPADD=9; //SSPADD iic通信波特率寄存器

}

//pic单片机IIC通信读外围设备函数

//功能:传送一个8位地址,返回一个8位数据

unsigned char iicread(unsigned char address) //address位

{

unsigned char data;

SSPIF=0;

SEN=1; //在SDA和SCL线上建立和发送一个启动信号时序

while(!SSPIF); //判断是启动信号否发送完毕,SSPIF为1的时候是真 为0的时候是假 !SSPIF(1)为非真,为假退出语句

SSPIF=0; //软件清零 不会自动清零

SSPBUF=0XA0; //发送外设IIC器件地址和写信号

while(!SSPIF);

SSPIF=0;

SSPBUF=address; //发送要读外设IIC器件数据的地址

while(!SSPIF); //判断是否发送完毕

SSPIF=0;

RSEN=1; //发送启动重启信号

while(!SSPIF);

SSPIF=0;

SSPBUF=0XA1; //发送外设IIC器件地址和读数据信号

while(!SSPIF); //每发送一个数据都要检测是否成功

SSPIF=0;

RCEN=1; //设置读允许

while(SSPIF==0);

data=SSPBUF;

// while(SSPIF==0);

SSPIF=0;

ACKDT=0; //写入应答信号

ACKEN=1; //发送应答信号

while(!SSPIF);

SSPIF=0;

RCEN=0;

PEN=1; //在SDA和SCL线上建立和发送一个停止信号时序

while(!SSPIF); //如果收到停止信号同样会置位

SSPIF=0;

return(data);

}

//pic单片机IIC通信给外围器件发送函数声明

//功能:传送一个8位地址,传送一个8位数据或指令

void iicwrite(unsigned char diz,unsigned char data)

{

SSPIF=0;

SEN=1; //在SDA和SCL线上建立和发送一个启动信号时序

while(!SSPIF); //判断是启动信号否发送完毕,SSPIF为1的时候是真 为0的时候是假 !SSPIF(1)为非真,为假退出语句

SSPIF=0; //软件清零 不会自动清零

SSPBUF=0XA0; //发送外设IIC器件地址和写信号

while(!SSPIF); //判断是否发送完毕

SSPIF=0;

SSPBUF=diz; //发送要读外设IIC器件数据的地址

while(!SSPIF); //每发送一个数据都要检测是否成功

SSPIF=0;

SSPBUF=data; //发送要读外设IIC器件要存储的数据或命令

while(!SSPIF); //每发送一个数据都要检测是否成功

SSPIF=0;

PEN=1; //在SDA和SCL线上建立和发送一个停止信号时序

while(!SSPIF); //如果收到停止信号同样会置位

SSPIF=0;

}

#endif

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值