📄 i2c.lis
字号:
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 + -