新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > PIC單片機(jī)IIC通信程序

        PIC單片機(jī)IIC通信程序

        作者: 時(shí)間:2016-11-24 來源:網(wǎng)絡(luò) 收藏
        #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--);
        }

        本文引用地址:http://www.104case.com/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高電平空閑,因?yàn)镮2C必須加上拉電阻,所以設(shè)定高電平空閑
        SSPCON2=0;//開始設(shè)為0,在讀寫的過程中相應(yīng)改變其中的寄存器
        SSPADD=0x09;//設(shè)置波特率,時(shí)鐘=Fosc/[4*(SSPAD+1)
        }

        void write(uchar add,uchar wdate)
        {
        SSPIF=0;
        SEN=1; //啟動(dòng)信號(hào)
        while(SSPIF==0); //1的時(shí)候是真 0的時(shí)候是假 !SSPIF為非真,為假退出語句
        SSPIF=0; //軟件清零 不會(huì)自動(dòng)清零
        SSPBUF=0XA0; //發(fā)送設(shè)備地址
        while(SSPIF==0); //判斷是否發(fā)送完畢
        SSPIF=0;
        SSPBUF=add; //發(fā)送存儲(chǔ)地址 add隨自己設(shè)置
        while(SSPIF==0); //監(jiān)測(cè)數(shù)據(jù)是否發(fā)完
        SSPIF=0;

        SSPBUF=wdate; //寫入數(shù)據(jù)
        while(SSPIF==0); //每發(fā)送一個(gè)數(shù)據(jù)都要檢測(cè)是否成功
        SSPIF=0;

        PEN=1; //發(fā)送停止信號(hào)
        while(SSPIF==0);//如果收到停止信號(hào)同樣會(huì)置位
        SSPIF=0;
        delay(10);
        }


        uchar read(uchar add)
        {
        uchar rdate;
        SSPIF=0;
        SEN=1;
        while(SSPIF==0);
        SSPIF=0;
        SSPBUF=0xA0;//傳輸設(shè)備地址
        while(SSPIF==0);
        SSPIF=0;
        SSPBUF=add;//add為讀地?cái)?shù)據(jù)地址,靈活設(shè)置
        while(SSPIF==0);
        SSPIF=0;

        RSEN=1;
        while(SSPIF==0);
        SSPIF=0;
        SSPBUF=0xA1;//A仍然為外接設(shè)備地址,1表示輸入,開始從外接設(shè)備讀取數(shù)據(jù)
        while(SSPIF==0);
        SSPIF=0;

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


        ACKDT=1;//寫入應(yīng)答信號(hào)
        ACKEN=1;//發(fā)送應(yīng)答信號(hào)
        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位為存儲(chǔ)器,如果寫入的值大于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);
        }
        }



        關(guān)鍵詞: PIC單片機(jī)IIC通信程

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 聂拉木县| 将乐县| 余庆县| 怀仁县| 秦皇岛市| 宜兰县| 闵行区| 扎鲁特旗| 岳普湖县| 泰州市| 信宜市| 汝州市| 乃东县| 昭苏县| 化德县| 乐安县| 会昌县| 胶州市| 汪清县| 额尔古纳市| 石门县| 山东省| 南皮县| 白沙| 色达县| 定陶县| 外汇| 金川县| 安陆市| 延寿县| 岳池县| 旅游| 赤壁市| 奎屯市| 株洲县| 阿坝县| 格尔木市| 彭泽县| 桂林市| 万宁市| 青川县|