📄 car1.lst
字号:
278 9888 CBI 0x11,0
(0345) PORTD |= (1 << PD0) | (1 << PD1) | (1 << PD2) | (1 << PD3) | (1 << PD6);
279 B382 IN R24,0x12
27A 648F ORI R24,0x4F
27B BB82 OUT 0x12,R24
(0346)
(0347) DDRA &=~ (1 << PA0); //小车按钮开关, 上拉
27C 98D0 CBI 0x1A,0
(0348) PORTA |= (1 << PA0);
27D 9AD8 SBI 0x1B,0
(0349)
(0350) DDRC |= 0b11110000;
27E B384 IN R24,0x14
27F 6F80 ORI R24,0xF0
280 BB84 OUT 0x14,R24
(0351) PORTC &=~ 0b01010000;
281 B385 IN R24,0x15
282 7A8F ANDI R24,0xAF
283 BB85 OUT 0x15,R24
(0352) PORTC |= 0b10100000; //PC口4,5,6,7输出, 电机停
284 B385 IN R24,0x15
285 6A80 ORI R24,0xA0
286 BB85 OUT 0x15,R24
(0353)
(0354) DDRB &=~ (1 << PB0); //T0做外部计数
287 98B8 CBI 0x17,0
(0355) PORTB |= (1 << PB0);
288 9AC0 SBI 0x18,0
(0356)
(0357) MCUCR = 0x0A; //中断方式, 都是下降沿
289 E08A LDI R24,0xA
28A BF85 OUT 0x35,R24
(0358) GICR |= (1 << INT1) | (1 << INT0);
28B B78B IN R24,0x3B
28C 6C80 ORI R24,0xC0
28D BF8B OUT 0x3B,R24
28E 9508 RET
_main:
28F 9728 SBIW R28,0x8
(0359)
(0360) //TIMSK = 0x80; //定时器中断使能
(0361) //SEI();
(0362) }
(0363)
(0364) #define debug
(0365) //主函数
(0366) void main(void)
(0367)
(0368) {
(0369) init_devices();
290 DFD6 RCALL _init_devices
(0370)
(0371) LCD_write_string(1, 4, "Good luck");
291 EC83 LDI R24,0xC3
292 E090 LDI R25,0
293 8399 STD Y+1,R25
294 8388 STD Y+0,R24
295 E024 LDI R18,4
296 E001 LDI R16,1
297 940E 061B CALL _LCD_write_string
(0372) LCD_write_string(2, 0, "made on 09-05-01");
299 EB82 LDI R24,0xB2
29A E090 LDI R25,0
29B 8399 STD Y+1,R25
29C 8388 STD Y+0,R24
29D 2722 CLR R18
29E E002 LDI R16,2
29F 940E 061B CALL _LCD_write_string
(0373)
(0374) #ifdef debug
(0375) LightOnOff(ON);
2A1 E001 LDI R16,1
2A2 DE21 RCALL _LightOnOff
(0376) delay_nms(200);
2A3 EC08 LDI R16,0xC8
2A4 E010 LDI R17,0
2A5 940E 03CC CALL _delay_nms
(0377) LightOnOff(OFF);
2A7 2700 CLR R16
2A8 DE1B RCALL _LightOnOff
(0378) delay_nms(200);
2A9 EC08 LDI R16,0xC8
2AA E010 LDI R17,0
2AB 940E 03CC CALL _delay_nms
2AD C0F7 RJMP 0x03A5
(0379) #endif
(0380)
(0381) //while(1) {;}
(0382)
(0383) while(1){
(0384) if ((PINA & (1 << PA0)) == 0 ) { //等待按下开始键
2AE 99C8 SBIC 0x19,0
2AF C0F5 RJMP 0x03A5
(0385) SEI(); //打开全局中断
2B0 9478 BSET 7
(0386)
(0387) CarGoAheadMidSpeed(); //小车向前
2B1 DDF6 RCALL _CarGoAheadMidSpeed
2B2 C0F1 RJMP 0x03A4
(0388) while (1) {
(0389) CarFindLine(); //小车寻线
2B3 DF67 RCALL _CarFindLine
(0390)
(0391) if (getlinestart == 1) { //如果遇到起跑线
2B4 9180 0068 LDS R24,getlinestart
2B6 3081 CPI R24,1
2B7 F009 BEQ 0x02B9
2B8 C0EB RJMP 0x03A4
(0392) LCD_write_string(1, 0, " ");
2B9 E98E LDI R24,0x9E
2BA E090 LDI R25,0
2BB 8399 STD Y+1,R25
2BC 8388 STD Y+0,R24
2BD 2722 CLR R18
2BE E001 LDI R16,1
2BF 940E 061B CALL _LCD_write_string
(0393) LCD_write_string(2, 0, " ");
2C1 E98E LDI R24,0x9E
2C2 E090 LDI R25,0
2C3 8399 STD Y+1,R25
2C4 8388 STD Y+0,R24
2C5 2722 CLR R18
2C6 E002 LDI R16,2
2C7 940E 061B CALL _LCD_write_string
(0394) LCD_write_string(1, 0, "circle: cm ");
2C9 E88D LDI R24,0x8D
2CA E090 LDI R25,0
2CB 8399 STD Y+1,R25
2CC 8388 STD Y+0,R24
2CD 2722 CLR R18
2CE E001 LDI R16,1
2CF 940E 061B CALL _LCD_write_string
(0395) LCD_write_string(2, 0, "time : 0 s ");
2D1 E78D LDI R24,0x7D
2D2 E090 LDI R25,0
2D3 8399 STD Y+1,R25
2D4 8388 STD Y+0,R24
2D5 2722 CLR R18
2D6 E002 LDI R16,2
2D7 940E 061B CALL _LCD_write_string
(0396)
(0397) Time0OnOff(ON); //开始计算路程
2D9 E001 LDI R16,1
2DA DE88 RCALL _Time0OnOff
(0398) Time2OnOff(ON); //开始计时
2DB E001 LDI R16,1
2DC DE3B RCALL _Time2OnOff
2DD C0C5 RJMP 0x03A3
(0399)
(0400) while (1) {
(0401) CarFindLine(); //寻线
2DE DF3C RCALL _CarFindLine
(0402)
(0403) if (T2_1s_set == 1) { //显示时间
2DF 9180 0077 LDS R24,T2_1s_set
2E1 3081 CPI R24,1
2E2 F499 BNE 0x02F6
(0404) LCD_write_datalongint(2, 8, T2_1s_set_n);
2E3 9040 0075 LDS R4,T2_1s_set_n+2
2E5 9050 0076 LDS R5,T2_1s_set_n+3
2E7 9020 0073 LDS R2,T2_1s_set_n
2E9 9030 0074 LDS R3,T2_1s_set_n+1
2EB 8228 STD Y+0,R2
2EC 8239 STD Y+1,R3
2ED 824A STD Y+2,R4
2EE 825B STD Y+3,R5
2EF E028 LDI R18,0x8
2F0 E002 LDI R16,2
2F1 940E 067A CALL _LCD_write_datalongint
(0405) T2_1s_set = 0;
2F3 2422 CLR R2
2F4 9220 0077 STS T2_1s_set,R2
(0406) }
(0407)
(0408) if (T0_10_set == 1) { //显示路程
2F6 9180 007C LDS R24,T0_10_set
2F8 3081 CPI R24,1
2F9 F009 BEQ 0x02FB
2FA C04B RJMP 0x0346
(0409) circle = (((10 * T0_10_n) + TCNT0) / 5) * LENGHT_PER_CIRCLE;
2FB 9040 007A LDS R4,T0_10_n+2
2FD 9050 007B LDS R5,T0_10_n+3
2FF 9020 0078 LDS R2,T0_10_n
301 9030 0079 LDS R3,T0_10_n+1
303 E04A LDI R20,0xA
304 E050 LDI R21,0
305 E060 LDI R22,0
306 E070 LDI R23,0
307 925A ST R5,-Y
308 924A ST R4,-Y
309 923A ST R3,-Y
30A 922A ST R2,-Y
30B 018A MOVW R16,R20
30C 019B MOVW R18,R22
30D 940E 0732 CALL empy32u
30F 0118 MOVW R2,R16
310 0129 MOVW R4,R18
311 B662 IN R6,0x32
312 2477 CLR R7
313 2488 CLR R8
314 2499 CLR R9
315 0C26 ADD R2,R6
316 1C37 ADC R3,R7
317 1C48 ADC R4,R8
318 1C59 ADC R5,R9
319 E045 LDI R20,5
31A E050 LDI R21,0
31B E060 LDI R22,0
31C E070 LDI R23,0
31D 937A ST R23,-Y
31E 936A ST R22,-Y
31F 935A ST R21,-Y
320 934A ST R20,-Y
321 0181 MOVW R16,R2
322 0192 MOVW R18,R4
323 940E 06C8 CALL div32u
325 E142 LDI R20,0x12
326 E050 LDI R21,0
327 E060 LDI R22,0
328 E070 LDI R23,0
329 933A ST R19,-Y
32A 932A ST R18,-Y
32B 931A ST R17,-Y
32C 930A ST R16,-Y
32D 018A MOVW R16,R20
32E 019B MOVW R18,R22
32F 940E 0732 CALL empy32u
331 9310 0063 STS circle+1,R17
333 9300 0062 STS circle,R16
335 9330 0065 STS circle+3,R19
337 9320 0064 STS circle+2,R18
(0410) LCD_write_datalongint(1, 8, circle);
339 0118 MOVW R2,R16
33A 0129 MOVW R4,R18
33B 8228 STD Y+0,R2
33C 8239 STD Y+1,R3
33D 824A STD Y+2,R4
33E 825B STD Y+3,R5
33F E028 LDI R18,0x8
340 E001 LDI R16,1
341 940E 067A CALL _LCD_write_datalongint
(0411) T0_10_set = 0;
343 2422 CLR R2
344 9220 007C STS T0_10_set,R2
(0412) }
(0413)
(0414) if (circle_n_new != circle_n_old) {
346 9020 0067 LDS R2,circle_n_old
348 9030 0066 LDS R3,circle_n_new
34A 1432 CP R3,R2
34B F109 BEQ 0x036D
(0415) LCD_write_datalongint(1, 15, circle_n_new);
34C 2C23 MOV R2,R3
34D 2433 CLR R3
34E 2444 CLR R4
34F 2455 CLR R5
350 8228 STD Y+0,R2
351 8239 STD Y+1,R3
352 824A STD Y+2,R4
353 825B STD Y+3,R5
354 E02F LDI R18,0xF
355 E001 LDI R16,1
356 940E 067A CALL _LCD_write_datalongint
(0416) circle_n_old = circle_n_new;
358 9020 0066 LDS R2,circle_n_new
35A 9220 0067 STS circle_n_old,R2
(0417)
(0418) LightOnOff(ON);
35C E001 LDI R16,1
35D DD66 RCALL _LightOnOff
(0419) light_set_flag = 1;
35E E081 LDI R24,1
35F 9380 0071 STS light_set_flag,R24
(0420) Light_time = 0;
361 E040 LDI R20,0
362 E050 LDI R21,0
363 E060 LDI R22,0
364 E070 LDI R23,0
365 9350 006E STS Light_time+1,R21
367 9340 006D STS Light_time,R20
369 9370 0070 STS Light_time+3,R23
36B 9360 006F STS Light_time+2,R22
(0421) }
(0422)
(0423) if ((light_set_flag == 1) && (Light_time++) >= 5000) {
36D 9180 0071 LDS R24,light_set_flag
36F 3081 CPI R24,1
370 F591 BNE 0x03A3
371 9040 006F LDS R4,Light_time+2
373 9050 0070 LDS R5,Light_time+3
375 9020 006D LDS R2,Light_time
377 9030 006E LDS R3,Light_time+1
379 822C STD Y+4,R2
37A 823D STD Y+5,R3
37B 824E STD Y+6,R4
37C 825F STD Y+7,R5
37D E041 LDI R20,1
37E E050 LDI R21,0
37F E060 LDI R22,0
380 E070 LDI R23,0
381 802C LDD R2,Y+4
382 803D LDD R3,Y+5
383 804E LDD R4,Y+6
384 805F LDD R5,Y+7
385 0E24 ADD R2,R20
386 1E35 ADC R3,R21
387 1E46 ADC R4,R22
388 1E57 ADC R5,R23
389 9230 006E STS Light_time+1,R3
38B 9220 006D STS Light_time,R2
38D 9250 0070 STS Light_time+3,R5
38F 9240 006F STS Light_time+2,R4
391 E848 LDI R20,0x88
392 E153 LDI R21,0x13
393 E060 LDI R22,0
394 E070 LDI R23,0
395 802C LDD R2,Y+4
396 803D LDD R3,Y+5
397 804E LDD R4,Y+6
398 805F LDD R5,Y+7
399 1624 CP R2,R20
39A 0635 CPC R3,R21
39B 0646 CPC R4,R22
39C 0657 CPC R5,R23
39D F028 BCS 0x03A3
(0424) light_set_flag = 0;
39E 2422 CLR R2
39F 9220 0071 STS light_set_flag,R2
(0425) LightOnOff(OFF);
3A1 2700 CLR R16
3A2 DD21 RCALL _LightOnOff
3A3 CF3A RJMP 0x02DE
3A4 CF0E RJMP 0x02B3
3A5 CF08 RJMP 0x02AE
3A6 9628 ADIW R28,0x8
3A7 9508 RET
FILE: d:\我的文档\桌面\小车\car1\delay.c
(0001) #define _DELAY_C_
(0002) #include "DELAY.H" //用户自己定义的头文件
(0003)
(0004) //1us延时函数
(0005) void delay_1us( void )
(0006) {
(0007) uint i = 1;
_delay_1us:
i --> R16
3A8 E001 LDI R16,1
3A9 E010 LDI R17,0
3AA C001 RJMP 0x03AC
(0008) while( i-- )
(0009) {
(0010) asm("nop");
3AB 0000 NOP
3AC 0118 MOVW R2,R16
3AD 5001 SUBI R16,1
3AE 4010 SBCI R17,0
3AF 2022 TST R2
3B0 F7D1 BNE 0x03AB
3B1 2033 TST R3
3B2 F7C1 BNE 0x03AB
3B3 9508 RET
_delay_nus:
i --> R20
n --> R10
3B4 940E 077C CALL push_xgset300C
3B6 0158 MOVW R10,R16
(0011) }
(0012) }
(0013)
(0014) //nus延时函数
(0015) void delay_nus( uint n )
(0016) {
(0017) uint i = 0;
3B7 2744 CLR R20
3B8 2755 CLR R21
(0018) for (i = 0; i < n; i++)
3B9 C003 RJMP 0x03BD
(0019) delay_1us();
3BA DFED RCALL _delay_1us
3BB 5F4F SUBI R20,0xFF
3BC 4F5F SBCI R21,0xFF
3BD 154A CP R20,R10
3BE 055B CPC R21,R11
3BF F3D0 BCS 0x03BA
3C0 940C 0781 JMP pop_xgset300C
(0020) }
(0021)
(0022) //1ms延时函数
(0023) void delay_1ms( void )
(0024) {
(0025) uint i;
(0026) for (i = 0; i < 1140; i++)
_delay_1ms:
i --> R16
3C2 2700 CLR R16
3C3 2711 CLR R17
3C4 C002 RJMP 0x03C7
3C5 5F0F SUBI R16,0xFF
3C6 4F1F SBCI R17,0xFF
3C7 3704 CPI R16,0x74
3C8 E0E4 LDI R30,4
3C9 071E CPC R17,R30
3CA F3D0 BCS 0x03C5
3CB 9508 RET
_delay_nms:
i --> R20
n --> R10
3CC 940E 077C CALL push_xgset300C
3CE 0158 MOVW R10,R16
(0027) {;}
(0028) }
(0029)
(0030) //nms延时函数
(0031) void delay_nms( uint n )
(0032) {
(0033) uint i = 0;
3CF 2744 CLR R20
3D0 2755 CLR R21
(0034) for (i = 0; i < n; i++)
3D1 C003 RJMP 0x03D5
(0035) delay_1ms();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -