<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 測試AVR的TWI寫24c02芯片的簡單函數(shù)

          測試AVR的TWI寫24c02芯片的簡單函數(shù)

          作者: 時間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
          //文件名:"I2C.h"

          //描述:聲明讀寫24c02以及初始化TWI的全局函數(shù)

          本文引用地址:http://www.ex-cimer.com/article/201611/318916.htm

          #define uchar unsigned char
          #define uint unsigned int
          void I2C_Inti(void);
          void Write_24c02(uchar add,uchar data);
          uchar Read_24c02(uchar add);

          //文件名:"I2C.c"

          //描述:定義關(guān)于24c02以及TWI的相關(guān)函數(shù)

          #include
          #include
          #include"I2C.h"

          #define TW_START 0X08
          #define TW_REP_START 0X10
          #define TW_MT_SLA_ACK 0X18
          #define TW_MT_SLA_nACK 0X20
          #define TW_MT_DATA_ACK 0X28
          #define TW_MT_DATA_nACK 0X30
          #define TW_MT_LOST 0X38
          #define TW_MR_LOST 0X38
          #define TW_MR_SLA_ACK 0X40
          #define TW_MR_SLA_nACK 0X48
          #define TW_MR_DATA_ACK 0X50
          #define TW_MR_DATA_nACK 0X58

          //函數(shù)名;I2C_Inti
          //輸入:無
          //輸出:無
          //描述:初始化AVR的TWI端口

          void I2C_Inti(void)
          {
          TWBR=10;
          TWSR=0X00;
          TWAR=0X00;
          DDRC=0X80;
          PORTC=0XFF;
          }

          //函數(shù)名;I2C_Start
          //輸入:無
          //輸出:成功返回1,失敗返回0
          //描述:TWI開始(或重復(fù)開始)函數(shù)


          uchar I2C_Start(void)
          {
          TWCR=BIT(TWINT)|BIT(TWSTA)|BIT(TWEN);
          while(!(TWCR&BIT(TWINT)));
          if((TWSR&0XF8)==TW_START)//開始TWI成功
          {
          return 1;
          }
          if((TWSR&0XF8)==TW_REP_START) //再次開始TWI成功
          {
          return 1;
          }
          return 0;
          }

          //函數(shù)名;I2C_Stop
          //輸入:無
          //輸出:無
          //描述:TWI結(jié)束函數(shù)


          void I2C_Stop(void)
          {
          TWCR=BIT(TWINT)|BIT(TWEN)|BIT(TWSTO);
          }

          //函數(shù)名;Write_I2C
          //輸入:待寫的地址或數(shù)據(jù)
          //輸出:有應(yīng)答返回1,無應(yīng)答返回0
          //描述:主機(jī)寫

          uchar Write_I2C(uchar data)
          {
          uchar ack=1;
          TWDR=data;
          TWCR=BIT(TWINT)|BIT(TWEN);
          while(!(TWCR&BIT(TWINT)));
          if((TWSR&0XF8)==TW_MT_SLA_ACK) //發(fā)送芯片地址(寫)成功,有應(yīng)答
          {
          return ack;
          }
          if((TWSR&0XF8)==TW_MT_DATA_ACK) //發(fā)送數(shù)據(jù)成功,有應(yīng)答
          {
          return ack;
          }
          if((TWSR&0XF8)==TW_MR_SLA_ACK) //發(fā)送芯片地址(讀)成功,有應(yīng)答
          {
          return ack;
          }
          return 0;
          }

          //函數(shù)名;Read_I2C
          //輸入:是否應(yīng)答,1--發(fā)送應(yīng)答,0--不發(fā)送應(yīng)答
          //輸出:讀數(shù)據(jù)成功返回讀出的一個字節(jié)數(shù)據(jù),失敗返回0
          //描述:主機(jī)讀

          uchar Read_I2C(uchar ack)
          {
          if(ack)
          {
          TWCR=BIT(TWINT)|BIT(TWEN)|BIT(TWEA);
          while(!(TWCR&BIT(TWINT)));
          if((TWSR&0XF8)==TW_MR_DATA_ACK)
          {
          return(TWDR);
          }
          }
          else
          {
          TWCR=BIT(TWINT)|BIT(TWEN);
          while(!(TWCR&BIT(TWINT)));
          if((TWSR&0XF8)==TW_MR_DATA_nACK)
          {
          return(TWDR);
          }
          }
          return 0;
          }

          //函數(shù)名;Read_24c02
          //輸入:存儲地址add
          //輸出:返回讀出的一個字節(jié)數(shù)據(jù)
          //描述:主機(jī)讀24c02指定地址

          uchar Read_24c02(uchar add)
          {
          uchar data;
          I2C_Start();
          Write_I2C(0XAE);
          Write_I2C(add);
          I2C_Start();
          Write_I2C(0XAF);
          data=Read_I2C(0);
          I2C_Stop();
          return data;
          }


          //函數(shù)名;Write_24c02
          //輸入:存儲地址add,待寫的數(shù)據(jù)data
          //輸出:無
          //描述:主機(jī)寫24c02指定地址一個字節(jié)的數(shù)據(jù)

          void Write_24c02(uchar add,uchar data)
          {
          I2C_Start();
          Write_I2C(0XAE);
          Write_I2C(add);
          Write_I2C(data);
          I2C_Stop();
          }

          //文件名:"main.c"

          //描述:測試讀寫24c02的函數(shù),利用數(shù)碼管顯示

          #include
          #include
          #include"I2C.h"

          #define ON_138 PORTC|=BIT(PC7) //使能74138
          #define OFF_138 PORTC&=~BIT(PC7)

          const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //顯示的段碼值
          uchar buffer[]={0,0,0}; //存放待顯示的數(shù)據(jù)的段碼

          //函數(shù)名;Send_Buffer
          //輸入:待數(shù)碼管顯示的數(shù)據(jù)
          //輸出:無
          //描述:將顯示的數(shù)據(jù)譯碼

          void Send_Buffer(uchar data)
          {
          buffer[0]=table[data/100];
          data=data0;
          buffer[1]=table[data/10];
          data=data;
          buffer[2]=table[data];
          }

          //函數(shù)名;Display
          //輸入:待顯示的位置和段碼值,site--[0,2]
          //輸出:無
          //描述:在指定位置顯示指定數(shù)據(jù)

          void Display(uchar site,uchar data)
          {
          if(site==0)
          {
          PORTA=0X00;
          PORTB=data;
          }
          if(site==1)
          {
          PORTA=0X01;
          PORTB=data;
          }
          if(site==2)
          {
          PORTA=0X02;
          PORTB=data;
          }
          }

          //函數(shù)名;delay_ms
          //輸入:無
          //輸出:無
          //描述:延時1ms

          void delay_ms(uint ms)
          {
          uint i,j;
          for(i=0;i for(j=0;j<564;j++);
          }

          void main()
          {
          uchar temp;
          I2C_Inti();
          DDRA=0XFF;
          PORTA=0X00;
          DDRB=0XFF;
          PORTB=0X00;
          ON_138;
          temp=Read_24c02(0x08); //讀地址為0x08的存儲數(shù)據(jù)
          Send_Buffer(temp);
          temp++;
          Write_24c02(0x08,temp); // 寫temp到存儲地址0x08
          while(1)
          {
          Display(0,buffer[0]);
          delay_ms(3);
          Display(1,buffer[1]);
          delay_ms(3);
          Display(2,buffer[2]);
          delay_ms(3);
          }
          }

          附圖:



          關(guān)鍵詞: AVRTWI寫24c02芯

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();