⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 car1.lst

📁 基于m16的寻迹小车(包含小车题目
💻 LST
📖 第 1 页 / 共 5 页
字号:
     508 930A      ST	R16,-Y
     509 0181      MOVW	R16,R2
     50A 0192      MOVW	R18,R4
     50B 940E 0868 CALL	fpadd2
     50D 870C      STD	Y+12,R16
     50E 871D      STD	Y+13,R17
     50F 872E      STD	Y+14,R18
     510 873F      STD	Y+15,R19
(0090)         flag1 = 1;
     511 24EE      CLR	R14
     512 94E3      INC	R14
(0091)         if( dataf < 0 )
     513 8C2A      LDD	R2,Y+26
     514 8C3B      LDD	R3,Y+27
     515 8C4C      LDD	R4,Y+28
     516 8C5D      LDD	R5,Y+29
     517 E50C      LDI	R16,0x5C
     518 E010      LDI	R17,0
     519 940E 07EC CALL	lpm32
     51B 933A      ST	R19,-Y
     51C 932A      ST	R18,-Y
     51D 931A      ST	R17,-Y
     51E 930A      ST	R16,-Y
     51F 0181      MOVW	R16,R2
     520 0192      MOVW	R18,R4
     521 940E 0999 CALL	fpcmp2
     523 F4BC      BGE	0x053B
(0092)         {
(0093)             flag2 = 1;
     524 24CC      CLR	R12
     525 94C3      INC	R12
(0094)             dataftmp -= 4;      //随便一个整数 只是为了扩大为首位不为0的数
     526 842C      LDD	R2,Y+12
     527 843D      LDD	R3,Y+13
     528 844E      LDD	R4,Y+14
     529 845F      LDD	R5,Y+15
     52A E508      LDI	R16,0x58
     52B E010      LDI	R17,0
     52C 940E 07EC CALL	lpm32
     52E 933A      ST	R19,-Y
     52F 932A      ST	R18,-Y
     530 931A      ST	R17,-Y
     531 930A      ST	R16,-Y
     532 0181      MOVW	R16,R2
     533 0192      MOVW	R18,R4
     534 940E 0873 CALL	fpsub2
     536 870C      STD	Y+12,R16
     537 871D      STD	Y+13,R17
     538 872E      STD	Y+14,R18
     539 873F      STD	Y+15,R19
(0095)             flag1 = 0;
     53A 24EE      CLR	R14
(0096)         }
(0097)     }
(0098) 
(0099)     for( i = 0; i < p + 1; i++ )
     53B 2744      CLR	R20
     53C C00F      RJMP	0x054C
(0100)         dataftmp = dataftmp * 10;
     53D E504      LDI	R16,0x54
     53E E010      LDI	R17,0
     53F 940E 07EC CALL	lpm32
     541 01CE      MOVW	R24,R28
     542 960C      ADIW	R24,0xC
     543 939A      ST	R25,-Y
     544 938A      ST	R24,-Y
     545 940E 0982 CALL	fpmule1
     547 870C      STD	Y+12,R16
     548 871D      STD	Y+13,R17
     549 872E      STD	Y+14,R18
     54A 873F      STD	Y+15,R19
     54B 9543      INC	R20
     54C 2F86      MOV	R24,R22
     54D 5F8F      SUBI	R24,0xFF
     54E 1748      CP	R20,R24
     54F F368      BCS	0x053D
(0101) 
(0102)     long_to_string( (long int)dataftmp, datastr1 );
     550 01CE      MOVW	R24,R28
     551 9602      ADIW	R24,2
     552 8399      STD	Y+1,R25
     553 8388      STD	Y+0,R24
     554 850C      LDD	R16,Y+12
     555 851D      LDD	R17,Y+13
     556 852E      LDD	R18,Y+14
     557 853F      LDD	R19,Y+15
     558 940E 087E CALL	fpint
     55A DE8D      RCALL	_long_to_string
(0103)     k = strlen( datastr1 );
     55B 018E      MOVW	R16,R28
     55C 5F0E      SUBI	R16,0xFE
     55D 4F1F      SBCI	R17,0xFF
     55E 940E 06B7 CALL	_strlen
     560 2EA0      MOV	R10,R16
(0104) 
(0105)     for( i = 1; i < p + 1; i++ )
     561 E041      LDI	R20,1
     562 C013      RJMP	0x0576
