📄 remote_light.lst
字号:
(0060) remote_in = PINB & 0x0F;
0162 B386 IN R24,P16
0163 708F ANDI R24,0xF
0164 2EA8 MOV R10,R24
(0061) switch (remote_in)
0165 2EC8 MOV R12,R24
0166 24DD CLR R13
0167 20CC TST R12
0168 F411 BNE 0x016B
0169 20DD TST R13
016A F0D9 BEQ 0x0186
016B 2D8C MOV R24,R12
016C 2D9D MOV R25,R13
016D 3081 CPI R24,1
016E E0E0 LDI R30,0
016F 079E CPC R25,R30
0170 F099 BEQ 0x0184
0171 3082 CPI R24,2
0172 E0E0 LDI R30,0
0173 079E CPC R25,R30
0174 F059 BEQ 0x0180
0175 3084 CPI R24,4
0176 E0E0 LDI R30,0
0177 079E CPC R25,R30
0178 F029 BEQ 0x017E
0179 3088 CPI R24,0x8
017A E0E0 LDI R30,0
017B 079E CPC R25,R30
017C F029 BEQ 0x0182
017D C009 RJMP 0x0187
(0062) {//检测遥控器是否有键按下
(0063) case 0x04: // < A >
(0064) turn_right(); //右转
017E DED4 RCALL _turn_right
(0065) break;
017F C007 RJMP 0x0187
(0066) case 0x02: // < B >
(0067) backward(); //后退
0180 DEE6 RCALL _backward
(0068) break;
0181 C005 RJMP 0x0187
(0069) case 0x08: // < C >
(0070) stop(); //停止运动
0182 DEEE RCALL _stop
(0071) break;
0183 C003 RJMP 0x0187
(0072) case 0x01: // < D >
(0073) turn_left(); //左转
0184 DED3 RCALL _turn_left
(0074) break;
0185 C001 RJMP 0x0187
(0075) case 0x00:
(0076) forward(); //前行
0186 DEE5 RCALL _forward
(0077) break;
(0078) }
(0079) delay_ms(100);
0187 E604 LDI R16,0x64
0188 E010 LDI R17,0
0189 DEBB RCALL _delay_ms
018A CFD6 RJMP 0x0161
(0080) }
(0081) }
018B D097 RCALL pop_gset4
018C 9508 RET
_trace_light:
timers --> R20
led --> R22
cds --> R10
018D D08B RCALL push_gset3
(0082)
(0083) void trace_light()
(0084) {
(0085) unsigned char cds,led,timers;
(0086) led = 0xc3;
018E EC63 LDI R22,0xC3
(0087) for(timers=0;timers<9;timers++)
018F 2744 CLR R20
0190 C006 RJMP 0x0197
(0088) {//8 LED 整体亮灭闪烁
(0089) PORTA = led;
0191 BB6B OUT P1B,R22
(0090) delay_ms(500);
0192 EF04 LDI R16,0xF4
0193 E011 LDI R17,1
0194 DEB0 RCALL _delay_ms
(0091) led = ~led;
0195 9560 COM R22
0196 9543 INC R20
0197 3049 CPI R20,0x9
0198 F3C0 BCS 0x0191
(0092) }
(0093)
(0094) work_status = 0x70; //置对应的工作状态标志
0199 E780 LDI R24,0x70
019A 93800065 STS _work_status,R24
(0095)
(0096) mic_startup(); //等待声控启动
019C DF39 RCALL _mic_startup
019D C021 RJMP 0x01BF
(0097)
(0098) while(1)
(0099) {
(0100) sw_touch(); //检测轻触开关
019E DED6 RCALL _sw_touch
(0101)
(0102) cds = PINC & 0x06; //0b0000,0110
019F B383 IN R24,P13
01A0 7086 ANDI R24,6
01A1 2EA8 MOV R10,R24
(0103)
(0104) if(cds == 0x00) //左右两侧都感测到光
01A2 2388 TST R24
01A3 F421 BNE 0x01A8
(0105) {//直行
(0106) forward();
01A4 DEC7 RCALL _forward
(0107) delay_ms(light_delay); //延时
01A5 E604 LDI R16,0x64
01A6 E010 LDI R17,0
01A7 DE9D RCALL _delay_ms
(0108) }
(0109) if(cds == 0x02) //0b0000,0010___pc2(右侧)感测到光
01A8 2D8A MOV R24,R10
01A9 3082 CPI R24,2
01AA F421 BNE 0x01AF
(0110) {//慢速右转
(0111) turn_right_s();
01AB DEB1 RCALL _turn_right_s
(0112) delay_ms(light_delay); //延时
01AC E604 LDI R16,0x64
01AD E010 LDI R17,0
01AE DE96 RCALL _delay_ms
(0113) }
(0114) if(cds == 0x04) //0b0000,0100___pc1(左侧)感测到光
01AF 2D8A MOV R24,R10
01B0 3084 CPI R24,4
01B1 F421 BNE 0x01B6
(0115) {//慢速左转
(0116) turn_left_s();
01B2 DEAF RCALL _turn_left_s
(0117) delay_ms(light_delay); //延时
01B3 E604 LDI R16,0x64
01B4 E010 LDI R17,0
01B5 DE8F RCALL _delay_ms
(0118) }
(0119) if(cds == 0x06)
01B6 2D8A MOV R24,R10
01B7 3086 CPI R24,6
01B8 F431 BNE 0x01BF
(0120) {//停止动作
(0121) PORTA = 0x55; //延时后停止动作,等待光照重新动作
01B9 E585 LDI R24,0x55
01BA BB8B OUT P1B,R24
(0122) delay_ms(light_delay*2);
01BB EC08 LDI R16,0xC8
01BC E010 LDI R17,0
01BD DE87 RCALL _delay_ms
(0123) stop();
01BE DEB2 RCALL _stop
01BF CFDE RJMP 0x019E
(0124) }
(0125) }
(0126) }
01C0 D060 RCALL pop_gset3
01C1 9508 RET
(0127)
(0128) void main()
(0129) {
(0130) unsigned char pd_select,remote_select;
(0131)
(0132) port_init(); //PA,PB,PC,PD 初始化
_main:
remote_select --> R20
pd_select --> R22
01C2 DE6A RCALL _port_init
(0133)
(0134) work_status = 0x67; //置对应的工作状态标志
01C3 E687 LDI R24,0x67
01C4 93800065 STS _work_status,R24
(0135)
(0136) PORTA = 0x7e;
01C6 E78E LDI R24,0x7E
01C7 BB8B OUT P1B,R24
01C8 C034 RJMP 0x01FD
(0137) while(1)
(0138) {
(0139) pd_select = PIND & 0x0f;
01C9 B360 IN R22,P10
01CA 706F ANDI R22,0xF
(0140) if(pd_select == 0x0e)//pd0=0,其它为高电平
01CB 306E CPI R22,0xE
01CC F451 BNE 0x01D7
(0141) {
01CD C008 RJMP 0x01D6
(0142) while(1)
(0143) {
(0144) delay_ms(500);//消除抖动
01CE EF04 LDI R16,0xF4
01CF E011 LDI R17,1
01D0 DE74 RCALL _delay_ms
(0145) pd_select = PIND & 0x0f;
01D1 B360 IN R22,P10
01D2 706F ANDI R22,0xF
(0146) if(pd_select == 0x0e)//pd0=0,其它为高电平
01D3 306E CPI R22,0xE
01D4 F411 BNE 0x01D7
(0147) {remote_car();}//运行遥控车程序
01D5 DF7A RCALL _remote_car
01D6 CFF7 RJMP 0x01CE
(0148) else
(0149) break;
(0150) }
(0151) }
(0152) if(pd_select == 0x0d)//pd1=0,其它为高电平
01D7 306D CPI R22,0xD
01D8 F451 BNE 0x01E3
(0153) {
01D9 C008 RJMP 0x01E2
(0154) while(1)
(0155) {
(0156) delay_ms(500);//消除抖动
01DA EF04 LDI R16,0xF4
01DB E011 LDI R17,1
01DC DE68 RCALL _delay_ms
(0157) pd_select = PIND & 0x0f;
01DD B360 IN R22,P10
01DE 706F ANDI R22,0xF
(0158) if(pd_select == 0x0d)//pd1=0,其它为高电平
01DF 306D CPI R22,0xD
01E0 F411 BNE 0x01E3
(0159) {trace_light();}//运行遥控车程序
01E1 DFAB RCALL _trace_light
01E2 CFF7 RJMP 0x01DA
(0160) else
(0161) break;
(0162) }
(0163) }
(0164)
(0165) remote_select = PINB & 0x0f;//检测遥控器是否有键按下
01E3 B346 IN R20,P16
01E4 704F ANDI R20,0xF
(0166) if(remote_select == 0x04)// A
01E5 3044 CPI R20,4
01E6 F451 BNE 0x01F1
(0167) {
01E7 C008 RJMP 0x01F0
(0168) while(1)
(0169) {
(0170) delay_ms(500);//消除抖动
01E8 EF04 LDI R16,0xF4
01E9 E011 LDI R17,1
01EA DE5A RCALL _delay_ms
(0171) remote_select = PINB & 0x0f;
01EB B346 IN R20,P16
01EC 704F ANDI R20,0xF
(0172) if(remote_select == 0x04)// A
01ED 3044 CPI R20,4
01EE F411 BNE 0x01F1
(0173) {remote_car();}//运行遥控车程序
01EF DF60 RCALL _remote_car
01F0 CFF7 RJMP 0x01E8
(0174) else
(0175) break;
(0176) }
(0177) }
(0178) if(remote_select == 0x02)// B
01F1 3042 CPI R20,2
01F2 F451 BNE 0x01FD
(0179) {
01F3 C008 RJMP 0x01FC
(0180) while(1)
(0181) {
(0182) delay_ms(500);//消除抖动
01F4 EF04 LDI R16,0xF4
01F5 E011 LDI R17,1
01F6 DE4E RCALL _delay_ms
(0183) remote_select = PINB & 0x0f;
01F7 B346 IN R20,P16
01F8 704F ANDI R20,0xF
(0184) if(remote_select == 0x02)// B
01F9 3042 CPI R20,2
01FA F411 BNE 0x01FD
(0185) {trace_light();}//运行追光机器人程序
01FB DF91 RCALL _trace_light
01FC CFF7 RJMP 0x01F4
01FD CFCB RJMP 0x01C9
(0186) else
(0187) break;
(0188) }
(0189) }
(0190) }
(0191)
(0192) }
FILE: <library>
01FE 9508 RET
push_gset1:
01FF 935A ST R21,-Y
0200 934A ST R20,-Y
0201 9508 RET
pop_gset1:
0202 E0E1 LDI R30,1
pop:
0203 9149 LD R20,Y+
0204 9159 LD R21,Y+
0205 FDE0 SBRC R30,0
0206 9508 RET
0207 9169 LD R22,Y+
0208 9179 LD R23,Y+
0209 FDE1 SBRC R30,1
020A 9508 RET
020B 90A9 LD R10,Y+
020C 90B9 LD R11,Y+
020D FDE2 SBRC R30,2
020E 9508 RET
020F 90C9 LD R12,Y+
0210 90D9 LD R13,Y+
0211 FDE3 SBRC R30,3
0212 9508 RET
0213 90E9 LD R14,Y+
0214 90F9 LD R15,Y+
0215 9508 RET
push_gset2:
0216 937A ST R23,-Y
0217 936A ST R22,-Y
0218 CFE6 RJMP push_gset1
push_gset3:
0219 92BA ST R11,-Y
021A 92AA ST R10,-Y
021B CFFA RJMP push_gset2
push_gset4:
021C 92DA ST R13,-Y
021D 92CA ST R12,-Y
021E CFFA RJMP push_gset3
pop_gset2:
021F E0E2 LDI R30,2
0220 CFE2 RJMP pop
pop_gset3:
0221 E0E4 LDI R30,4
0222 CFE0 RJMP pop
pop_gset4:
0223 E0E8 LDI R30,0x8
0224 CFDE RJMP pop
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -