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 + -
显示快捷键?