⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isr_i2c.lst

📁 51单片机C语言常用模块与综合系统设计实例精讲
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.06   ISR_I2C                                                               10/29/2006 14:34:14 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE ISR_I2C
OBJECT MODULE PLACED IN ISR_I2C.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ISR_I2C.C LARGE BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include <./Atmel/at89x52.h>
   2          #include    "source.h"
   3          #define         SDA_SET()               (SDA=1)
   4          #define         SDA_CLR()               (SDA=0)
   5          //#define       SDA_VAL()               (PDDR  &0x2)
   6          
   7          #define         SCL_SET()               (SCL=1)
   8          #define         SCL_CLR()               (SCL=0)
   9          
  10          
  11          I2Cdesc I2c;    //the device decriptor
  12          
  13          extern void I2cFinish(I2Cdesc *I2C_pt);
  14          unsigned int idata I2c_timer_cnt=0;
  15          void Init_I2c_Timer(unsigned int us){//MCLK@18.432MHz
  16   1              //(((MCLK/12))*(256-TH0))us
  17   1          TH0=TIMER0H;//20us
  18   1              TL0=TH0;
  19   1              I2c_timer_cnt=us/20;
  20   1              TR0=1; // let timer 0 run      // TCON /
  21   1      }
  22          void Start_I2c_Timer(unsigned int us){
  23   1              I2c_timer_cnt=us/20;
  24   1              TL0=TH0;
  25   1              TR0=1; // let timer 0 run      // TCON /
  26   1      }
  27          void Stop_I2c_Timer(void){
  28   1              TR0=0;
  29   1      }
  30          unsigned char SDA_VAL(void){
  31   1              return SDA;     
  32   1      }
  33          //*-----------------------------------------------------------------------------
  34          //* 函数名称  : I2CWrite (I2Cdesc *I2C_pt, u_short loadAddress, u_char nbByte)
  35          //* Object    : I2C
  36          //* 输入参数  : <I2C_pt> =   为I2C的描述指针,其结构定义在source.h中
  37          //*                           : loadAddress  为I2C的输入的存储单元的地址
  38          //*                           : nbByte       为要写入I2C的字节数
  39          //* 输出变量  : 无
  40          //* 功能       :把TxEnd中的数据的nbByte字节写到loadAddress地址
  41          //*-----------------------------------------------------------------------------
  42          void I2CWrite (I2Cdesc *I2C_pt, unsigned int loadAddress, unsigned int nbByte){ 
  43   1          I2C_pt->state = NOK;
  44   1                I2C_pt->operate=WRITE_BIT;
  45   1                I2C_pt->Error=0;      
  46   1                                                                                  //* initialize state
  47   1          SCL_SET();                    //* set SCL line
  48   1          SDA_SET();              //* set SDA line
  49   1      
  50   1          I2C_pt->I2CByte = I2C_pt->deviceAddress | WRITE_BIT ;           //* get byte to transmit
  51   1          I2C_pt->loadAddress = loadAddress;                                      //* get address
  52   1          I2C_pt->mode = HIGH_ADDRESS_WRITE;                                      //* next mode
  53   1          I2C_pt->nbI2CByte = nbByte;                                                     //* get number of byte to transmit
  54   1          I2C_pt->countBit = 8;                                                                   //* initialize countBit
  55   1          I2C_pt->nb_ACK = 10;                                                                    //* initialize nb_ACK
C51 COMPILER V7.06   ISR_I2C                                                               10/29/2006 14:34:14 PAGE 2   

  56   1          //* change interrupt handler to I2CTxSendStartSDA
  57   1          I2C_pt->I2CTCHandler = I2CTxSendStartSDA;
  58   1          //* Enable RC compare interrupt
  59   1          Start_I2c_Timer(I2C_pt->Timer_Gap_us);//start Timer
  60   1      }
  61          //*-----------------------------------------------------------------------------
  62          //* 函数名称       : I2CRead (I2Cdesc *I2C_pt, u_short loadAddress, u_char nbByte)
  63          //* Object         : I2C
  64          //* 输入参数       : <I2C_pt> =  为I2C的描述指针,其结构定义在source.h中
  65          //*                                : loadAddress 为I2C的输入的存储单元的地址
  66          //*                                : nbByte      为要写入I2C的字节数
  67          //* 输出变量       : 无
  68          //* 功能           :从loadAddress地址中读nbByted放到RxEnd中
  69          //*-----------------------------------------------------------------------------
  70          void I2CRead (I2Cdesc *I2C_pt, unsigned int loadAddress, unsigned int nbByte){
  71   1      
  72   1          I2C_pt->state = NOK;            //* initialize state
  73   1                I2C_pt->operate=READ_BIT;
  74   1                I2C_pt->Error=0;
  75   1      
  76   1          SCL_SET();                  //* set SCL line
  77   1          SDA_SET();            //* set SDA line
  78   1      
  79   1          I2C_pt->I2CByte = I2C_pt->deviceAddress | WRITE_BIT ;     //* get byte to read
  80   1          I2C_pt->loadAddress = loadAddress;                  //* get address
  81   1          I2C_pt->mode = HIGH_ADDRESS_READ;               //* next mode
  82   1          I2C_pt->nbI2CByte = nbByte;         //* get nb byte to transmit
  83   1      
  84   1          I2C_pt->countBit = 8;       //* initialize countBit
  85   1          I2C_pt->nb_ACK = 10;        //* initialize nb_ACK
  86   1          //* change interrupt handler to I2CTxSendStartSDA 
  87   1          I2C_pt->I2CTCHandler = I2CTxSendStartSDA;
  88   1          //* Enable RC compare interrupt
  89   1               Start_I2c_Timer(I2C_pt->Timer_Gap_us);//start Timer
  90   1      }
  91          
  92          //*-----------------------------------------------------------------------------
  93          //* 函数名称       : I2CDeviceRead (I2Cdesc *I2C_pt)
  94          //* Object         : I2C
  95          //* 输入参数       : <I2C_pt> =  为I2C的描述指针,其结构定义在source.h中
  96          //* 输出变量       : 无
  97          //* 功能           :为在读字节操作时通知I2C设备,以下的操作为读操作
  98          //*-----------------------------------------------------------------------------
  99          void I2CDeviceRead (I2Cdesc *I2C_pt){
 100   1          SDA_SET();     //* set SDA line
 101   1          SCL_SET();      //* set SCL line
 102   1          
 103   1          I2C_pt->I2CByte = I2C_pt->deviceAddress | READ_BIT;      //* get byte to transmit
 104   1          I2C_pt->mode = DATA_READ;   //* next mode
 105   1          I2C_pt->countBit = 8;       //* initialize countBit
 106   1          I2C_pt->nb_ACK = 10;           //* initialize nb_ACK
 107   1          //* change interrupt handler to I2CTxSendStartSDA
 108   1          I2C_pt->I2CTCHandler = I2CTxSendStartSDA;
 109   1      }
 110          
 111          //*-----------------------------------------------------------------------------
 112          //* 函数名称       : I2CDeviceRead (I2Cdesc *I2C_pt)
 113          //* Object         : I2C
 114          //* 输入参数       : <I2C_pt> =  为I2C的描述指针,其结构定义在source.h中
 115          //* 输出变量       : 无
 116          //* 功能           :为在写字节操作时通知I2C设备,以下的操作为写操作
 117          //*-----------------------------------------------------------------------------
C51 COMPILER V7.06   ISR_I2C                                                               10/29/2006 14:34:14 PAGE 3   

 118          void I2CDeviceWrite (I2Cdesc *I2C_pt){
 119   1          SDA_SET();;     //* set SDA line
 120   1          SCL_SET();;        //* set SCL line
 121   1      
 122   1          I2C_pt->I2CByte = I2C_pt->deviceAddress | WRITE_BIT;      //* get byte to transmit
 123   1          I2C_pt->mode = DATA;                //* next mode
 124   1          I2C_pt->countBit = 8;       //* initialize countBit
 125   1          I2C_pt->nb_ACK = 10;           //* initialize nb_ACK
 126   1          //* change interrupt handler to I2CTxSendStartSDA
 127   1          I2C_pt->I2CTCHandler = I2CTxSendStartSDA;
 128   1      }
 129          //*-----------------------------------------------------------------------------
 130          //* 函数名称       : I2CTxSendByte (I2Cdesc *I2C_pt)
 131          //* Object         : I2C
 132          //* 输入参数       : <I2C_pt> =  为I2C的描述指针,其结构定义在source.h中
 133          //* 输出变量       : 无
 134          //* 功能           :为把状态字节,数据,地址等字节写到I2C设备中
 135          //*-----------------------------------------------------------------------------
 136          void I2CTxSendByte (I2Cdesc *I2C_pt){
 137   1      
 138   1          SDA_SET();;        //* set SDA line
 139   1          switch(I2C_pt->mode){           //* get byte to transmit
 140   2                  case DATA :     //Writing data byte now...
 141   2                      I2C_pt->I2CByte = *(I2C_pt->TxEnd++);
 142   2                  I2C_pt->nbI2CByte--;
 143   2                      if(I2C_pt->nbI2CByte == 0)
 144   2                      I2C_pt->mode = STOP;               //* next mode
 145   2                  break;
 146   2              case HIGH_ADDRESS_WRITE :   //Write high byte of address (Write operation)...
 147   2                      I2C_pt->I2CByte = (unsigned char)(I2C_pt->loadAddress >> 8);
 148   2                  I2C_pt->mode    = LOW_ADDRESS_WRITE;   //* next mode
 149   2                      break;
 150   2                  case LOW_ADDRESS_WRITE :    //Write low byte of address (Write operation)...
 151   2                      I2C_pt->I2CByte = (unsigned char) I2C_pt->loadAddress;
 152   2                      I2C_pt->mode    = DATA;                //* next mode
 153   2                      break;
 154   2                  case HIGH_ADDRESS_READ :    //Write high byte of address (Read operation)... 
 155   2                      I2C_pt->I2CByte = (unsigned char) (I2C_pt->loadAddress >> 8);
 156   2                  I2C_pt->mode    = LOW_ADDRESS_READ;    //* next mode
 157   2                      break;
 158   2                  case LOW_ADDRESS_READ :     //Write low byte of address (Read operation)...
 159   2                      I2C_pt->I2CByte = (unsigned char) I2C_pt->loadAddress;
 160   2                      I2C_pt->mode    = DEVICE_READ;         //* next mode
 161   2                      break;
 162   2          }
 163   1          I2C_pt->countBit = 8;         //* initialize countBit
 164   1          I2C_pt->nb_ACK   = 10;        //* initialize nb_ACK
 165   1          //* change interrupt handler to I2CTxSendBit
 166   1          I2C_pt->I2CTCHandler = I2CTxSendBit;
 167   1      }
 168          
 169          
 170          //*-----------------------------------------------------------------------------
 171          //* 函数名称       : I2CTxSendBit (I2Cdesc *I2C_pt)
 172          //* Object         : I2C
 173          //* 输入参数       : <I2C_pt> =  为I2C的描述指针,其结构定义在source.h中
 174          //* 输出变量       : 无
 175          //* 功能           :根据发送数据的BIT位来判断要发送什么数据在SDA线上
 176          //*-----------------------------------------------------------------------------
 177          void I2CTxSendBit (I2Cdesc *I2C_pt){
 178   1          unsigned char bit_val;
 179   1          SCL_CLR();              //* Clear SCL line
C51 COMPILER V7.06   ISR_I2C                                                               10/29/2006 14:34:14 PAGE 4   

 180   1          I2C_pt->countBit--;                                                                     //* decrement countBit
 181   1          if(I2C_pt->countBit >= 0){                              //* if bit counter = 0 ...
 182   2                      bit_val = (I2C_pt->I2CByte >> I2C_pt->countBit) & 1;    //* get bit to transfert
 183   2                      //* Send 0 or 1
 184   2                      if (bit_val){
 185   3                  SDA_SET();          //* Set SDA line
 186   3                      }
 187   2         else{
 188   3                          SDA_CLR();      //* Clear SDA line
 189   3                      }
 190   2                      //* change interrupt handler to I2CTxSetSCL

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -