新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AVR單片機硬件I2C接口驅動程序

        AVR單片機硬件I2C接口驅動程序

        作者: 時間:2016-11-17 來源:網絡 收藏
        今天上午寫了atmega16的I2C硬件接口程序,程序不難,只是給初學的朋友一個思路,不過通過和51的軟件模擬I2C程序比較發現,AVR的I2C硬件接口使程序更簡單了,
        程序功能:先由atmega16向EEPROM中某地址寫數字71,然后再從EEPROM里讀出來顯示到數碼管上;
        #include
        #include <avrdef.h>
        unsigned charconstduacode[]={0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71}; //0-f 數字模*/
        void delay(unsigned int);
        void display(unsigned int);
        void send1byte(unsigned char address,unsigned char data);
        unsigned char read1byte(unsigned char address);
        #define START TWCR=BIT(7)|BIT(5)|BIT(2)
        #define STOP TWCR=BIT(7)|BIT(4)|BIT(2)
        #define WRITE(x) {TWDR=x; TWCR=BIT(7)|BIT(2);}
        void main()
        {unsigned char i=0;
        DDRC=0xff;
        while(1)
        {
        send1byte(4,71);
        i=read1byte(4);
        display(i);
        }
        }
        void send1byte(unsigned char address,unsigned char data)
        {
        START;
        while(!(TWCR&0x80));
        WRITE(0xa0);
        while(!(TWCR&0x80));
        WRITE(address);
        while(!(TWCR&0x80));
        WRITE(data);
        while(!(TWCR&0x80));
        STOP;
        delay(2);
        }
        unsigned char read1byte(unsigned char address)
        {
        unsigned char temp;
        START;
        while(!(TWCR&0x80));
        WRITE(0xa0);
        while(!(TWCR&0x80));
        WRITE(address);
        while(!(TWCR&0x80));
        START;
        while(!(TWCR&0x80));
        WRITE(0xa1);
        while(!(TWCR&0x80));
        TWCR=BIT(7)|BIT(2);
        while(!(TWCR&0x80));
        temp=TWDR;
        STOP;
        return temp;
        }
        void display(unsigned int dat)
        {
        unsigned char a[4],i;
        for(i=0;i<4;i++)
        {
        a[3-i]=dat%10;
        dat/=10;
        }
        DDRB=0xff; DDRD=0xff;
        for(i=0;i<4;i++)
        {
        PORTB=duacode[a[i]];
        PORTD&=~BIT(i);
        delay(10);
        PORTD|=BIT(i);
        }
        }
        void delay(unsigned int x)
        {
        unsigned int a; unsigned char b;
        for(a=x;a>0;a--)
        for(b=100;b>0;b--);
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 济南市| 乌恰县| 盈江县| 杭锦旗| 婺源县| 宁陕县| 武汉市| 盐山县| 平顶山市| 贵溪市| 开阳县| 沙田区| 三都| 永康市| 名山县| 建水县| 什邡市| 衡山县| 武汉市| 汝州市| 孟州市| 金湖县| 秀山| 保山市| 枣阳市| 天长市| 麻阳| 三门峡市| 巴林右旗| 湟中县| 安陆市| 邮箱| 通城县| 庆安县| 宜川县| 股票| 都昌县| 金堂县| 江孜县| 车险| 石景山区|