📄 gsm.lst
字号:
029D B388 IN R24,0x18
029E 7D8F ANDI R24,0xDF
029F BB88 OUT 0x18,R24
02A0 D125 RCALL 0x03C6
(0055) req_flag=1;
(0056) start_flag=0;
(0057) vision_flag=0;
(0058) cmd_flag=0;
(0059) cmd_num=0;
02A1 92200061 STS cmd_num,R2
(0060) }
(0061) if(cmd==0x0f) //接收到握手结束位 置标记
02A3 91800060 LDS R24,cmd
02A5 308F CPI R24,0xF
02A6 F431 BNE 0x02AD
(0062) {
(0063) start_flag=1;
02A7 E081 LDI R24,1
02A8 93800066 STS start_flag,R24
(0064) PWRON;
02AA B388 IN R24,0x18
02AB 7D8F ANDI R24,0xDF
02AC BB88 OUT 0x18,R24
(0065) }
(0066) if(cmd==0x05 && cmd_num==2)
02AD 91800060 LDS R24,cmd
02AF 3085 CPI R24,5
02B0 F439 BNE 0x02B8
02B1 91800061 LDS R24,cmd_num
02B3 3082 CPI R24,2
02B4 F419 BNE 0x02B8
(0067) {
(0068) vision_flag=1;
02B5 E081 LDI R24,1
02B6 93800067 STS vision_flag,R24
(0069) }
(0070) Twi_ACK();
02B8 EC85 LDI R24,0xC5
02B9 BF86 OUT 0x36,R24
(0071) if(cmd==0xff) //接受到主机发送数据结束位 置标记
02BA 91800060 LDS R24,cmd
02BC 3F8F CPI R24,0xFF
02BD F009 BEQ 0x02BF
02BE C0C6 RJMP 0x0385
(0072) {
(0073) cmd_flag=1;
02BF E081 LDI R24,1
02C0 93800068 STS cmd_flag,R24
(0074) }
(0075) break;
02C2 C0C2 RJMP 0x0385
(0076) }
(0077) case SR_DATA_NOACK://SR_DATA_NOACK=0x88;以前以自己的 SLA+W 被寻址;数据已经被接收,NOT ACK 已返回
(0078) {
(0079) cmd=TWDR;
02C3 B023 IN R2,0x03
02C4 92200060 STS cmd,R2
(0080) buf[cmd_num]=cmd;
02C6 EF8A LDI R24,0xFA
02C7 E090 LDI R25,0
02C8 91E00061 LDS R30,cmd_num
02CA 27FF CLR R31
02CB 0FE8 ADD R30,R24
02CC 1FF9 ADC R31,R25
02CD 8220 STD Z+0,R2
(0081) cmd_num++;
02CE 91800061 LDS R24,cmd_num
02D0 5F8F SUBI R24,0xFF
02D1 93800061 STS cmd_num,R24
(0082) if(cmd==0x00 && cmd_num==2) //接收到主机请求数据结束位 置标记
02D3 90200060 LDS R2,cmd
02D5 2022 TST R2
02D6 F441 BNE 0x02DF
02D7 3082 CPI R24,2
02D8 F431 BNE 0x02DF
02D9 D0EC RCALL 0x03C6
(0083) {
(0084) req_flag=1;
(0085) start_flag=0;
(0086) vision_flag=0;
(0087) cmd_flag=0;
(0088) PWRON;
02DA B388 IN R24,0x18
02DB 7D8F ANDI R24,0xDF
02DC BB88 OUT 0x18,R24
(0089) cmd_num=0;
02DD 92200061 STS cmd_num,R2
(0090) }
(0091) if(cmd==0x0f) //接收到握手结束位 置标记
02DF 91800060 LDS R24,cmd
02E1 308F CPI R24,0xF
02E2 F431 BNE 0x02E9
(0092) {
(0093) start_flag=1;
02E3 E081 LDI R24,1
02E4 93800066 STS start_flag,R24
(0094) PWRON;
02E6 B388 IN R24,0x18
02E7 7D8F ANDI R24,0xDF
02E8 BB88 OUT 0x18,R24
(0095) }
(0096) if(cmd==0x05 && cmd_num==2)
02E9 91800060 LDS R24,cmd
02EB 3085 CPI R24,5
02EC F439 BNE 0x02F4
02ED 91800061 LDS R24,cmd_num
02EF 3082 CPI R24,2
02F0 F419 BNE 0x02F4
(0097) {
(0098) vision_flag=1;
02F1 E081 LDI R24,1
02F2 93800067 STS vision_flag,R24
(0099) }
(0100) Twi_ACK();
02F4 EC85 LDI R24,0xC5
02F5 BF86 OUT 0x36,R24
(0101) if(cmd==0xff) //接受到主机发送数据结束位 置标记
02F6 91800060 LDS R24,cmd
02F8 3F8F CPI R24,0xFF
02F9 F009 BEQ 0x02FB
02FA C08A RJMP 0x0385
(0102) {
(0103) cmd_flag=1;
02FB E081 LDI R24,1
02FC 93800068 STS cmd_flag,R24
(0104) }
(0105) break;
02FE C086 RJMP 0x0385
(0106) }
(0107) case SR_ALL_DATA_ACK://SR_ALL_DATA_ACK=0x90;以前以广播方式被寻址;数据已经被接收,ACK 已返回
(0108) {
(0109) cmd=TWDR;
02FF B023 IN R2,0x03
0300 92200060 STS cmd,R2
(0110) buf[cmd_num]=cmd;
0302 EF8A LDI R24,0xFA
0303 E090 LDI R25,0
0304 91E00061 LDS R30,cmd_num
0306 27FF CLR R31
0307 0FE8 ADD R30,R24
0308 1FF9 ADC R31,R25
0309 8220 STD Z+0,R2
(0111) cmd_num++;
030A 91800061 LDS R24,cmd_num
030C 5F8F SUBI R24,0xFF
030D 93800061 STS cmd_num,R24
(0112) if(cmd==0x00 && cmd_num==2) //接收到主机请求数据结束位 置标记
030F 90200060 LDS R2,cmd
0311 2022 TST R2
0312 F441 BNE 0x031B
0313 3082 CPI R24,2
0314 F431 BNE 0x031B
0315 D0B0 RCALL 0x03C6
(0113) {
(0114) req_flag=1;
(0115) start_flag=0;
(0116) vision_flag=0;
(0117) cmd_flag=0;
(0118) PWRON;
0316 B388 IN R24,0x18
0317 7D8F ANDI R24,0xDF
0318 BB88 OUT 0x18,R24
(0119) cmd_num=0;
0319 92200061 STS cmd_num,R2
(0120) }
(0121) if(cmd==0x0f) //接收到握手结束位 置标记
031B 91800060 LDS R24,cmd
031D 308F CPI R24,0xF
031E F431 BNE 0x0325
(0122) {
(0123) start_flag=1;
031F E081 LDI R24,1
0320 93800066 STS start_flag,R24
(0124) PWRON;
0322 B388 IN R24,0x18
0323 7D8F ANDI R24,0xDF
0324 BB88 OUT 0x18,R24
(0125) }
(0126) if(cmd==0x05 && cmd_num==2)
0325 91800060 LDS R24,cmd
0327 3085 CPI R24,5
0328 F439 BNE 0x0330
0329 91800061 LDS R24,cmd_num
032B 3082 CPI R24,2
032C F419 BNE 0x0330
(0127) {
(0128) vision_flag=1;
032D E081 LDI R24,1
032E 93800067 STS vision_flag,R24
(0129) }
(0130) Twi_ACK();
0330 EC85 LDI R24,0xC5
0331 BF86 OUT 0x36,R24
(0131) if(cmd==0xff) //接受到主机发送数据结束位 置标记
0332 91800060 LDS R24,cmd
0334 3F8F CPI R24,0xFF
0335 F009 BEQ 0x0337
0336 C04E RJMP 0x0385
(0132) {
(0133) cmd_flag=1;
0337 E081 LDI R24,1
0338 93800068 STS cmd_flag,R24
(0134) }
(0135) break;
033A C04A RJMP 0x0385
(0136) }
(0137) case SR_ALL_DATA_NOACK://SR_ALL_DATA_NOACK=0x98;以前以广播方式被寻址;数据已经被接收,NOT ACK 已返回
(0138) {
(0139) cmd=TWDR;
033B B023 IN R2,0x03
033C 92200060 STS cmd,R2
(0140) buf[cmd_num]=cmd;
033E EF8A LDI R24,0xFA
033F E090 LDI R25,0
0340 91E00061 LDS R30,cmd_num
0342 27FF CLR R31
0343 0FE8 ADD R30,R24
0344 1FF9 ADC R31,R25
0345 8220 STD Z+0,R2
(0141) cmd_num++;
0346 91800061 LDS R24,cmd_num
0348 5F8F SUBI R24,0xFF
0349 93800061 STS cmd_num,R24
(0142) if(cmd==0x00 && cmd_num==2) //接收到主机请求数据结束位 置标记
034B 90200060 LDS R2,cmd
034D 2022 TST R2
034E F441 BNE 0x0357
034F 3082 CPI R24,2
0350 F431 BNE 0x0357
0351 D074 RCALL 0x03C6
(0143) {
(0144) req_flag=1;
(0145) start_flag=0;
(0146) vision_flag=0;
(0147) cmd_flag=0;
(0148) PWRON;
0352 B388 IN R24,0x18
0353 7D8F ANDI R24,0xDF
0354 BB88 OUT 0x18,R24
(0149) cmd_num=0;
0355 92200061 STS cmd_num,R2
(0150) }
(0151) if(cmd==0x0f) //接收到握手结束位 置标记
0357 91800060 LDS R24,cmd
0359 308F CPI R24,0xF
035A F431 BNE 0x0361
(0152) {
(0153) start_flag=1;
035B E081 LDI R24,1
035C 93800066 STS start_flag,R24
(0154) PWRON;
035E B388 IN R24,0x18
035F 7D8F ANDI R24,0xDF
0360 BB88 OUT 0x18,R24
(0155) }
(0156) if(cmd==0x05 && cmd_num==2)
0361 91800060 LDS R24,cmd
0363 3085 CPI R24,5
0364 F439 BNE 0x036C
0365 91800061 LDS R24,cmd_num
0367 3082 CPI R24,2
0368 F419 BNE 0x036C
(0157) {
(0158) vision_flag=1;
0369 E081 LDI R24,1
036A 93800067 STS vision_flag,R24
(0159) }
(0160) Twi_ACK();
036C EC85 LDI R24,0xC5
036D BF86 OUT 0x36,R24
(0161) if(cmd==0xff) //接受到主机发送数据结束位 置标记
036E 91800060 LDS R24,cmd
0370 3F8F CPI R24,0xFF
0371 F009 BEQ 0x0373
0372 C012 RJMP 0x0385
(0162) {
(0163) cmd_flag=1;
0373 E081 LDI R24,1
0374 93800068 STS cmd_flag,R24
(0164) }
(0165) break;
0376 C00E RJMP 0x0385
(0166) }
(0167) //*****************************从机发送************************/
(0168) case ST_SLA_ACK://SR_STOP_RESTART=0xa8, 自己的SLA+R 已经被接收,ACK 已返回
(0169) {
(0170) Twi_WB(*(data+j)); //从机发送数据
0377 D03B RCALL <created procedures>
(0171) j++; //准备下一个数据
(0172) break;
0378 C00C RJMP 0x0385
(0173) }
(0174) case MT_ST_SLA_ACK://SR_STOP_RESTART=0xb0, SLA+R/W 作为主机的仲裁失败;自己的SLA+R 已经被接收,ACK 已返回
(0175) {
(0176) Twi_WB(*(data+j)); //从机发送数据
0379 D039 RCALL <created procedures>
(0177) j++; //准备下一个数据
(0178) break;
037A C00A RJMP 0x0385
(0179) }
(0180) case ST_DATA_ACK://SR_STOP_RESTART=0xb8, TWDR 里数据已经发送,接收到ACK
(0181) {
(0182) Twi_WB(*(data+j)); //从机发送数据
037B D037 RCALL <created procedures>
(0183) j++; //准备下一个数据
(0184) break;
037C C008 RJMP 0x0385
(0185) }
(0186) case ST_DATA_NOACK://SR_STOP_RESTART=0xc0, TWDR 里数据已经发送,接收到NOT ACK
(0187) {
(0188) j=0; //发送完数据请零结束
037D D061 RCALL 0x03DF
(0189) Twi_ACK();
(0190) break;
037E C006 RJMP 0x0385
(0191) }
(0192) case ST_LAST_DATA_ACK://SR_STOP_RESTART=0xc8, TWDR 的一字节数据已经发送,(TWAE = “0”);接收到ACK
(0193) {
(0194) j=0;//发送完数据请零结束
037F D05F RCALL 0x03DF
(0195) Twi_ACK();
(0196) break;
0380 C004 RJMP 0x0385
(0197) }
(0198) case SR_STOP_RESTART://SR_STOP_RESTART=0xa0, 在以从机工作时接收到STOP或重复START
(0199) {
(0200) j=0;
0381 D05D RCALL 0x03DF
(0201) Twi_ACK();
(0202) break;
0382 C002 RJMP 0x0385
(0203) }
(0204) default:
(0205) {
(0206) Stop();//从机模式恢复TWI响应能力
0383 E985 LDI R24,0x95
0384 BF86 OUT 0x36,R24
(0207) break;
FILE: <library>
0385 9029 LD R2,Y+
0386 BE2F OUT 0x3F,R2
0387 91F9 LD R31,Y+
0388 91E9 LD R30,Y+
0389 9199 LD R25,Y+
038A 9189 LD R24,Y+
038B 9119 LD R17,Y+
038C 9109 LD R16,Y+
038D 9039 LD R3,Y+
038E 9029 LD R2,Y+
038F 9518 RETI
pop_gset2:
0390 E0E2 LDI R30,2
0391 C00E RJMP pop
pop_gset3:
0392 E0E4 LDI R30,4
0393 C00C RJMP pop
push_gset5:
0394 92FA ST R15,-Y
0395 92EA ST R14,-Y
push_gset4:
0396 92DA ST R13,-Y
0397 92CA ST R12,-Y
push_gset3:
0398 92BA ST R11,-Y
0399 92AA ST R10,-Y
push_gset2:
039A 937A ST R23,-Y
039B 936A ST R22,-Y
push_gset1:
039C 935A ST R21,-Y
039D 934A ST R20,-Y
039E 9508 RET
pop_gset1:
039F E0E1 LDI R30,1
pop:
03A0 9149 LD R20,Y+
03A1 9159 LD R21,Y+
03A2 FDE0 SBRC R30,0
03A3 9508 RET
03A4 9169 LD R22,Y+
03A5 9179 LD R23,Y+
03A6 FDE1 SBRC R30,1
03A7 9508 RET
03A8 90A9 LD R10,Y+
03A9 90B9 LD R11,Y+
03AA FDE2 SBRC R30,2
03AB 9508 RET
03AC 90C9 LD R12,Y+
03AD 90D9 LD R13,Y+
03AE FDE3 SBRC R30,3
03AF 9508 RET
03B0 90E9 LD R14,Y+
03B1 90F9 LD R15,Y+
03B2 9508 RET
<created procedures>:
03B3 902000F8 LDS R2,data
03B5 903000F9 LDS R3,data+1
03B7 91E00063 LDS R30,j
03B9 27FF CLR R31
03BA 0DE2 ADD R30,R2
03BB 1DF3 ADC R31,R3
03BC 8020 LDD R2,Z+0
03BD B823 OUT 0x03,R2
03BE EC85 LDI R24,0xC5
03BF BF86 OUT 0x36,R24
03C0 91800063 LDS R24,j
03C2 5F8F SUBI R24,0xFF
03C3 93800063 STS j,R24
03C5 9508 RET
03C6 E081 LDI R24,1
03C7 93800065 STS req_flag,R24
03C9 2422 CLR R2
03CA 92200066 STS start_flag,R2
03CC 92200067 STS vision_flag,R2
03CE 92200068 STS cmd_flag,R2
03D0 9508 RET
03D1 E090 LDI R25,0
03D2 939000F9 STS data+1,R25
03D4 938000F8 STS data,R24
03D6 9508 RET
03D7 EF8C LDI R24,0xFC
03D8 E090 LDI R25,0
03D9 91E00064 LDS R30,xk
03DB 27FF CLR R31
03DC 0FE8 ADD R30,R24
03DD 1FF9 ADC R31,R25
03DE 9508 RET
03DF 2422 CLR R2
03E0 92200063 STS j,R2
03E2 EC85 LDI R24,0xC5
03E3 BF86 OUT 0x36,R24
03E4 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -