📄 rs485.lst
字号:
016F C001 RJMP 0x0171
0170 E041 LDI R20,1
(0039) inbox[n]=UDR; //把接收到的数据保存到收件箱
0171 E78C LDI R24,0x7C
0172 E090 LDI R25,0
0173 91E00060 LDS R30,n
0175 27FF CLR R31
0176 0FE8 ADD R30,R24
0177 1FF9 ADC R31,R25
0178 B02C IN R2,0x0C
0179 8220 STD Z+0,R2
(0040) n++;
017A 91800060 LDS R24,n
017C 5F8F SUBI R24,0xFF
017D 93800060 STS n,R24
(0041) //记忆接收的次数
(0042)
(0043) if(ERROR) //如果通讯有错....
017F 2344 TST R20
0180 F021 BEQ 0x0185
(0044) {
(0045) //n=0; //接收计数清0
(0046) inbox[0]=0; //把地址改为无效地址0
0181 2422 CLR R2
0182 9220007C STS inbox,R2
(0047) UCSRA|=0x01; //重新打开接收器的地址帧筛选功能
0184 9A58 SBI 0x0B,0
(0048) }
(0049) //如果地址匹配本机或者是广播地址就关闭地址筛选(多机通讯)功能 (关闭是为了保证后面的数据全部接收到)
(0050) if(inbox[0]==address ||inbox[0]==0xff) {UCSRA&=~0x01; }
0185 9180007C LDS R24,inbox
0187 3083 CPI R24,3
0188 F011 BEQ 0x018B
0189 3F8F CPI R24,0xFF
018A F409 BNE 0x018C
018B 9858 CBI 0x0B,0
(0051) if(n==amount) //接收到amount个数据以后...
018C 91800060 LDS R24,n
018E 308A CPI R24,0xA
018F F4D1 BNE 0x01AA
(0052) {
(0053) n=0; //接收计数清0
0190 2422 CLR R2
0191 92200060 STS n,R2
(0054) UCSRA|=0x01; //重新打开接收器的地址帧筛选功能
0193 9A58 SBI 0x0B,0
(0055)
(0056)
(0057)
(0058)
(0059) if(inbox[amount-1]==crc8(inbox,amount-1)) //如果crc8校验正确就...
0194 E029 LDI R18,0x9
0195 E70C LDI R16,0x7C
0196 E010 LDI R17,0
0197 DFA2 RCALL _crc8
0198 90200085 LDS R2,0x85
019A 1620 CP R2,R16
019B F471 BNE 0x01AA
(0060) {
(0061) if(inbox[0]==address)flag_me=1; //本机地址
019C 9180007C LDS R24,inbox
019E 3083 CPI R24,3
019F F419 BNE 0x01A3
01A0 E081 LDI R24,1
01A1 93800061 STS flag_me,R24
(0062) //接收完数据后会置标志位,在读取数据后要把标志位置零
(0063) if(inbox[0]==255) flag_me=1; //广播地址,接收后不要回复
01A3 9180007C LDS R24,inbox
01A5 3F8F CPI R24,0xFF
01A6 F419 BNE 0x01AA
01A7 E081 LDI R24,1
01A8 93800061 STS flag_me,R24
(0064) //接收完数据后会置标志位,在读取数据后要把标志位置零
(0065) }
(0066) }
01AA 940E0222 CALL pop_gset1
01AC 940E024D CALL pop_lset
01AE 9518 RETI
_out_485:
i --> R20
ptr --> R22
01AF 940E021D CALL push_gset2
01B1 01B8 MOVW R22,R16
(0067)
(0068) }
(0069)
(0070)
(0071) void out_485(unsigned char *ptr)
(0072) {unsigned char i;
(0073)
(0074) send[0]=1; //发件箱地址指向主机
01B2 E081 LDI R24,1
01B3 93800086 STS send,R24
(0075) for(i=1;i<amount-1;i++)send[i]=*ptr++;//把发送的数据方到发信箱
01B5 E041 LDI R20,1
01B6 C00B RJMP 0x01C2
01B7 E886 LDI R24,0x86
01B8 E090 LDI R25,0
01B9 2FE4 MOV R30,R20
01BA 27FF CLR R31
01BB 0FE8 ADD R30,R24
01BC 1FF9 ADC R31,R25
01BD 01DB MOVW R26,R22
01BE 902D LD R2,X+
01BF 01BD MOVW R22,R26
01C0 8220 STD Z+0,R2
01C1 9543 INC R20
01C2 3049 CPI R20,0x9
01C3 F398 BCS 0x01B7
(0076) send[amount-1]=crc8(send,amount-1); //计算发件箱的crc8校验码
01C4 E029 LDI R18,0x9
01C5 E806 LDI R16,0x86
01C6 E010 LDI R17,0
01C7 DF72 RCALL _crc8
01C8 9300008F STS 0x8F,R16
(0077) usart_out(send,amount); //将发件箱的数据send[]发送出去
01CA E02A LDI R18,0xA
01CB E806 LDI R16,0x86
01CC E010 LDI R17,0
01CD DF4B RCALL _usart_out
01CE 940E0211 CALL pop_gset2
01D0 9508 RET
_main:
01D1 9722 SBIW R28,2
(0078)
(0079) }
(0080)
(0081) //------------------------主函数---------------------------------
(0082) void main(void)
(0083) {
(0084) usart_init();
01D2 DF39 RCALL _usart_init
(0085) SEI();
01D3 9478 BSET 7
(0086) LCD_init();
01D4 DEAE RCALL _LCD_init
(0087) LCD_write_string(0,0,"out:");
01D5 E787 LDI R24,0x77
01D6 E090 LDI R25,0
01D7 8399 STD Y+1,R25
01D8 8388 STD Y+0,R24
01D9 2722 CLR R18
01DA 2700 CLR R16
01DB DF0E RCALL _LCD_write_string
(0088) LCD_write_string(0,1,"int:");
01DC E782 LDI R24,0x72
01DD E090 LDI R25,0
01DE 8399 STD Y+1,R25
01DF 8388 STD Y+0,R24
01E0 E021 LDI R18,1
01E1 2700 CLR R16
01E2 DF07 RCALL _LCD_write_string
01E3 C02A RJMP 0x020E
(0089) while (1)
(0090) {
(0091) while(flag_me)
(0092) { LCD_write_string(4,1,inbox);
01E4 E78C LDI R24,0x7C
01E5 E090 LDI R25,0
01E6 8399 STD Y+1,R25
01E7 8388 STD Y+0,R24
01E8 E021 LDI R18,1
01E9 E004 LDI R16,4
01EA DEFF RCALL _LCD_write_string
(0093) n=0; //中断次数清0
01EB 2422 CLR R2
01EC 92200060 STS n,R2
(0094) inbox[0]=0; //收件箱地址清0
01EE 9220007C STS inbox,R2
(0095) flag_me=0;
01F0 92200061 STS flag_me,R2
(0096) out_485("3,ok!!!!");
01F2 E609 LDI R16,0x69
01F3 E010 LDI R17,0
01F4 DFBA RCALL _out_485
(0097) LCD_write_string(4,0,send);
01F5 E886 LDI R24,0x86
01F6 E090 LDI R25,0
01F7 8399 STD Y+1,R25
01F8 8388 STD Y+0,R24
01F9 2722 CLR R18
01FA E004 LDI R16,4
01FB DEEE RCALL _LCD_write_string
(0098) LCD_write_string(13,0," ");
01FC E683 LDI R24,0x63
01FD E090 LDI R25,0
01FE 8399 STD Y+1,R25
01FF 8388 STD Y+0,R24
0200 2722 CLR R18
0201 E00D LDI R16,0xD
0202 DEE7 RCALL _LCD_write_string
(0099) LCD_write_string(13,1," ");
0203 E683 LDI R24,0x63
0204 E090 LDI R25,0
0205 8399 STD Y+1,R25
0206 8388 STD Y+0,R24
0207 E021 LDI R18,1
0208 E00D LDI R16,0xD
0209 DEE0 RCALL _LCD_write_string
020A 90200061 LDS R2,flag_me
020C 2022 TST R2
020D F6B1 BNE 0x01E4
020E CFFB RJMP 0x020A
(0100)
(0101)
(0102) }
(0103) };
FILE: <library>
020F 9622 ADIW R28,2
0210 9508 RET
pop_gset2:
0211 E0E2 LDI R30,2
0212 940C0223 JMP pop
pop_gset3:
0214 E0E4 LDI R30,4
0215 940C0223 JMP pop
push_gset5:
0217 92FA ST R15,-Y
0218 92EA ST R14,-Y
push_gset4:
0219 92DA ST R13,-Y
021A 92CA ST R12,-Y
push_gset3:
021B 92BA ST R11,-Y
021C 92AA ST R10,-Y
push_gset2:
021D 937A ST R23,-Y
021E 936A ST R22,-Y
push_gset1:
021F 935A ST R21,-Y
0220 934A ST R20,-Y
0221 9508 RET
pop_gset1:
0222 E0E1 LDI R30,1
pop:
0223 9149 LD R20,Y+
0224 9159 LD R21,Y+
0225 FDE0 SBRC R30,0
0226 9508 RET
0227 9169 LD R22,Y+
0228 9179 LD R23,Y+
0229 FDE1 SBRC R30,1
022A 9508 RET
022B 90A9 LD R10,Y+
022C 90B9 LD R11,Y+
022D FDE2 SBRC R30,2
022E 9508 RET
022F 90C9 LD R12,Y+
0230 90D9 LD R13,Y+
0231 FDE3 SBRC R30,3
0232 9508 RET
0233 90E9 LD R14,Y+
0234 90F9 LD R15,Y+
0235 9508 RET
push_lset:
0236 93FA ST R31,-Y
0237 93EA ST R30,-Y
0238 93BA ST R27,-Y
0239 93AA ST R26,-Y
023A 939A ST R25,-Y
023B 938A ST R24,-Y
023C 933A ST R19,-Y
023D 932A ST R18,-Y
023E 931A ST R17,-Y
023F 930A ST R16,-Y
0240 929A ST R9,-Y
0241 928A ST R8,-Y
0242 927A ST R7,-Y
0243 926A ST R6,-Y
0244 925A ST R5,-Y
0245 924A ST R4,-Y
0246 923A ST R3,-Y
0247 922A ST R2,-Y
0248 921A ST R1,-Y
0249 920A ST R0,-Y
024A B60F IN R0,0x3F
024B 920A ST R0,-Y
024C 9508 RET
pop_lset:
024D 9009 LD R0,Y+
024E BE0F OUT 0x3F,R0
024F 9009 LD R0,Y+
0250 9019 LD R1,Y+
0251 9029 LD R2,Y+
0252 9039 LD R3,Y+
0253 9049 LD R4,Y+
0254 9059 LD R5,Y+
0255 9069 LD R6,Y+
0256 9079 LD R7,Y+
0257 9089 LD R8,Y+
0258 9099 LD R9,Y+
0259 9109 LD R16,Y+
025A 9119 LD R17,Y+
025B 9129 LD R18,Y+
025C 9139 LD R19,Y+
025D 9189 LD R24,Y+
025E 9199 LD R25,Y+
025F 91A9 LD R26,Y+
0260 91B9 LD R27,Y+
0261 91E9 LD R30,Y+
0262 91F9 LD R31,Y+
0263 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -