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

📄 i2c.lis

📁 本人改编和测试过的用于AVR mega128关于I2C总线的应用实例--使用EEPROM的读写方法。采用ICCAVR编译器实验。
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 0074           ;         }
 0074           L17:
 0074                   .dbline 120
 0074 6395              inc R22
 0076           L19:
 0076                   .dbline 120
 0076 6830              cpi R22,8
 0078 B0F3              brlo L16
 007A           X4:
 007A                   .dbline 136
 007A           ; 
 007A           ;  // *** No ACK *** //
 007A           ;  
 007A           ;  I2C_Clock();                                                // Clock I2C bit
 007A D2DF              xcall _I2C_Clock
 007C                   .dbline 138
 007C           ;       
 007C           ;  return buff;                                                    // Return our I2C byte
 007C 042F              mov R16,R20
 007E                   .dbline -2
 007E           L15:
 007E                   .dbline 0 ; func end
 007E 6991              ld R22,y+
 0080 4991              ld R20,y+
 0082 0895              ret
 0084                   .dbsym r i 22 c
 0084                   .dbsym r buff 20 c
 0084                   .dbend
 0084                   .dbfunc e I2C_Ackn _I2C_Ackn fc
 0084           ;           Ackn -> R16
                        .even
 0084           _I2C_Ackn::
 0084                   .dbline -1
 0084                   .dbline 149
 0084           ; }
 0084           ; 
 0084           ; 
 0084           ; 
 0084           ; 
 0084           ; // *********************************************************************** //
 0084           ; // *** This routine returns a 0 if the I2C device sends an acknowledge *** //
 0084           ; // *********************************************************************** //
 0084           ; 
 0084           ; unsigned char I2C_Ackn(void)
 0084           ; {
 0084                   .dbline 150
 0084           ;  unsigned char Ackn = 0;                 // Temp RAM for Ackn flag
 0084 0027              clr R16
 0086                   .dbline 152
 0086           ;       
 0086           ;  CLEARBIT(I2C_PORT,SCL);
 0086 5898              cbi 0xb,0
 0088                   .dbline 153
 0088           ;  CLEARBIT(I2C_DIR,SDA);                  // Set SDA to input  
 0088 5198              cbi 0xa,1
 008A                   .dbline 155
 008A           ;  
 008A           ;  SETBIT(I2C_PORT,SCL);                           // Clock the ACK bit
 008A 589A              sbi 0xb,0
 008C                   .dbline 157
 008C           ; 
 008C           ;  if ( CHECKBIT( I2C_IN,SDA ) ) Ackn = 1;        // Check the ACK bit on SDA   
 008C 499B              sbis 0x9,1
 008E 01C0              rjmp L23
 0090           X5:
 0090                   .dbline 157
 0090 01E0              ldi R16,1
 0092           L23:
 0092                   .dbline 159
 0092           ;  
 0092           ;  CLEARBIT(I2C_PORT,SCL);                 // Clear the clock
 0092 5898              cbi 0xb,0
 0094                   .dbline 161
 0094           ; 
 0094           ;  return Ackn;                                    // Return our ACK bit
 0094                   .dbline -2
 0094           L22:
 0094                   .dbline 0 ; func end
 0094 0895              ret
 0096                   .dbsym r Ackn 16 c
 0096                   .dbend
 0096                   .dbfunc e Write_I2C_Control _Write_I2C_Control fV
 0096           ;             RW -> y+2
 0096           ;          H_ADD -> R20
 0096           ;         D_Code -> R22
                        .even
 0096           _Write_I2C_Control::
 0096 4A93              st -y,R20
 0098 6A93              st -y,R22
 009A 422F              mov R20,R18
 009C 602F              mov R22,R16
 009E                   .dbline -1
 009E                   .dbline 175
 009E           ; }     
 009E           ; 
 009E           ; 
 009E           ; 
 009E           ; 
 009E           ; 
 009E           ; // ***************************************************** //
 009E           ; // *** This routine will write the I2C device code,  *** //
 009E           ; // *** set the device chip select bits,                        *** //
 009E           ; // *** and set or clear the I2C R/W bit                                *** //
 009E           ; // ***************************************************** //
 009E           ; 
 009E           ; void Write_I2C_Control(unsigned char D_Code,unsigned char H_ADD,unsigned char RW)
 009E           ; {
 009E                   .dbline 179
 009E           ; 
 009E           ;  // *** Send the I2C device Control code *** //
 009E           ; 
 009E           ;  CLEARBIT(I2C_PORT,SCL);                 // Clear SCL clock
 009E 5898              cbi 0xb,0
 00A0                   .dbline 181
 00A0           ;  
 00A0           ;  if( (D_Code & 0x08) == 0x08) SETBIT(I2C_PORT, SDA);  // Set I2C SDA PIN
 00A0 862F              mov R24,R22
 00A2 8870              andi R24,8
 00A4 8830              cpi R24,8
 00A6 11F4              brne L26
 00A8           X6:
 00A8                   .dbline 181
 00A8 599A              sbi 0xb,1
 00AA 01C0              xjmp L27
 00AC           L26:
 00AC                   .dbline 182
 00AC           ;  else CLEARBIT(I2C_PORT,SDA);                                                 // Clear I2C SDA PIN
 00AC 5998              cbi 0xb,1
 00AE           L27:
 00AE                   .dbline 184
 00AE           ; 
 00AE           ;  I2C_Clock();                 // Clock I2C bit
 00AE B8DF              xcall _I2C_Clock
 00B0                   .dbline 186
 00B0           ;  
 00B0           ;  if( (D_Code & 0x04) == 0x04) SETBIT(I2C_PORT, SDA);  // Set I2C SDA PIN
 00B0 862F              mov R24,R22
 00B2 8470              andi R24,4
 00B4 8430              cpi R24,4
 00B6 11F4              brne L28
 00B8           X7:
 00B8                   .dbline 186
 00B8 599A              sbi 0xb,1
 00BA 01C0              xjmp L29
 00BC           L28:
 00BC                   .dbline 187
 00BC           ;  else CLEARBIT(I2C_PORT,SDA);                                                 // Clear I2C SDA PIN
 00BC 5998              cbi 0xb,1
 00BE           L29:
 00BE                   .dbline 189
 00BE           ; 
 00BE           ;  I2C_Clock();                 // Clock I2C bit
 00BE B0DF              xcall _I2C_Clock
 00C0                   .dbline 191
 00C0           ;       
 00C0           ;  if( (D_Code & 0x02) == 0x02) SETBIT(I2C_PORT, SDA);  // Set I2C SDA PIN
 00C0 862F              mov R24,R22
 00C2 8270              andi R24,2
 00C4 8230              cpi R24,2
 00C6 11F4              brne L30
 00C8           X8:
 00C8                   .dbline 191
 00C8 599A              sbi 0xb,1
 00CA 01C0              xjmp L31
 00CC           L30:
 00CC                   .dbline 192
 00CC           ;  else CLEARBIT(I2C_PORT,SDA);                                                 // Clear I2C SDA PIN
 00CC 5998              cbi 0xb,1
 00CE           L31:
 00CE                   .dbline 194
 00CE           ; 
 00CE           ;  I2C_Clock();                 // Clock I2C bit
 00CE A8DF              xcall _I2C_Clock
 00D0                   .dbline 196
 00D0           ;  
 00D0           ;  if( (D_Code & 0x01) == 0x01) SETBIT(I2C_PORT, SDA);  // Set I2C SDA PIN
 00D0 862F              mov R24,R22
 00D2 8170              andi R24,1
 00D4 8130              cpi R24,1
 00D6 11F4              brne L32
 00D8           X9:
 00D8                   .dbline 196
 00D8 599A              sbi 0xb,1
 00DA 01C0              xjmp L33
 00DC           L32:
 00DC                   .dbline 197
 00DC           ;  else CLEARBIT(I2C_PORT,SDA);                                                 // Clear I2C SDA PIN
 00DC 5998              cbi 0xb,1
 00DE           L33:
 00DE                   .dbline 199
 00DE           ; 
 00DE           ;  I2C_Clock();                 // Clock I2C bit
 00DE A0DF              xcall _I2C_Clock
 00E0                   .dbline 205
 00E0           ; 
 00E0           ;  
 00E0           ;  
 00E0           ;  // *** Send the I2C Control byte chip selects bits *** //
 00E0           ; 
 00E0           ;  if( (H_ADD & 0x04) == 0x04) SETBIT(I2C_PORT, SDA);           // Set I2C SDA PIN
 00E0 842F              mov R24,R20
 00E2 8470              andi R24,4
 00E4 8430              cpi R24,4
 00E6 11F4              brne L34
 00E8           X10:
 00E8                   .dbline 205
 00E8 599A              sbi 0xb,1
 00EA 01C0              xjmp L35
 00EC           L34:
 00EC                   .dbline 206
 00EC           ;  else CLEARBIT(I2C_PORT,SDA);                                                 // Clear I2C SDA PIN
 00EC 5998              cbi 0xb,1
 00EE           L35:
 00EE                   .dbline 208
 00EE           ; 
 00EE           ;  I2C_Clock();                 // Clock I2C bit
 00EE 98DF              xcall _I2C_Clock
 00F0                   .dbline 210
 00F0           ;       
 00F0           ;  if( (H_ADD & 0x02) == 0x02) SETBIT(I2C_PORT, SDA);           // Set I2C SDA PIN
 00F0 842F              mov R24,R20
 00F2 8270              andi R24,2
 00F4 8230              cpi R24,2
 00F6 11F4              brne L36
 00F8           X11:
 00F8                   .dbline 210
 00F8 599A              sbi 0xb,1
 00FA 01C0              xjmp L37
 00FC           L36:
 00FC                   .dbline 211
 00FC           ;  else CLEARBIT(I2C_PORT,SDA);                                                 // Clear I2C SDA PIN
 00FC 5998              cbi 0xb,1
 00FE           L37:
 00FE                   .dbline 213
 00FE           ; 
 00FE           ;  I2C_Clock();                 // Clock I2C bit
 00FE 90DF              xcall _I2C_Clock
 0100                   .dbline 215
 0100           ;  
 0100           ;  if( (H_ADD & 0x01) == 0x01) SETBIT(I2C_PORT, SDA);           // Set I2C SDA PIN
 0100 842F              mov R24,R20
 0102 8170              andi R24,1
 0104 8130              cpi R24,1
 0106 11F4              brne L38
 0108           X12:
 0108                   .dbline 215
 0108 599A              sbi 0xb,1
 010A 01C0              xjmp L39
 010C           L38:
 010C                   .dbline 216
 010C           ;  else CLEARBIT(I2C_PORT,SDA);                                                 // Clear I2C SDA PIN
 010C 5998              cbi 0xb,1
 010E           L39:
 010E                   .dbline 218
 010E           ; 
 010E           ;  I2C_Clock();                 // Clock I2C bit
 010E 88DF              xcall _I2C_Clock
 0110                   .dbline 222
 0110           ;  
 0110           ;  // *** Set or Clear the read / write bit for I2C control *** //
 0110           ;       
 0110           ;  if(RW) SETBIT(I2C_PORT,SDA);                                                  // Set I2C SDA PIN
 0110 0A80              ldd R0,y+2
 0112 0020              tst R0
 0114 11F0              breq L40
 0116           X13:
 0116                   .dbline 222
 0116 599A              sbi 0xb,1
 0118 01C0              xjmp L41
 011A           L40:
 011A                   .dbline 223
 011A           ;  else CLEARBIT(I2C_PORT,SDA);                                                  // Clear I2C SDA PIN
 011A 5998              cbi 0xb,1
 011C           L41:
 011C                   .dbline 225
 011C           ;  
 011C           ;  I2C_Clock();                 // Clock I2C bit
 011C 81DF              xcall _I2C_Clock
 011E           L42:
 011E                   .dbline 227
 011E           ;  
 011E           ;  while(I2C_Ackn() );                             // Check for acknowledge from I2C device
 011E           L43:
 011E                   .dbline 227
 011E B2DF              xcall _I2C_Ackn
 0120 0023              tst R16
 0122 E9F7              brne L42
 0124           X14:
 0124                   .dbline -2
 0124           L25:
 0124                   .dbline 0 ; func end
 0124 6991              ld R22,y+
 0126 4991              ld R20,y+
 0128 0895              ret
 012A                   .dbsym l RW 2 c
 012A                   .dbsym r H_ADD 20 c
 012A                   .dbsym r D_Code 22 c
 012A                   .dbend
 012A           ; }
 012A           ; 

⌨️ 快捷键说明

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