car_main.lis
来自「基于m16的寻迹小车(包含小车题目」· LIS 代码 · 共 1,632 行 · 第 1/5 页
LIS
1,632 行
03F6 .dbline 354
03F6 ;
03F6 ; DDRB &=~ (1 << PB0); //T0做外部计数
03F6 B898 cbi 0x17,0
03F8 .dbline 355
03F8 ; PORTB |= (1 << PB0);
03F8 C09A sbi 0x18,0
03FA .dbline 357
03FA ;
03FA ; MCUCR = 0x0A; //中断方式, 都是下降沿
03FA 8AE0 ldi R24,10
03FC 85BF out 0x35,R24
03FE .dbline 358
03FE ; GICR |= (1 << INT1) | (1 << INT0);
03FE 8BB7 in R24,0x3b
0400 806C ori R24,192
0402 8BBF out 0x3b,R24
0404 .dbline -2
0404 L68:
0404 .dbline 0 ; func end
0404 0895 ret
0406 .dbend
0406 .dbfunc e main _main fV
.even
0406 _main::
0406 2897 sbiw R28,8
0408 .dbline -1
0408 .dbline 368
0408 ;
0408 ; //TIMSK = 0x80; //定时器中断使能
0408 ; //SEI();
0408 ; }
0408 ;
0408 ; #define debug
0408 ; //主函数
0408 ; void main(void)
0408 ;
0408 ; {
0408 .dbline 369
0408 ; init_devices();
0408 D6DF xcall _init_devices
040A .dbline 371
040A ;
040A ; LCD_write_string(1, 4, "Good luck");
040A 80E0 ldi R24,<L70
040C 90E0 ldi R25,>L70
040E 9983 std y+1,R25
0410 8883 std y+0,R24
0412 24E0 ldi R18,4
0414 01E0 ldi R16,1
0416 0E940000 xcall _LCD_write_string
041A .dbline 372
041A ; LCD_write_string(2, 0, "made on 09-05-01");
041A 80E0 ldi R24,<L71
041C 90E0 ldi R25,>L71
041E 9983 std y+1,R25
0420 8883 std y+0,R24
0422 2227 clr R18
0424 02E0 ldi R16,2
0426 0E940000 xcall _LCD_write_string
042A .dbline 375
042A ;
042A ; #ifdef debug
042A ; LightOnOff(ON);
042A 01E0 ldi R16,1
042C 21DE xcall _LightOnOff
042E .dbline 376
042E ; delay_nms(200);
042E 08EC ldi R16,200
0430 10E0 ldi R17,0
0432 0E940000 xcall _delay_nms
0436 .dbline 377
0436 ; LightOnOff(OFF);
0436 0027 clr R16
0438 1BDE xcall _LightOnOff
043A .dbline 378
043A ; delay_nms(200);
043A 08EC ldi R16,200
043C 10E0 ldi R17,0
043E 0E940000 xcall _delay_nms
0442 F7C0 xjmp L73
0444 L72:
0444 .dbline 383
0444 ; #endif
0444 ;
0444 ; //while(1) {;}
0444 ;
0444 ; while(1){
0444 .dbline 384
0444 ; if ((PINA & (1 << PA0)) == 0 ) { //等待按下开始键
0444 C899 sbic 0x19,0
0446 F5C0 rjmp L75
0448 X24:
0448 .dbline 384
0448 .dbline 385
0448 ; SEI(); //打开全局中断
0448 7894 sei
044A .dbline 387
044A ;
044A ; CarGoAheadMidSpeed(); //小车向前
044A F6DD xcall _CarGoAheadMidSpeed
044C F1C0 xjmp L78
044E L77:
044E .dbline 388
044E ; while (1) {
044E .dbline 389
044E ; CarFindLine(); //小车寻线
044E 67DF xcall _CarFindLine
0450 .dbline 391
0450 ;
0450 ; if (getlinestart == 1) { //如果遇到起跑线
0450 80910800 lds R24,_getlinestart
0454 8130 cpi R24,1
0456 09F0 breq X32
0458 EBC0 xjmp L80
045A X32:
045A X25:
045A .dbline 391
045A .dbline 392
045A ; LCD_write_string(1, 0, " ");
045A 80E0 ldi R24,<L82
045C 90E0 ldi R25,>L82
045E 9983 std y+1,R25
0460 8883 std y+0,R24
0462 2227 clr R18
0464 01E0 ldi R16,1
0466 0E940000 xcall _LCD_write_string
046A .dbline 393
046A ; LCD_write_string(2, 0, " ");
046A 80E0 ldi R24,<L82
046C 90E0 ldi R25,>L82
046E 9983 std y+1,R25
0470 8883 std y+0,R24
0472 2227 clr R18
0474 02E0 ldi R16,2
0476 0E940000 xcall _LCD_write_string
047A .dbline 394
047A ; LCD_write_string(1, 0, "circle: cm ");
047A 80E0 ldi R24,<L83
047C 90E0 ldi R25,>L83
047E 9983 std y+1,R25
0480 8883 std y+0,R24
0482 2227 clr R18
0484 01E0 ldi R16,1
0486 0E940000 xcall _LCD_write_string
048A .dbline 395
048A ; LCD_write_string(2, 0, "time : 0 s ");
048A 80E0 ldi R24,<L84
048C 90E0 ldi R25,>L84
048E 9983 std y+1,R25
0490 8883 std y+0,R24
0492 2227 clr R18
0494 02E0 ldi R16,2
0496 0E940000 xcall _LCD_write_string
049A .dbline 397
049A ;
049A ; Time0OnOff(ON); //开始计算路程
049A 01E0 ldi R16,1
049C 88DE xcall _Time0OnOff
049E .dbline 398
049E ; Time2OnOff(ON); //开始计时
049E 01E0 ldi R16,1
04A0 3BDE xcall _Time2OnOff
04A2 C5C0 xjmp L86
04A4 L85:
04A4 .dbline 400
04A4 ;
04A4 ; while (1) {
04A4 .dbline 401
04A4 ; CarFindLine(); //寻线
04A4 3CDF xcall _CarFindLine
04A6 .dbline 403
04A6 ;
04A6 ; if (T2_1s_set == 1) { //显示时间
04A6 80911700 lds R24,_T2_1s_set
04AA 8130 cpi R24,1
04AC 99F4 brne L88
04AE X26:
04AE .dbline 403
04AE .dbline 404
04AE ; LCD_write_datalongint(2, 8, T2_1s_set_n);
04AE 40901500 lds R4,_T2_1s_set_n+2
04B2 50901600 lds R5,_T2_1s_set_n+2+1
04B6 20901300 lds R2,_T2_1s_set_n
04BA 30901400 lds R3,_T2_1s_set_n+1
04BE 2882 std y+0,R2
04C0 3982 std y+1,R3
04C2 4A82 std y+2,R4
04C4 5B82 std y+3,R5
04C6 28E0 ldi R18,8
04C8 02E0 ldi R16,2
04CA 0E940000 xcall _LCD_write_datalongint
04CE .dbline 405
04CE ; T2_1s_set = 0;
04CE 2224 clr R2
04D0 20921700 sts _T2_1s_set,R2
04D4 .dbline 406
04D4 ; }
04D4 L88:
04D4 .dbline 408
04D4 ;
04D4 ; if (T0_10_set == 1) { //显示路程
04D4 80911C00 lds R24,_T0_10_set
04D8 8130 cpi R24,1
04DA 09F0 breq X33
04DC 4BC0 xjmp L90
04DE X33:
04DE X27:
04DE .dbline 408
04DE .dbline 409
04DE ; circle = (((10 * T0_10_n) + TCNT0) / 5) * LENGHT_PER_CIRCLE;
04DE 40901A00 lds R4,_T0_10_n+2
04E2 50901B00 lds R5,_T0_10_n+2+1
04E6 20901800 lds R2,_T0_10_n
04EA 30901900 lds R3,_T0_10_n+1
04EE 4AE0 ldi R20,10
04F0 50E0 ldi R21,0
04F2 60E0 ldi R22,0
04F4 70E0 ldi R23,0
04F6 5A92 st -y,R5
04F8 4A92 st -y,R4
04FA 3A92 st -y,R3
04FC 2A92 st -y,R2
04FE 8A01 movw R16,R20
0500 9B01 movw R18,R22
0502 0E940000 xcall empy32u
0506 1801 movw R2,R16
0508 2901 movw R4,R18
050A 62B6 in R6,0x32
050C 7724 clr R7
050E 8824 clr R8
0510 9924 clr R9
0512 260C add R2,R6
0514 371C adc R3,R7
0516 481C adc R4,R8
0518 591C adc R5,R9
051A 45E0 ldi R20,5
051C 50E0 ldi R21,0
051E 60E0 ldi R22,0
0520 70E0 ldi R23,0
0522 7A93 st -y,R23
0524 6A93 st -y,R22
0526 5A93 st -y,R21
0528 4A93 st -y,R20
052A 8101 movw R16,R2
052C 9201 movw R18,R4
052E 0E940000 xcall div32u
0532 42E1 ldi R20,18
0534 50E0 ldi R21,0
0536 60E0 ldi R22,0
0538 70E0 ldi R23,0
053A 3A93 st -y,R19
053C 2A93 st -y,R18
053E 1A93 st -y,R17
0540 0A93 st -y,R16
0542 8A01 movw R16,R20
0544 9B01 movw R18,R22
0546 0E940000 xcall empy32u
054A 10930300 sts _circle+1,R17
054E 00930200 sts _circle,R16
0552 30930500 sts _circle+2+1,R19
0556 20930400 sts _circle+2,R18
055A .dbline 410
055A ; LCD_write_datalongint(1, 8, circle);
055A 1801 movw R2,R16
055C 2901 movw R4,R18
055E 2882 std y+0,R2
0560 3982 std y+1,R3
0562 4A82 std y+2,R4
0564 5B82 std y+3,R5
0566 28E0 ldi R18,8
0568 01E0 ldi R16,1
056A 0E940000 xcall _LCD_write_datalongint
056E .dbline 411
056E ; T0_10_set = 0;
056E 2224 clr R2
0570 20921C00 sts _T0_10_set,R2
0574 .dbline 412
0574 ; }
0574 L90:
0574 .dbline 414
0574 ;
0574 ; if (circle_n_new != circle_n_old) {
0574 20900700 lds R2,_circle_n_old
0578 30900600 lds R3,_circle_n_new
057C 3214 cp R3,R2
057E 09F1 breq L92
0580 X28:
0580 .dbline 414
0580 .dbline 415
0580 ; LCD_write_datalongint(1, 15, circle_n_new);
0580 232C mov R2,R3
0582 3324 clr R3
0584 4424 clr R4
0586 5524 clr R5
0588 2882 std y+0,R2
058A 3982 std y+1,R3
058C 4A82 std y+2,R4
058E 5B82 std y+3,R5
0590 2FE0 ldi R18,15
0592 01E0 ldi R16,1
0594 0E940000 xcall _LCD_write_datalongint
0598 .dbline 416
0598 ; circle_n_old = circle_n_new;
0598 20900600 lds R2,_circle_n_new
059C 20920700 sts _circle_n_old,R2
05A0 .dbline 418
05A0 ;
05A0 ; LightOnOff(ON);
05A0 01E0 ldi R16,1
05A2 66DD xcall _LightOnOff
05A4 .dbline 419
05A4 ; light_set_flag = 1;
05A4 81E0 ldi R24,1
05A6 80931100 sts _light_set_flag,R24
05AA .dbline 420
05AA ; Light_time = 0;
05AA 40E0 ldi R20,0
05AC 50E0 ldi R21,0
05AE 60E0 ldi R22,0
05B0 70E0 ldi R23,0
05B2 50930E00 sts _Light_time+1,R21
05B6 40930D00 sts _Light_time,R20
05BA 70931000 sts _Light_
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?