📄 14iic.lst
字号:
00ED 90200074 LDS R2,0x74
00EF FE27 SBRS R2,7
00F0 CFFC RJMP 0x00ED
(0055) if ((TWSR & 0xF8) != 0x18) {
00F1 91800071 LDS R24,0x71
00F3 7F88 ANDI R24,0xF8
00F4 3188 CPI R24,0x18
00F5 F029 BEQ 0x00FB
(0056) error(TWSR);
00F6 91000071 LDS R16,0x71
00F8 DFA7 RCALL _error
(0057) return 0;
00F9 2700 CLR R16
00FA C02A RJMP 0x0125
(0058) }
(0059)
(0060) /*addr 操作地址*/
(0061) TWDR = addr;
00FB 93600073 STS 0x73,R22
(0062) TWCR = (1 << TWINT) | (1 << TWEN);
00FD E884 LDI R24,0x84
00FE 93800074 STS 0x74,R24
(0063) while (!(TWCR & (1 << TWINT)));
0100 90200074 LDS R2,0x74
0102 FE27 SBRS R2,7
0103 CFFC RJMP 0x0100
(0064) if ((TWSR & 0xF8) != 0x28) {
0104 91800071 LDS R24,0x71
0106 7F88 ANDI R24,0xF8
0107 3288 CPI R24,0x28
0108 F029 BEQ 0x010E
(0065) error(TWSR);
0109 91000071 LDS R16,0x71
010B DF94 RCALL _error
(0066) return 0;
010C 2700 CLR R16
010D C017 RJMP 0x0125
(0067) }
(0068)
(0069) /*dd 写入数据*/
(0070) TWDR = dd;
010E 93400073 STS 0x73,R20
(0071) TWCR = (1 << TWINT) | (1 << TWEN);
0110 E884 LDI R24,0x84
0111 93800074 STS 0x74,R24
(0072) while (!(TWCR & (1 << TWINT)));
0113 90200074 LDS R2,0x74
0115 FE27 SBRS R2,7
0116 CFFC RJMP 0x0113
(0073) if ((TWSR & 0xF8) != 0x28) {
0117 91800071 LDS R24,0x71
0119 7F88 ANDI R24,0xF8
011A 3288 CPI R24,0x28
011B F029 BEQ 0x0121
(0074) error(TWSR);
011C 91000071 LDS R16,0x71
011E DF81 RCALL _error
(0075) return 0;
011F 2700 CLR R16
0120 C004 RJMP 0x0125
(0076) }
(0077)
(0078) /*stop 停止*/
(0079) TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
0121 E984 LDI R24,0x94
0122 93800074 STS 0x74,R24
(0080) return 1;
0124 E001 LDI R16,1
0125 940E01A8 CALL pop_gset2
0127 9508 RET
_twi_read:
dd --> R20
addr --> R22
0128 940E01B1 CALL push_gset2
012A 01A9 MOVW R20,R18
012B 2F60 MOV R22,R16
(0081) }
(0082)
(0083) /*I2C总线单字节读取*/
(0084) unsigned char twi_read(unsigned char addr, unsigned char *dd) {
(0085)
(0086) TWBR = 2;
012C E082 LDI R24,2
012D 93800070 STS 0x70,R24
(0087)
(0088) /*start 启动*/
(0089) TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
012F EA84 LDI R24,0xA4
0130 93800074 STS 0x74,R24
(0090) while(!(TWCR&(1<<TWINT)));
0132 90200074 LDS R2,0x74
0134 FE27 SBRS R2,7
0135 CFFC RJMP 0x0132
(0091) if ((TWSR & 0xF8) != 0x08) {
0136 91800071 LDS R24,0x71
0138 7F88 ANDI R24,0xF8
0139 3088 CPI R24,0x8
013A F029 BEQ 0x0140
(0092) error(TWSR);
013B 91000071 LDS R16,0x71
013D DF62 RCALL _error
(0093) return 0;
013E 2700 CLR R16
013F C065 RJMP 0x01A5
(0094) }
(0095)
(0096) /*SLA_W 芯片地址*/
(0097) TWDR = 0xA0;
0140 EA80 LDI R24,0xA0
0141 93800073 STS 0x73,R24
(0098) TWCR = (1 << TWINT) | (1 << TWEN);
0143 E884 LDI R24,0x84
0144 93800074 STS 0x74,R24
(0099) while (!(TWCR & (1 << TWINT)));
0146 90200074 LDS R2,0x74
0148 FE27 SBRS R2,7
0149 CFFC RJMP 0x0146
(0100) if ((TWSR & 0xF8) != 0x18) {
014A 91800071 LDS R24,0x71
014C 7F88 ANDI R24,0xF8
014D 3188 CPI R24,0x18
014E F029 BEQ 0x0154
(0101) error(TWSR);
014F 91000071 LDS R16,0x71
0151 DF4E RCALL _error
(0102) return 0;
0152 2700 CLR R16
0153 C051 RJMP 0x01A5
(0103) }
(0104)
(0105) /*addr 操作地址*/
(0106) TWDR = addr;
0154 93600073 STS 0x73,R22
(0107) TWCR = (1 << TWINT) | (1 << TWEN);
0156 E884 LDI R24,0x84
0157 93800074 STS 0x74,R24
(0108) while (!(TWCR & (1 << TWINT)));
0159 90200074 LDS R2,0x74
015B FE27 SBRS R2,7
015C CFFC RJMP 0x0159
(0109) if ((TWSR & 0xF8) != 0x28) {
015D 91800071 LDS R24,0x71
015F 7F88 ANDI R24,0xF8
0160 3288 CPI R24,0x28
0161 F029 BEQ 0x0167
(0110) error(TWSR);
0162 91000071 LDS R16,0x71
0164 DF3B RCALL _error
(0111) return 0;
0165 2700 CLR R16
0166 C03E RJMP 0x01A5
(0112) }
(0113)
(0114) /*start 启动*/
(0115) TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
0167 EA84 LDI R24,0xA4
0168 93800074 STS 0x74,R24
(0116) while (!(TWCR & (1 << TWINT)));
016A 90200074 LDS R2,0x74
016C FE27 SBRS R2,7
016D CFFC RJMP 0x016A
(0117) if ((TWSR & 0xF8) != 0x10) {
016E 91800071 LDS R24,0x71
0170 7F88 ANDI R24,0xF8
0171 3180 CPI R24,0x10
0172 F029 BEQ 0x0178
(0118) error(TWSR);
0173 91000071 LDS R16,0x71
0175 DF2A RCALL _error
(0119) return 0;
0176 2700 CLR R16
0177 C02D RJMP 0x01A5
(0120) }
(0121)
(0122) /*SLA_R 芯片地址*/
(0123) TWDR = 0xA1;
0178 EA81 LDI R24,0xA1
0179 93800073 STS 0x73,R24
(0124) TWCR = (1 << TWINT) | (1 << TWEN);
017B E884 LDI R24,0x84
017C 93800074 STS 0x74,R24
(0125) while (!(TWCR & (1 << TWINT)));
017E 90200074 LDS R2,0x74
0180 FE27 SBRS R2,7
0181 CFFC RJMP 0x017E
(0126) if ((TWSR & 0xF8) != 0x40) {
0182 91800071 LDS R24,0x71
0184 7F88 ANDI R24,0xF8
0185 3480 CPI R24,0x40
0186 F029 BEQ 0x018C
(0127) error(TWSR);
0187 91000071 LDS R16,0x71
0189 DF16 RCALL _error
(0128) return 0;
018A 2700 CLR R16
018B C019 RJMP 0x01A5
(0129) }
(0130)
(0131) /*读取数据*/
(0132) TWCR = (1 << TWINT) | (1 << TWEN);
018C E884 LDI R24,0x84
018D 93800074 STS 0x74,R24
(0133) while (!(TWCR & (1 << TWINT)));
018F 90200074 LDS R2,0x74
0191 FE27 SBRS R2,7
0192 CFFC RJMP 0x018F
(0134) if ((TWSR & 0xF8) != 0x58) {
0193 91800071 LDS R24,0x71
0195 7F88 ANDI R24,0xF8
0196 3588 CPI R24,0x58
0197 F029 BEQ 0x019D
(0135) error(TWSR);
0198 91000071 LDS R16,0x71
019A DF05 RCALL _error
(0136) return 0;
019B 2700 CLR R16
019C C008 RJMP 0x01A5
(0137) }
(0138) *dd = TWDR;
019D 90200073 LDS R2,0x73
019F 01FA MOVW R30,R20
01A0 8220 STD Z+0,R2
(0139)
(0140) /*stop 停止*/
(0141) TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);
01A1 E984 LDI R24,0x94
01A2 93800074 STS 0x74,R24
(0142) return 1;
FILE: <library>
01A4 E001 LDI R16,1
01A5 940E01A8 CALL pop_gset2
01A7 9508 RET
pop_gset2:
01A8 E0E2 LDI R30,2
01A9 940C01B7 JMP pop
push_gset5:
01AB 92FA ST R15,-Y
01AC 92EA ST R14,-Y
push_gset4:
01AD 92DA ST R13,-Y
01AE 92CA ST R12,-Y
push_gset3:
01AF 92BA ST R11,-Y
01B0 92AA ST R10,-Y
push_gset2:
01B1 937A ST R23,-Y
01B2 936A ST R22,-Y
push_gset1:
01B3 935A ST R21,-Y
01B4 934A ST R20,-Y
01B5 9508 RET
pop_gset1:
01B6 E0E1 LDI R30,1
pop:
01B7 9149 LD R20,Y+
01B8 9159 LD R21,Y+
01B9 FDE0 SBRC R30,0
01BA 9508 RET
01BB 9169 LD R22,Y+
01BC 9179 LD R23,Y+
01BD FDE1 SBRC R30,1
01BE 9508 RET
01BF 90A9 LD R10,Y+
01C0 90B9 LD R11,Y+
01C1 FDE2 SBRC R30,2
01C2 9508 RET
01C3 90C9 LD R12,Y+
01C4 90D9 LD R13,Y+
01C5 FDE3 SBRC R30,3
01C6 9508 RET
01C7 90E9 LD R14,Y+
01C8 90F9 LD R15,Y+
01C9 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -