📄 car1.lst
字号:
(0188) T0_10_set = 1;
151 E081 LDI R24,1
152 9380 007C STS T0_10_set,R24
154 90B9 LD R11,Y+
155 90A9 LD R10,Y+
156 9029 LD R2,Y+
157 BE2F OUT 0x3F,R2
158 91B9 LD R27,Y+
159 91A9 LD R26,Y+
15A 9199 LD R25,Y+
15B 9189 LD R24,Y+
15C 9099 LD R9,Y+
15D 9089 LD R8,Y+
15E 9059 LD R5,Y+
15F 9049 LD R4,Y+
160 9039 LD R3,Y+
161 9029 LD R2,Y+
162 9518 RETI
(0189) //LCD_write_datalongint(1, 10, T0_200_n);
(0190) }
(0191)
(0192) //计周长开始停止控制, 影响中断使能
(0193) void Time0OnOff (uchar onoff)
(0194) {
(0195) if (onoff == ON) {
_Time0OnOff:
onoff --> R16
163 3001 CPI R16,1
164 F421 BNE 0x0169
(0196) TIMSK |= (1 << OCIE0); //开时间中断
165 B789 IN R24,0x39
166 6082 ORI R24,2
167 BF89 OUT 0x39,R24
(0197) }
168 C005 RJMP 0x016E
(0198)
(0199) else if (onoff == OFF) {
169 2300 TST R16
16A F419 BNE 0x016E
(0200) TIMSK &=~ (1 << OCIE0); //禁止时间中断
16B B789 IN R24,0x39
16C 7F8D ANDI R24,0xFD
16D BF89 OUT 0x39,R24
(0201) }
16E 9508 RET
_int1_isr:
16F 920A ST R0,-Y
170 921A ST R1,-Y
171 922A ST R2,-Y
172 923A ST R3,-Y
173 924A ST R4,-Y
174 925A ST R5,-Y
175 926A ST R6,-Y
176 927A ST R7,-Y
177 928A ST R8,-Y
178 929A ST R9,-Y
179 930A ST R16,-Y
17A 931A ST R17,-Y
17B 932A ST R18,-Y
17C 933A ST R19,-Y
17D 938A ST R24,-Y
17E 939A ST R25,-Y
17F 93AA ST R26,-Y
180 93BA ST R27,-Y
181 93EA ST R30,-Y
182 93FA ST R31,-Y
183 B60F IN R0,0x3F
184 920A ST R0,-Y
185 940E 0786 CALL push_xgsetF000
(0202) }
(0203)
(0204)
(0205) /*------------------------------------TIME END----------------------------------------*/
(0206)
(0207) /*-------------------------------int0 & int1----------------------------------*/
(0208)
(0209) //中断1, 用做计算圈数
(0210) #pragma interrupt_handler int1_isr:iv_INT1
(0211) void int1_isr(void)
(0212) {
(0213) //GICR &=~ (1 << INT1);
(0214) //external interupt on INT1
(0215) //getlinestart = 1;
(0216) if (T2_1s_set_n >= nextint_time) {
187 9040 006B LDS R4,nextint_time+2
189 9050 006C LDS R5,nextint_time+3
18B 9020 0069 LDS R2,nextint_time
18D 9030 006A LDS R3,nextint_time+1
18F 9080 0075 LDS R8,T2_1s_set_n+2
191 9090 0076 LDS R9,T2_1s_set_n+3
193 9060 0073 LDS R6,T2_1s_set_n
195 9070 0074 LDS R7,T2_1s_set_n+1
197 1462 CP R6,R2
198 0473 CPC R7,R3
199 0484 CPC R8,R4
19A 0495 CPC R9,R5
19B F158 BCS 0x01C7
(0217) getlinestart = 1;
19C E081 LDI R24,1
19D 9380 0068 STS getlinestart,R24
(0218) nextint_time += 13; //10s后如果果再进入中断,才能使圈数加1
19F E04D LDI R20,0xD
1A0 E050 LDI R21,0
1A1 E060 LDI R22,0
1A2 E070 LDI R23,0
1A3 0E24 ADD R2,R20
1A4 1E35 ADC R3,R21
1A5 1E46 ADC R4,R22
1A6 1E57 ADC R5,R23
1A7 9230 006A STS nextint_time+1,R3
1A9 9220 0069 STS nextint_time,R2
1AB 9250 006C STS nextint_time+3,R5
1AD 9240 006B STS nextint_time+2,R4
(0219) circle_n_new++;
1AF 9180 0066 LDS R24,circle_n_new
1B1 5F8F SUBI R24,0xFF
1B2 9380 0066 STS circle_n_new,R24
(0220)
(0221) if (circle_n_new == 4) { //跑了三圈
1B4 3084 CPI R24,4
1B5 F489 BNE 0x01C7
(0222) CarStop(); //小车停止
1B6 DF06 RCALL _CarStop
(0223) Time2OnOff(OFF); //关闭时间计数器中断
1B7 2700 CLR R16
1B8 DF5F RCALL _Time2OnOff
(0224) Time0OnOff(OFF); //关闭路程计算器
1B9 2700 CLR R16
1BA DFA8 RCALL _Time0OnOff
(0225) CLI(); //关所有中断
1BB 94F8 BCLR 7
(0226)
(0227) LightOnOff(ON); //灯闪
1BC E001 LDI R16,1
1BD DF06 RCALL _LightOnOff
(0228) delay_ns(1);
1BE E001 LDI R16,1
1BF 940E 03DA CALL _delay_ns
(0229) LightOnOff(OFF);
1C1 2700 CLR R16
1C2 DF01 RCALL _LightOnOff
(0230) delay_ns(1);
1C3 E001 LDI R16,1
1C4 940E 03DA CALL _delay_ns
(0231)
(0232) while (1) {;} //死车
1C6 CFFF RJMP 0x01C6
(0233) }
(0234) }
1C7 940E 078B CALL pop_xgsetF000
1C9 9009 LD R0,Y+
1CA BE0F OUT 0x3F,R0
1CB 91F9 LD R31,Y+
1CC 91E9 LD R30,Y+
1CD 91B9 LD R27,Y+
1CE 91A9 LD R26,Y+
1CF 9199 LD R25,Y+
1D0 9189 LD R24,Y+
1D1 9139 LD R19,Y+
1D2 9129 LD R18,Y+
1D3 9119 LD R17,Y+
1D4 9109 LD R16,Y+
1D5 9099 LD R9,Y+
1D6 9089 LD R8,Y+
1D7 9079 LD R7,Y+
1D8 9069 LD R6,Y+
1D9 9059 LD R5,Y+
1DA 9049 LD R4,Y+
1DB 9039 LD R3,Y+
1DC 9029 LD R2,Y+
1DD 9019 LD R1,Y+
1DE 9009 LD R0,Y+
1DF 9518 RETI
_int0_isr:
1E0 930A ST R16,-Y
1E1 931A ST R17,-Y
1E2 938A ST R24,-Y
1E3 93AA ST R26,-Y
1E4 93EA ST R30,-Y
1E5 B70F IN R16,0x3F
1E6 930A ST R16,-Y
(0235)
(0236) //LCD_write_datalongint(1, 10, lcd_i++);
(0237) //if(lcd_i == 5)
(0238) // GICR &=~ (1 << INT1);
(0239) }
(0240)
(0241) //扩展中断0, 用做寻线
(0242) #pragma interrupt_handler int0_isr:iv_INT0
(0243) void int0_isr(void)
(0244) {
(0245) //external interupt on INT1
(0246) switch( PIND & 0b01000111 ) {
1E7 B300 IN R16,0x10
1E8 2711 CLR R17
1E9 7407 ANDI R16,0x47
1EA 7010 ANDI R17,0
1EB 3001 CPI R16,1
1EC E0E0 LDI R30,0
1ED 071E CPC R17,R30
1EE F0E9 BEQ 0x020C
1EF 3003 CPI R16,3
1F0 E0E0 LDI R30,0
1F1 071E CPC R17,R30
1F2 F0C9 BEQ 0x020C
1F3 3001 CPI R16,1
1F4 E0E0 LDI R30,0
1F5 071E CPC R17,R30
1F6 F0CC BLT 0x0210
1F7 3400 CPI R16,0x40
1F8 E0E0 LDI R30,0
1F9 071E CPC R17,R30
1FA F049 BEQ 0x0204
1FB 3401 CPI R16,0x41
1FC E0E0 LDI R30,0
1FD 071E CPC R17,R30
1FE F049 BEQ 0x0208
1FF 3402 CPI R16,0x42
200 E0E0 LDI R30,0
201 071E CPC R17,R30
202 F009 BEQ 0x0204
203 C00C RJMP 0x0210
(0247) case 0b01000010: //左红外遇到黑线
(0248) case 0b01000000: //左中遇到
(0249) modle_now = 1;
204 E081 LDI R24,1
205 9380 0060 STS modle_now,R24
(0250) break;
207 C00B RJMP 0x0213
(0251)
(0252) case 0b01000001: //中红外遇到黑线
(0253) modle_now = 2;
208 E082 LDI R24,2
209 9380 0060 STS modle_now,R24
(0254) break;
20B C007 RJMP 0x0213
(0255)
(0256) case 0b00000011: //右红外遇到黑线
(0257) case 0b00000001: //右中遇到
(0258) modle_now = 3;
20C E083 LDI R24,3
20D 9380 0060 STS modle_now,R24
(0259) break;
20F C003 RJMP 0x0213
(0260)
(0261) default :
(0262) modle_now = 4;
210 E084 LDI R24,4
211 9380 0060 STS modle_now,R24
(0263) break;
213 9109 LD R16,Y+
214 BF0F OUT 0x3F,R16
215 91E9 LD R30,Y+
216 91A9 LD R26,Y+
217 9189 LD R24,Y+
218 9119 LD R17,Y+
219 9109 LD R16,Y+
21A 9518 RETI
_CarFindLine:
21B 934A ST R20,-Y
21C 935A ST R21,-Y
(0264) }
(0265) }
(0266)
(0267) //小车寻线
(0268) void CarFindLine (void)
(0269) {
(0270) if (modle_last == 1) {
21D 9180 0061 LDS R24,modle_last
21F 3081 CPI R24,1
220 F4A9 BNE 0x0236
(0271) CarTurnLeft();
221 DE8D RCALL _CarTurnLeft
(0272)
(0273) switch (modle_now) {
222 9140 0060 LDS R20,modle_now
224 2755 CLR R21
225 3042 CPI R20,2
226 E0E0 LDI R30,0
227 075E CPC R21,R30
228 F029 BEQ 0x022E
229 3043 CPI R20,3
22A E0E0 LDI R30,0
22B 075E CPC R21,R30
22C F029 BEQ 0x0232
22D C036 RJMP 0x0264
(0274) case 2:
(0275) modle_last = 4;
22E E084 LDI R24,4
22F 9380 0061 STS modle_last,R24
(0276) break;
231 C032 RJMP 0x0264
(0277)
(0278) case 3:
(0279) modle_last = 3;
232 E083 LDI R24,3
233 9380 0061 STS modle_last,R24
(0280) break;
(0281)
(0282) default :
(0283) break;
(0284) }
(0285) }
235 C02E RJMP 0x0264
(0286)
(0287) else if (modle_last == 3) {
236 9180 0061 LDS R24,modle_last
238 3083 CPI R24,3
239 F4A9 BNE 0x024F
(0288) CarTurnRight();
23A DE7B RCALL _CarTurnRight
(0289)
(0290) switch (modle_now) {
23B 9140 0060 LDS R20,modle_now
23D 2755 CLR R21
23E 3041 CPI R20,1
23F E0E0 LDI R30,0
240 075E CPC R21,R30
241 F029 BEQ 0x0247
242 3042 CPI R20,2
243 E0E0 LDI R30,0
244 075E CPC R21,R30
245 F029 BEQ 0x024B
246 C01D RJMP 0x0264
(0291) case 1:
(0292) modle_last = 1;
247 E081 LDI R24,1
248 9380 0061 STS modle_last,R24
(0293) break;
24A C019 RJMP 0x0264
(0294)
(0295) case 2:
(0296) modle_last = 4;
24B E084 LDI R24,4
24C 9380 0061 STS modle_last,R24
(0297) break;
(0298)
(0299) default :
(0300) break;
(0301) }
(0302) }
24E C015 RJMP 0x0264
(0303)
(0304) else if (modle_last == 4) {
24F 9180 0061 LDS R24,modle_last
251 3084 CPI R24,4
252 F489 BNE 0x0264
(0305) CarGoAheadMidSpeed();
253 DE54 RCALL _CarGoAheadMidSpeed
(0306)
(0307) switch (modle_now) {
254 9140 0060 LDS R20,modle_now
256 2755 CLR R21
257 3041 CPI R20,1
258 E0E0 LDI R30,0
259 075E CPC R21,R30
25A F029 BEQ 0x0260
25B 3043 CPI R20,3
25C E0E0 LDI R30,0
25D 075E CPC R21,R30
25E F009 BEQ 0x0260
25F C004 RJMP 0x0264
(0308) case 1:
(0309) case 3:
(0310) modle_last = modle_now;
260 9020 0060 LDS R2,modle_now
262 9220 0061 STS modle_last,R2
(0311) break;
(0312)
(0313) default :
(0314) break;
(0315) }
(0316) }
264 9159 LD R21,Y+
265 9149 LD R20,Y+
266 9508 RET
(0317) }
(0318) /*-------------------------------end---------------------------------------------*/
(0319)
(0320) //call this routine to initialize all peripherals
(0321) void init_devices(void)
(0322) {
(0323) //stop errant interrupts until set up
(0324) closeJTAG();
_init_devices:
267 DE24 RCALL _closeJTAG
(0325) CLI(); //disable all interrupts
268 94F8 BCLR 7
(0326)
(0327) //时间使用
(0328) timer2_init();
269 DE63 RCALL _timer2_init
(0329) Time2OnOff(OFF);
26A 2700 CLR R16
26B DEAC RCALL _Time2OnOff
(0330)
(0331) //计圈数使用
(0332) timer0_init();
26C DEB7 RCALL _timer0_init
(0333) Time0OnOff(OFF);
26D 2700 CLR R16
26E DEF4 RCALL _Time0OnOff
(0334)
(0335) //lcd
(0336) LCD_init();
26F 940E 05F0 CALL _LCD_init
(0337)
(0338) //pwm
(0339) PwmInit();
271 DE21 RCALL _PwmInit
(0340) PwmASet(PWMA_MIN_VAL);
272 2700 CLR R16
273 2711 CLR R17
274 DE26 RCALL _PwmASet
(0341) PwmBSet(PWMB_MIN_VAL);
275 2700 CLR R16
276 2711 CLR R17
277 DE26 RCALL _PwmBSet
(0342)
(0343) //INT1:0
(0344) DDRD &=~ (1 << PD0) | (1 << PD1) | (1 << PD2) | (1 << PD3) | (1 << PD6); //PD口的0,1,6做扩展中断, 2,3做中断
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -