📄 twi.lis
字号:
01C0 ; switch(TWSR_state)
01C0 1127 clr R17
01C2 0038 cpi R16,128
01C4 E0E0 ldi R30,0
01C6 1E07 cpc R17,R30
01C8 09F4 brne X4
01CA 73C0 rjmp L58
01CC X4:
01CC 80E8 ldi R24,128
01CE 90E0 ldi R25,0
01D0 8017 cp R24,R16
01D2 9107 cpc R25,R17
01D4 0CF4 brge X5
01D6 35C0 rjmp L73
01D8 X5:
01D8 L72:
01D8 0834 cpi R16,72
01DA E0E0 ldi R30,0
01DC 1E07 cpc R17,R30
01DE 09F4 brne X6
01E0 7DC0 rjmp L63
01E2 X6:
01E2 88E4 ldi R24,72
01E4 90E0 ldi R25,0
01E6 8017 cp R24,R16
01E8 9107 cpc R25,R17
01EA ACF0 brlt L75
01EC L74:
01EC 0833 cpi R16,56
01EE E0E0 ldi R30,0
01F0 1E07 cpc R17,R30
01F2 09F4 brne X7
01F4 6AC0 rjmp L61
01F6 X7:
01F6 88E3 ldi R24,56
01F8 90E0 ldi R25,0
01FA 8017 cp R24,R16
01FC 9107 cpc R25,R17
01FE 2CF0 brlt L77
0200 L76:
0200 0030 cpi R16,0
0202 0107 cpc R16,R17
0204 09F4 brne X8
0206 97C0 rjmp L71
0208 X8:
0208 X1:
0208 98C0 rjmp L55
020A L77:
020A 0034 cpi R16,64
020C E0E0 ldi R30,0
020E 1E07 cpc R17,R30
0210 09F4 brne X9
0212 61C0 rjmp L62
0214 X9:
0214 92C0 rjmp L55
0216 L75:
0216 0835 cpi R16,88
0218 E0E0 ldi R30,0
021A 1E07 cpc R17,R30
021C 09F4 brne X10
021E 6FC0 rjmp L65
0220 X10:
0220 88E5 ldi R24,88
0222 90E0 ldi R25,0
0224 8017 cp R24,R16
0226 9107 cpc R25,R17
0228 34F0 brlt L79
022A L78:
022A 0035 cpi R16,80
022C E0E0 ldi R30,0
022E 1E07 cpc R17,R30
0230 09F4 brne X11
0232 5AC0 rjmp L64
0234 X11:
0234 82C0 rjmp L55
0236 L79:
0236 0036 cpi R16,96
0238 E0E0 ldi R30,0
023A 1E07 cpc R17,R30
023C 09F4 brne X12
023E 36C0 rjmp L57
0240 X12:
0240 7CC0 rjmp L55
0242 L73:
0242 083B cpi R16,184
0244 E0E0 ldi R30,0
0246 1E07 cpc R17,R30
0248 09F4 brne X13
024A 6CC0 rjmp L67
024C X13:
024C 88EB ldi R24,184
024E 90E0 ldi R25,0
0250 8017 cp R24,R16
0252 9107 cpc R25,R17
0254 ACF0 brlt L81
0256 L80:
0256 003A cpi R16,160
0258 E0E0 ldi R30,0
025A 1E07 cpc R17,R30
025C 09F4 brne X14
025E 32C0 rjmp L60
0260 X14:
0260 80EA ldi R24,160
0262 90E0 ldi R25,0
0264 8017 cp R24,R16
0266 9107 cpc R25,R17
0268 2CF0 brlt L83
026A L82:
026A 0838 cpi R16,136
026C E0E0 ldi R30,0
026E 1E07 cpc R17,R30
0270 31F1 breq L59
0272 63C0 rjmp L55
0274 L83:
0274 083A cpi R16,168
0276 E0E0 ldi R30,0
0278 1E07 cpc R17,R30
027A 09F4 brne X15
027C 4BC0 rjmp L66
027E X15:
027E 5DC0 rjmp L55
0280 L81:
0280 083C cpi R16,200
0282 E0E0 ldi R30,0
0284 1E07 cpc R17,R30
0286 09F4 brne X16
0288 53C0 rjmp L69
028A X16:
028A 88EC ldi R24,200
028C 90E0 ldi R25,0
028E 8017 cp R24,R16
0290 9107 cpc R25,R17
0292 34F0 brlt L85
0294 L84:
0294 003C cpi R16,192
0296 E0E0 ldi R30,0
0298 1E07 cpc R17,R30
029A 09F4 brne X17
029C 46C0 rjmp L68
029E X17:
029E 4DC0 rjmp L55
02A0 L85:
02A0 083F cpi R16,248
02A2 E0E0 ldi R30,0
02A4 1E07 cpc R17,R30
02A6 09F4 brne X18
02A8 48C0 rjmp L55
02AA X18:
02AA 47C0 rjmp L55
02AC X2:
02AC .dbline 194
02AC ; {
02AC L57:
02AC .dbline 196
02AC ; //从机接收模式下的中断程序
02AC ; case 0x60: TWCR=0xc5;break; // SLA+W已经接收,ACK已返回(从机被寻址,等待主机发送数据)
02AC 85EC ldi R24,197
02AE 86BF out 0x36,R24
02B0 .dbline 196
02B0 44C0 rjmp L55
02B2 L58:
02B2 .dbline 197
02B2 ; case 0x80: receive_data = TWDR;TWCR=0xc5;break; // 数据已接收,ACK已返回(接收数据)
02B2 23B0 in R2,0x3
02B4 20920000 sts _receive_data,R2
02B8 .dbline 197
02B8 85EC ldi R24,197
02BA 86BF out 0x36,R24
02BC .dbline 197
02BC 3EC0 rjmp L55
02BE L59:
02BE .dbline 198
02BE ; case 0x88: TWCR=0xc5;break; // 数据已接收,NOT ACK已返回(下一步:退出总线)
02BE 85EC ldi R24,197
02C0 86BF out 0x36,R24
02C2 .dbline 198
02C2 3BC0 rjmp L55
02C4 L60:
02C4 .dbline 199
02C4 ; case 0xA0: TWCR=0xc5;break; // 接收到STOP或重复的START信号(停止接收数据)
02C4 85EC ldi R24,197
02C6 86BF out 0x36,R24
02C8 .dbline 199
02C8 38C0 rjmp L55
02CA L61:
02CA .dbline 202
02CA ;
02CA ; //主机接收模式下的中断程序
02CA ; case 0x38: error_state=4;TWCR=0xc5;break; // SLA+R或NOT ACK仲裁失败(下一步:退出总线)
02CA 84E0 ldi R24,4
02CC 80930000 sts _error_state,R24
02D0 .dbline 202
02D0 85EC ldi R24,197
02D2 86BF out 0x36,R24
02D4 .dbline 202
02D4 32C0 rjmp L55
02D6 L62:
02D6 .dbline 203
02D6 ; case 0x40: TWCR=0xc5; break; // SLA+R已发送,接收到ACK(从机被寻址,主机等待接收数据)
02D6 85EC ldi R24,197
02D8 86BF out 0x36,R24
02DA .dbline 203
02DA 2FC0 rjmp L55
02DC L63:
02DC .dbline 204
02DC ; case 0x48: error_state=5;TWCR=0xc5;break; // SLA+R已发送,接收到NOT ACK(下一步:退出总线)
02DC 85E0 ldi R24,5
02DE 80930000 sts _error_state,R24
02E2 .dbline 204
02E2 85EC ldi R24,197
02E4 86BF out 0x36,R24
02E6 .dbline 204
02E6 29C0 rjmp L55
02E8 L64:
02E8 .dbline 205
02E8 ; case 0x50: receive_data = TWDR;_NOP();_NOP();error_state=8;TWCR = 0xc4;break; // 接收到数据,ACK已返回(接收数据)
02E8 23B0 in R2,0x3
02EA 20920000 sts _receive_data,R2
02EE .dbline 205
02EE 0000 nop
02F0 .dbline 205
02F0 0000 nop
02F2 .dbline 205
02F2 88E0 ldi R24,8
02F4 80930000 sts _error_state,R24
02F8 .dbline 205
02F8 84EC ldi R24,196
02FA 86BF out 0x36,R24
02FC .dbline 205
02FC 1EC0 rjmp L55
02FE L65:
02FE .dbline 206
02FE ; case 0x58: receive_data = TWDR;_NOP();_NOP();error_state=8;TWCR = 0xc4;break; // 接收到数据,NOT ACK已返回(下一步:退出总线)
02FE 23B0 in R2,0x3
0300 20920000 sts _receive_data,R2
0304 .dbline 206
0304 0000 nop
0306 .dbline 206
0306 0000 nop
0308 .dbline 206
0308 88E0 ldi R24,8
030A 80930000 sts _error_state,R24
030E .dbline 206
030E 84EC ldi R24,196
0310 86BF out 0x36,R24
0312 .dbline 206
0312 13C0 rjmp L55
0314 L66:
0314 .dbline 209
0314 ;
0314 ; //从机发送模式
0314 ; case 0xA8: TWDR= send_data;_NOP();_NOP();TWCR= 0x85; break; // SLA+R已接收,ACK已返回(从机被寻址,开送发送数据)
0314 20900000 lds R2,_send_data
0318 23B8 out 0x3,R2
031A .dbline 209
031A 0000 nop
031C .dbline 209
031C 0000 nop
031E .dbline 209
031E 85E8 ldi R24,133
0320 86BF out 0x36,R24
0322 .dbline 209
0322 0BC0 rjmp L55
0324 L67:
0324 .dbline 210
0324 ; case 0xB8: TWCR= 0xc5;break; // TWDR里的数据已发送,接受到ACK(主机接收到数据,继续发送数据)
0324 85EC ldi R24,197
0326 86BF out 0x36,R24
0328 .dbline 210
0328 08C0 rjmp L55
032A L68:
032A .dbline 211
032A ; case 0xC0: TWCR= 0xc5;break; // TWDR里的数据已发送,接受到NOT ACK(下一步:退出总线)
032A 85EC ldi R24,197
032C 86BF out 0x36,R24
032E .dbline 211
032E 05C0 rjmp L55
0330 L69:
0330 .dbline 212
0330 ; case 0xC8: TWCR= 0xc5;break; // TWEA=0,接收到ACK(停止发送数据,退出发送)
0330 85EC ldi R24,197
0332 86BF out 0x36,R24
0334 .dbline 212
0334 02C0 rjmp L55
0336 X3:
0336 .dbline 215
0336 ;
0336 ; //其他状态码
0336 ; case 0xf8: break; // 等待或进行当前传输
0336 L71:
0336 .dbline 216
0336 ; case 0x00: TWCR= 0x95;break; // 非法的START或STOP引起的总线错误(释放总线)
0336 85E9 ldi R24,149
0338 86BF out 0x36,R24
033A .dbline 216
033A .dbline 217
033A ; default: break;
033A L55:
033A .dbline 219
033A ; }
033A ; return receive_data; // 返回接收到的数据
033A 00910000 lds R16,_receive_data
033E .dbline -2
033E L53:
033E 2990 ld R2,y+
0340 2FBE out 0x3f,R2
0342 E991 ld R30,y+
0344 9991 ld R25,y+
0346 8991 ld R24,y+
0348 1991 ld R17,y+
034A 0991 ld R16,y+
034C 2990 ld R2,y+
034E .dbline 0 ; func end
034E 1895 reti
0350 .dbsym r TWSR_state 16 c
0350 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -