新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > PIC单片机IIC通信程序

PIC单片机IIC通信程序

作者: 时间:2016-11-24 来源:网络 收藏
#include

#define uchar unsigned char
#define uint unsigned int
__CONFIG(0X3B31);
const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar a1,a2,a3,a4;
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}

本文引用地址:https://www.eepw.com.cn/article/201611/320590.htm

void port_init()
{
TRISD=0;
TRISB=0;
TRISC=0xff;
PORTD=0;
PORTB=0;
}

void IIC_init()
{
SSPSTAT=0x80;
SSPCON=0x38;//CKP高电平空闲,因为I2C必须加上拉电阻,所以设定高电平空闲
SSPCON2=0;//开始设为0,在读写的过程中相应改变其中的寄存器
SSPADD=0x09;//设置波特率,时钟=Fosc/[4*(SSPAD+1)
}

void write(uchar add,uchar wdate)
{
SSPIF=0;
SEN=1; //启动信号
while(SSPIF==0); //1的时候是真 0的时候是假 !SSPIF为非真,为假退出语句
SSPIF=0; //软件清零 不会自动清零
SSPBUF=0XA0; //发送设备地址
while(SSPIF==0); //判断是否发送完毕
SSPIF=0;
SSPBUF=add; //发送存储地址 add随自己设置
while(SSPIF==0); //监测数据是否发完
SSPIF=0;

SSPBUF=wdate; //写入数据
while(SSPIF==0); //每发送一个数据都要检测是否成功
SSPIF=0;

PEN=1; //发送停止信号
while(SSPIF==0);//如果收到停止信号同样会置位
SSPIF=0;
delay(10);
}


uchar read(uchar add)
{
uchar rdate;
SSPIF=0;
SEN=1;
while(SSPIF==0);
SSPIF=0;
SSPBUF=0xA0;//传输设备地址
while(SSPIF==0);
SSPIF=0;
SSPBUF=add;//add为读地数据地址,灵活设置
while(SSPIF==0);
SSPIF=0;

RSEN=1;
while(SSPIF==0);
SSPIF=0;
SSPBUF=0xA1;//A仍然为外接设备地址,1表示输入,开始从外接设备读取数据
while(SSPIF==0);
SSPIF=0;

RCEN=1;
while(SSPIF==0);
rdate=SSPBUF;
while(SSPIF==0);
SSPIF=0;


ACKDT=1;//写入应答信号
ACKEN=1;//发送应答信号
while(SSPIF==0);
SSPIF=0;

PEN=1;
while(SSPIF==0);
SSPIF=0;
return(rdate);
}

void display(uchar num1,uchar num2,uchar num3,uchar num4)
{
PORTB=0XF7;
PORTD=table[num1];

delay(2);
PORTB=0XFB;
PORTD=table[num2];


delay(2);
PORTB=0XFD;
PORTD=table[num3];

delay(2);
PORTB=0XFE;
PORTD=table[num4];

delay(2);
}

void main()
{
port_init();
IIC_init();
delay(100);
write(0,123);//8位为存储器,如果写入的值大于255就溢出了
uchar read(uchar add);
while(1)
{
uchar lednum;
lednum=read(0);
a1=lednum/1000;
a2=lednum00/100;
a3=lednum0/10;
a4=lednum;
display(a1,a2,a3,a4);
}
}



评论


技术专区

关闭