×
单片机 > 单片机程序设计 > 详情

PIC单片机IIC通信程序

发布时间:2020-09-02 发布时间:
|
#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--);
}

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);
     }
}

关键字:PIC单片机  IIC  通信程序

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈msp430f5529入门(2)----时钟配置.例程分析