(0106)         *( datastr1 + (k-i) ) =  *( datastr1 + (k-i-1) );
     563 2E24      MOV	R2,R20
     564 2433      CLR	R3
     565 2C4A      MOV	R4,R10
     566 2455      CLR	R5
     567 1842      SUB	R4,R2
     568 0853      SBC	R5,R3
     569 01CE      MOVW	R24,R28
     56A 9601      ADIW	R24,1
     56B 01F2      MOVW	R30,R4
     56C 0FE8      ADD	R30,R24
     56D 1FF9      ADC	R31,R25
     56E 8020      LDD	R2,Z+0
     56F 01CE      MOVW	R24,R28
     570 9602      ADIW	R24,2
     571 01F2      MOVW	R30,R4
     572 0FE8      ADD	R30,R24
     573 1FF9      ADC	R31,R25
     574 8220      STD	Z+0,R2
     575 9543      INC	R20
     576 2F86      MOV	R24,R22
     577 5F8F      SUBI	R24,0xFF
     578 1748      CP	R20,R24
     579 F348      BCS	0x0563
(0107) 
(0108)     *( datastr1 + (k-i) ) = '.';
     57A 2E24      MOV	R2,R20
     57B 2433      CLR	R3
     57C 2DEA      MOV	R30,R10
     57D 27FF      CLR	R31
     57E 19E2      SUB	R30,R2
     57F 09F3      SBC	R31,R3
     580 01CE      MOVW	R24,R28
     581 9602      ADIW	R24,2
     582 0FE8      ADD	R30,R24
     583 1FF9      ADC	R31,R25
     584 E28E      LDI	R24,0x2E
     585 8380      STD	Z+0,R24
(0109) 
(0110) 
(0111)     if( flag1 )        //如果为0.00820之类的数
     586 20EE      TST	R14
     587 F019      BEQ	0x058B
(0112)     {
(0113)         *datastr1 = '0';
     588 E380      LDI	R24,0x30
     589 838A      STD	Y+2,R24
(0114)         flag1 = 0;
     58A 24EE      CLR	R14
(0115)     }
(0116) 
(0117)     if( flag2 )       //如果为-0.00820之类的数
     58B 20CC      TST	R12
     58C F021      BEQ	0x0591
(0118)     {
(0119)         *datastr1 = '-';
     58D E28D      LDI	R24,0x2D
     58E 838A      STD	Y+2,R24
(0120)         *( datastr1 + 1 ) = '0';
     58F E380      LDI	R24,0x30
     590 838B      STD	Y+3,R24
(0121)     }
(0122) 
(0123)     if( p == 0 )
     591 2366      TST	R22
     592 F461      BNE	0x059F
(0124)     {
(0125)         *( datastr1 + (k-i) ) = '\0';
     593 2E24      MOV	R2,R20
     594 2433      CLR	R3
     595 2DEA      MOV	R30,R10
     596 27FF      CLR	R31
     597 19E2      SUB	R30,R2
     598 09F3      SBC	R31,R3
     599 01CE      MOVW	R24,R28
     59A 9602      ADIW	R24,2
     59B 0FE8      ADD	R30,R24
     59C 1FF9      ADC	R31,R25
     59D 2422      CLR	R2
     59E 8220      STD	Z+0,R2
(0126)     }
(0127) 
(0128)     strcpy( datastr, datastr1 );
     59F 019E      MOVW	R18,R28
     5A0 5F2E      SUBI	R18,0xFE
     5A1 4F3F      SBCI	R19,0xFF
     5A2 8D0E      LDD	R16,Y+30
     5A3 8D1F      LDD	R17,Y+31
     5A4 940E 06AE CALL	_strcpy
     5A6 9660      ADIW	R28,0x10
     5A7 940E 0766 CALL	pop_xgsetF0FC
     5A9 9624      ADIW	R28,4
     5AA 9508      RET
(0129) }
(0130) //*********************************************************************************************
(0131) 
(0132) //==========================================
(0133) //函数名称:液晶模块使能
(0134) //函数作用: 使能液晶
(0135) //入口参数: 无
(0136) //返回类型:无
(0137) //==========================================
(0138) void LCD_en_write(void)
(0139) {
(0140)   EN_SET;
_LCD_en_write:
     5AB 9ADB      SBI	0x1B,3
(0141)   delay_nus(4);
     5AC E004      LDI	R16,4
     5AD E010      LDI	R17,0
     5AE 940E 03B4 CALL	_delay_nus
(0142)   EN_CLR;
     5B0 98DB      CBI	0x1B,3
     5B1 9508      RET
_LCD_write_command:
  command              --> R20
     5B2 934A      ST	R20,-Y
     5B3 2F40      MOV	R20,R16
(0143) }
(0144) 
(0145) //==========================================
(0146) //函数名称:写指令
(0147) //函数作用:
(0148) //入口参数: 液晶指令command
(0149) //返回类型:无
(0150) //==========================================
(0151) void LCD_write_command(uchar command)
(0152) {
(0153)   delay_nus( 16 );
     5B4 E100      LDI	R16,0x10
     5B5 E010      LDI	R17,0
     5B6 940E 03B4 CALL	_delay_nus
(0154)   RS_CLR;
     5B8 98D9      CBI	0x1B,1
(0155)   DB &= 0X0F;           //清高四位
     5B9 B38B      IN	R24,0x1B
     5BA 708F      ANDI	R24,0xF
     5BB BB8B      OUT	0x1B,R24
(0156)   DB |= command & 0xf0; //写高四位
     5BC 2F84      MOV	R24,R20
     5BD 7F80      ANDI	R24,0xF0
     5BE B22B      IN	R2,0x1B
     5BF 2A28      OR	R2,R24
     5C0 BA2B      OUT	0x1B,R2
(0157)   LCD_en_write();
     5C1 DFE9      RCALL	_LCD_en_write
(0158)   command=command << 4;   //低四位移到高四位
     5C2 2F84      MOV	R24,R20
     5C3 708F      ANDI	R24,0xF
     5C4 9582      SWAP	R24
     5C5 2F48      MOV	R20,R24
(0159)   DB &= 0x0f;             //清高四位
     5C6 B38B      IN	R24,0x1B
     5C7 708F      ANDI	R24,0xF
     5C8 BB8B      OUT	0x1B,R24
(0160)   DB |= command & 0xf0;   //写低四位
     5C9 2F84      MOV	R24,R20
     5CA 7F80      ANDI	R24,0xF0
     5CB B22B      IN	R2,0x1B
     5CC 2A28      OR	R2,R24
     5CD BA2B      OUT	0x1B,R2
(0161)   LCD_en_write();
     5CE DFDC      RCALL	_LCD_en_write
     5CF 9149      LD	R20,Y+
     5D0 9508      RET
_LCD_write_data:
  DATA                 --> R20
     5D1 934A      ST	R20,-Y
     5D2 2F40      MOV	R20,R16
(0162)   //delay_nms(2);         //清屏指令时间很长, 保险起见,可以增加
(0163) }
(0164) 
(0165) //==========================================
(0166) //函数名称:写数据
(0167) //函数作用:
(0168) //入口参数: 数据DATA
(0169) //返回类型:无
(0170) //==========================================
(0171) void LCD_write_data(uchar DATA)
(0172) {
(0173)   delay_nus(16);
     5D3 E100      LDI	R16,0x10
     5D4 E010      LDI	R17,0
     5D5 940E 03B4 CALL	_delay_nus
(0174)   RS_SET;           //RS=1
     5D7 9AD9      SBI	0x1B,1
(0175)   DB &= 0X0f;       //清高四位
     5D8 B38B      IN	R24,0x1B
     5D9 708F      ANDI	R24,0xF
     5DA BB8B      OUT	0x1B,R24
(0176)   DB |= DATA&0xf0;  //写高四位
     5DB 2F84      MOV	R24,R20
     5DC 7F80      ANDI	R24,0xF0
     5DD B22B      IN	R2,0x1B
     5DE 2A28      OR	R2,R24
     5DF BA2B      OUT	0x1B,R2
(0177)   LCD_en_write();
     5E0 DFCA      RCALL	_LCD_en_write
(0178)   DATA = DATA << 4; //低四位移到高四位
     5E1 2F84      MOV	R24,R20
     5E2 708F      ANDI	R24,0xF
     5E3 9582      SWAP	R24
     5E4 2F48      MOV	R20,R24
(0179)   DB &= 0X0f;       //清高四位
     5E5 B38B      IN	R24,0x1B
     5E6 708F      ANDI	R24,0xF
     5E7 BB8B      OUT	0x1B,R24
(0180)   DB |= DATA&0xf0;  //写低四位
     5E8 2F84      MOV	R24,R20
     5E9 7F80      ANDI	R24,0xF0
     5EA B22B      IN	R2,0x1B
     5EB 2A28      OR	R2,R24
     5EC BA2B      OUT	0x1B,R2
(0181)   LCD_en_write();
     5ED DFBD      RCALL	_LCD_en_write
     5EE 9149      LD	R20,Y+
     5EF 9508      RET
(0182) }
(0183) 
(0184) //==========================================
(0185) //函数名称:液晶初始化函数
(0186) //函数作用:
(0187) //入口参数: 无
(0188) //返回类型:无
(0189) //==========================================
(0190) void LCD_init( void )
(0191) {
(0192)   DB_DDR_OUT;
_LCD_init:
     5F0 B38A      IN	R24,0x1A
     5F1 6F80      ORI	R24,0xF0
     5F2 BB8A      OUT	0x1A,R24
     5F3 B38A      IN	R24,0x1A
     5F4 608A      ORI	R24,0xA
     5F5 BB8A      OUT	0x1A,R24
(0193)   LCD_write_command(0x28);
     5F6 E208      LDI	R16,0x28
     5F7 DFBA      RCALL	_LCD_write_command
(0194)   LCD_en_write();           //********总结这里一定要加这液晶使能*********
     5F8 DFB2      RCALL	_LCD_en_write
(0195)   delay_nus(20);
     5F9 E104      LDI	R16,0x14
     5FA E010      LDI	R17,0
     5FB 940E 03B4 CALL	_delay_nus
(0196)   LCD_write_command(0x28);  //4位显示
     5FD E208      LDI	R16,0x28
     5FE DFB3      RCALL	_LCD_write_command
(0197)   LCD_write_command(0x0c);  //显示开
     5FF E00C      LDI	R16,0xC
     600 DFB1      RCALL	_LCD_write_command
(0198)   LCD_write_command(0x01);  //清屏
     601 E001      LDI	R16,1
     602 DFAF      RCALL	_LCD_write_command
(0199)   delay_nms(5);             //延时一定要长
     603 E005      LDI	R16,5
     604 E010      LDI	R17,0
     605 940E 03CC CALL	_delay_nms
     607 9508      RET
_LCD_set_rc:
  address              --> R20
  c                    --> R22
  r                    --> R10
     608 940E 0790 CALL	push_xgsetF00C
     60A 2F62      MOV	R22,R18
     60B 2EA0      MOV	R10,R16
(0200) }
(0201) 
(0202) //==========================================
(0203) //函数名称:写地址
(0204) //函数作用:
(0205) //入口参数: 行位置r, 列位置c
(0206) //返回类型:无
(0207) //==========================================
(0208) void LCD_set_rc( uchar r, uchar c )
(0209) {
(0210)     uchar address;
(0211) 
(0212)     if (r == 1)
     60C 2D8A      MOV	R24,R10
     60D 3081      CPI	R24,1
     60E F419      BNE	0x0612
(0213)     address = 0x80 + c;
     60F 2F46      MOV	R20,R22
     610 5840      SUBI	R20,0x80
     611 C005      RJMP	0x0617
(0214)     else if(r == 2)
     612 2D8A      MOV	R24,R10
     613 3082      CPI	R24,2
     614 F411      BNE	0x0617
(0215)     address = 0xc0 + c;
     615 2F46      MOV	R20,R22
     616 5440      SUBI	R20,0x40
(0216) 
(0217)     LCD_write_command( address );
     617 2F04      MOV	R16,R20
     618 DF99      RCALL	_LCD_write_command
     619 940C 0797 JMP	pop_xgsetF00C
_LCD_write_string:
  s                    --> R20
  c                    --> R12
  r                    --> R10
     61B 940E 079E CALL	push_xgset303C
     61D 2EC2      MOV	R12,R18
     61E 2EA0      MOV	R10,R16
     61F 814E      LDD	R20,Y+6
     620 815F      LDD	R21,Y+7
(0218) }
(0219) 
(0220) //==========================================
(0221) //函数名称:写字符串
(0222) //函数作用: 在指定位置写一串字符串
(0223) //入口参数: 行位置r, 列位置c, 字符串*s
(0224) //返回类型:无
(0225) //示例    : LCD_write_string( 1, 2, "dongxixiaonanbei" );
(0226) //==========================================
(0227) void LCD_write_string(uchar r, uchar c, uchar *s)
(0228) {
(0229)     LCD_set_rc( r, c ); //写地址
     621 2D2C      MOV	R18,R12
     622 2D0A      MOV	R16,R10
     623 DFE4      RCALL	_LCD_set_rc
     624 C005      RJMP	0x0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -