📄 twi.lis
字号:
00D2 03C0 xjmp L12
00D4 L31:
00D4 .dbline 79
00D4 ; }
00D4 ;
00D4 ; /*stop 停止*/
00D4 ; TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
00D4 84E9 ldi R24,148
00D6 86BF out 0x36,R24
00D8 .dbline 80
00D8 ; return 1;
00D8 01E0 ldi R16,1
00DA .dbline -2
00DA L12:
00DA 0E940000 xcall pop_gset2
00DE .dbline 0 ; func end
00DE 0895 ret
00E0 .dbsym r dd 20 c
00E0 .dbsym r addr 22 c
00E0 .dbend
00E0 .dbfunc e twi_read _twi_read fc
00E0 ; dd -> R20,R21
00E0 ; addr -> R22
.even
00E0 _twi_read::
00E0 0E940000 xcall push_gset2
00E4 A901 movw R20,R18
00E6 602F mov R22,R16
00E8 .dbline -1
00E8 .dbline 84
00E8 ; }
00E8 ;
00E8 ; /*I2C总线单字节读取*/
00E8 ; unsigned char twi_read(unsigned char addr, unsigned char *dd) {
00E8 .dbline 86
00E8 ;
00E8 ; TWBR = 2;
00E8 82E0 ldi R24,2
00EA 80B9 out 0x0,R24
00EC .dbline 89
00EC ;
00EC ; /*start 启动*/
00EC ; TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
00EC 84EA ldi R24,164
00EE 86BF out 0x36,R24
00F0 L34:
00F0 .dbline 90
00F0 L35:
00F0 .dbline 90
00F0 ; while(!(TWCR&(1<<TWINT)));
00F0 26B6 in R2,0x36
00F2 27FE sbrs R2,7
00F4 FDCF rjmp L34
00F6 .dbline 91
00F6 ; if ((TWSR & 0xF8) != 0x08) {
00F6 81B1 in R24,0x1
00F8 887F andi R24,248
00FA 8830 cpi R24,8
00FC 21F0 breq L37
00FE .dbline 91
00FE .dbline 92
00FE ; error(TWSR);
00FE 01B1 in R16,0x1
0100 7FDF xcall _error
0102 .dbline 93
0102 ; return 0;
0102 0027 clr R16
0104 4CC0 xjmp L33
0106 L37:
0106 .dbline 97
0106 ; }
0106 ;
0106 ; /*SLA_W 芯片地址*/
0106 ; TWDR = 0xA0;
0106 80EA ldi R24,160
0108 83B9 out 0x3,R24
010A .dbline 98
010A ; TWCR = (1 << TWINT) | (1 << TWEN);
010A 84E8 ldi R24,132
010C 86BF out 0x36,R24
010E L39:
010E .dbline 99
010E L40:
010E .dbline 99
010E ; while (!(TWCR & (1 << TWINT)));
010E 26B6 in R2,0x36
0110 27FE sbrs R2,7
0112 FDCF rjmp L39
0114 .dbline 100
0114 ; if ((TWSR & 0xF8) != 0x18) {
0114 81B1 in R24,0x1
0116 887F andi R24,248
0118 8831 cpi R24,24
011A 21F0 breq L42
011C .dbline 100
011C .dbline 101
011C ; error(TWSR);
011C 01B1 in R16,0x1
011E 70DF xcall _error
0120 .dbline 102
0120 ; return 0;
0120 0027 clr R16
0122 3DC0 xjmp L33
0124 L42:
0124 .dbline 106
0124 ; }
0124 ;
0124 ; /*addr 操作地址*/
0124 ; TWDR = addr;
0124 63B9 out 0x3,R22
0126 .dbline 107
0126 ; TWCR = (1 << TWINT) | (1 << TWEN);
0126 84E8 ldi R24,132
0128 86BF out 0x36,R24
012A L44:
012A .dbline 108
012A L45:
012A .dbline 108
012A ; while (!(TWCR & (1 << TWINT)));
012A 26B6 in R2,0x36
012C 27FE sbrs R2,7
012E FDCF rjmp L44
0130 .dbline 109
0130 ; if ((TWSR & 0xF8) != 0x28) {
0130 81B1 in R24,0x1
0132 887F andi R24,248
0134 8832 cpi R24,40
0136 21F0 breq L47
0138 .dbline 109
0138 .dbline 110
0138 ; error(TWSR);
0138 01B1 in R16,0x1
013A 62DF xcall _error
013C .dbline 111
013C ; return 0;
013C 0027 clr R16
013E 2FC0 xjmp L33
0140 L47:
0140 .dbline 115
0140 ; }
0140 ;
0140 ; /*start 启动*/
0140 ; TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
0140 84EA ldi R24,164
0142 86BF out 0x36,R24
0144 L49:
0144 .dbline 116
0144 L50:
0144 .dbline 116
0144 ; while (!(TWCR & (1 << TWINT)));
0144 26B6 in R2,0x36
0146 27FE sbrs R2,7
0148 FDCF rjmp L49
014A .dbline 117
014A ; if ((TWSR & 0xF8) != 0x10) {
014A 81B1 in R24,0x1
014C 887F andi R24,248
014E 8031 cpi R24,16
0150 21F0 breq L52
0152 .dbline 117
0152 .dbline 118
0152 ; error(TWSR);
0152 01B1 in R16,0x1
0154 55DF xcall _error
0156 .dbline 119
0156 ; return 0;
0156 0027 clr R16
0158 22C0 xjmp L33
015A L52:
015A .dbline 123
015A ; }
015A ;
015A ; /*SLA_R 芯片地址*/
015A ; TWDR = 0xA1;
015A 81EA ldi R24,161
015C 83B9 out 0x3,R24
015E .dbline 124
015E ; TWCR = (1 << TWINT) | (1 << TWEN);
015E 84E8 ldi R24,132
0160 86BF out 0x36,R24
0162 L54:
0162 .dbline 125
0162 L55:
0162 .dbline 125
0162 ; while (!(TWCR & (1 << TWINT)));
0162 26B6 in R2,0x36
0164 27FE sbrs R2,7
0166 FDCF rjmp L54
0168 .dbline 126
0168 ; if ((TWSR & 0xF8) != 0x40) {
0168 81B1 in R24,0x1
016A 887F andi R24,248
016C 8034 cpi R24,64
016E 21F0 breq L57
0170 .dbline 126
0170 .dbline 127
0170 ; error(TWSR);
0170 01B1 in R16,0x1
0172 46DF xcall _error
0174 .dbline 128
0174 ; return 0;
0174 0027 clr R16
0176 13C0 xjmp L33
0178 L57:
0178 .dbline 132
0178 ; }
0178 ;
0178 ; /*读取数据*/
0178 ; TWCR = (1 << TWINT) | (1 << TWEN);
0178 84E8 ldi R24,132
017A 86BF out 0x36,R24
017C L59:
017C .dbline 133
017C L60:
017C .dbline 133
017C ; while (!(TWCR & (1 << TWINT)));
017C 26B6 in R2,0x36
017E 27FE sbrs R2,7
0180 FDCF rjmp L59
0182 .dbline 134
0182 ; if ((TWSR & 0xF8) != 0x58) {
0182 81B1 in R24,0x1
0184 887F andi R24,248
0186 8835 cpi R24,88
0188 21F0 breq L62
018A .dbline 134
018A .dbline 135
018A ; error(TWSR);
018A 01B1 in R16,0x1
018C 39DF xcall _error
018E .dbline 136
018E ; return 0;
018E 0027 clr R16
0190 06C0 xjmp L33
0192 L62:
0192 .dbline 138
0192 ; }
0192 ; *dd = TWDR;
0192 23B0 in R2,0x3
0194 FA01 movw R30,R20
0196 2082 std z+0,R2
0198 .dbline 141
0198 ;
0198 ; /*stop 停止*/
0198 ; TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);
0198 84E9 ldi R24,148
019A 86BF out 0x36,R24
019C .dbline 142
019C ; return 1;
019C 01E0 ldi R16,1
019E .dbline -2
019E L33:
019E 0E940000 xcall pop_gset2
01A2 .dbline 0 ; func end
01A2 0895 ret
01A4 .dbsym r dd 20 pc
01A4 .dbsym r addr 22 c
01A4 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -