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

📄 jidong.lst

📁 基于m16的寻迹寻光小车程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0015) void delay_nus( uint n )
(0016) {
(0017)    uint i = 0;
     5AF 2744      CLR	R20
     5B0 2755      CLR	R21
(0018)    for (i = 0; i < n; i++)
     5B1 C003      RJMP	0x05B5
(0019)    delay_1us();
     5B2 DFED      RCALL	_delay_1us
     5B3 5F4F      SUBI	R20,0xFF
     5B4 4F5F      SBCI	R21,0xFF
     5B5 154A      CP	R20,R10
     5B6 055B      CPC	R21,R11
     5B7 F3D0      BCS	0x05B2
     5B8 940C 090F 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
     5BA 2700      CLR	R16
     5BB 2711      CLR	R17
     5BC C002      RJMP	0x05BF
     5BD 5F0F      SUBI	R16,0xFF
     5BE 4F1F      SBCI	R17,0xFF
     5BF 3704      CPI	R16,0x74
     5C0 E0E4      LDI	R30,4
     5C1 071E      CPC	R17,R30
     5C2 F3D0      BCS	0x05BD
     5C3 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R10
     5C4 940E 090A CALL	push_xgset300C
     5C6 0158      MOVW	R10,R16
(0027)    {;}
(0028) }
(0029) 
(0030) //nms延时函数
(0031) void delay_nms( uint n )
(0032) {
(0033)    uint i = 0;
     5C7 2744      CLR	R20
     5C8 2755      CLR	R21
(0034)    for (i = 0; i < n; i++)
     5C9 C003      RJMP	0x05CD
(0035)    delay_1ms();
     5CA DFEF      RCALL	_delay_1ms
     5CB 5F4F      SUBI	R20,0xFF
     5CC 4F5F      SBCI	R21,0xFF
     5CD 154A      CP	R20,R10
     5CE 055B      CPC	R21,R11
     5CF F3D0      BCS	0x05CA
     5D0 940C 090F JMP	pop_xgset300C
_delay_ns:
  i                    --> R10
  n                    --> R12
     5D2 92AA      ST	R10,-Y
     5D3 92CA      ST	R12,-Y
     5D4 2EC0      MOV	R12,R16
(0036) }
(0037) 
(0038) //延时1S
(0039) void delay_ns( uchar n )
(0040) {
(0041)     uchar i;
(0042) 	for( i = 0; i < n; i++ )
     5D5 24AA      CLR	R10
     5D6 C004      RJMP	0x05DB
(0043) 	{
(0044)   	 	delay_nms( 1000 );
     5D7 EE08      LDI	R16,0xE8
     5D8 E013      LDI	R17,3
     5D9 DFEA      RCALL	_delay_nms
     5DA 94A3      INC	R10
     5DB 14AC      CP	R10,R12
     5DC F3D0      BCS	0x05D7
     5DD 90C9      LD	R12,Y+
     5DE 90A9      LD	R10,Y+
     5DF 9508      RET
FILE: C:\DOCUME~1\Administrator\桌面\自动充电小车\自动充电小车\298\lcd.c
(0001) #define _LCD_C_
(0002) #include "LCD.h"
(0003) #include <iom16v.h>
(0004) //==========================================
(0005) //函数名称:液晶模块使能
(0006) //函数作用: 使能液晶
(0007) //入口参数: 无
(0008) //返回类型:无
(0009) //==========================================
(0010) void LCD_en_write(void)
(0011) {
(0012)   EN_SET;
_LCD_en_write:
     5E0 9AC7      SBI	0x18,7
(0013)   delay_nus(4);
     5E1 E004      LDI	R16,4
     5E2 E010      LDI	R17,0
     5E3 940E 05AC CALL	_delay_nus
(0014)   EN_CLR;
     5E5 98C7      CBI	0x18,7
     5E6 9508      RET
_LCD_write_command:
  command              --> R20
     5E7 934A      ST	R20,-Y
     5E8 2F40      MOV	R20,R16
(0015) }
(0016) 
(0017) //==========================================
(0018) //函数名称:写指令
(0019) //函数作用:
(0020) //入口参数: 液晶指令command
(0021) //返回类型:无
(0022) //==========================================
(0023) void LCD_write_command(uchar command)
(0024) {
(0025)   delay_nus( 16 );
     5E9 E100      LDI	R16,0x10
     5EA E010      LDI	R17,0
     5EB 940E 05AC CALL	_delay_nus
(0026)   RS_CLR;
     5ED 98C6      CBI	0x18,6
(0027)   DB &= 0X0F;           //清高四位
     5EE B38B      IN	R24,0x1B
     5EF 708F      ANDI	R24,0xF
     5F0 BB8B      OUT	0x1B,R24
(0028)   DB |= command & 0xf0; //写高四位
     5F1 2F84      MOV	R24,R20
     5F2 7F80      ANDI	R24,0xF0
     5F3 B22B      IN	R2,0x1B
     5F4 2A28      OR	R2,R24
     5F5 BA2B      OUT	0x1B,R2
(0029)   LCD_en_write();
     5F6 DFE9      RCALL	_LCD_en_write
(0030)   command=command << 4;   //低四位移到高四位
     5F7 2F84      MOV	R24,R20
     5F8 708F      ANDI	R24,0xF
     5F9 9582      SWAP	R24
     5FA 2F48      MOV	R20,R24
(0031)   DB &= 0x0f;             //清高四位
     5FB B38B      IN	R24,0x1B
     5FC 708F      ANDI	R24,0xF
     5FD BB8B      OUT	0x1B,R24
(0032)   DB |= command & 0xf0;   //写低四位
     5FE 2F84      MOV	R24,R20
     5FF 7F80      ANDI	R24,0xF0
     600 B22B      IN	R2,0x1B
     601 2A28      OR	R2,R24
     602 BA2B      OUT	0x1B,R2
(0033)   LCD_en_write();
     603 DFDC      RCALL	_LCD_en_write
     604 9149      LD	R20,Y+
     605 9508      RET
_LCD_write_data:
  DATA                 --> R20
     606 934A      ST	R20,-Y
     607 2F40      MOV	R20,R16
(0034)   //delay_nms(2);         //清屏指令时间很长, 保险起见,可以增加
(0035) }
(0036) 
(0037) //==========================================
(0038) //函数名称:写数据
(0039) //函数作用:
(0040) //入口参数: 数据DATA
(0041) //返回类型:无
(0042) //==========================================
(0043) void LCD_write_data(uchar DATA)
(0044) {
(0045)   delay_nus(16);
     608 E100      LDI	R16,0x10
     609 E010      LDI	R17,0
     60A 940E 05AC CALL	_delay_nus
(0046)   RS_SET;           //RS=1
     60C 9AC6      SBI	0x18,6
(0047)   DB &= 0X0f;       //清高四位
     60D B38B      IN	R24,0x1B
     60E 708F      ANDI	R24,0xF
     60F BB8B      OUT	0x1B,R24
(0048)   DB |= DATA&0xf0;  //写高四位
     610 2F84      MOV	R24,R20
     611 7F80      ANDI	R24,0xF0
     612 B22B      IN	R2,0x1B
     613 2A28      OR	R2,R24
     614 BA2B      OUT	0x1B,R2
(0049)   LCD_en_write();
     615 DFCA      RCALL	_LCD_en_write
(0050)   DATA = DATA << 4; //低四位移到高四位
     616 2F84      MOV	R24,R20
     617 708F      ANDI	R24,0xF
     618 9582      SWAP	R24
     619 2F48      MOV	R20,R24
(0051)   DB &= 0X0f;       //清高四位
     61A B38B      IN	R24,0x1B
     61B 708F      ANDI	R24,0xF
     61C BB8B      OUT	0x1B,R24
(0052)   DB |= DATA&0xf0;  //写低四位
     61D 2F84      MOV	R24,R20
     61E 7F80      ANDI	R24,0xF0
     61F B22B      IN	R2,0x1B
     620 2A28      OR	R2,R24
     621 BA2B      OUT	0x1B,R2
(0053)   LCD_en_write();
     622 DFBD      RCALL	_LCD_en_write
     623 9149      LD	R20,Y+
     624 9508      RET
(0054) }
(0055) 
(0056) //==========================================
(0057) //函数名称:液晶初始化函数
(0058) //函数作用:
(0059) //入口参数: 无
(0060) //返回类型:无
(0061) //==========================================
(0062) void LCD_init( void )
(0063) {
(0064)   DB_DDR_OUT;
_LCD_init:
     625 B38A      IN	R24,0x1A
     626 6F80      ORI	R24,0xF0
     627 BB8A      OUT	0x1A,R24
     628 B387      IN	R24,0x17
     629 6C80      ORI	R24,0xC0
     62A BB87      OUT	0x17,R24
(0065)   LCD_write_command(0x28);
     62B E208      LDI	R16,0x28
     62C DFBA      RCALL	_LCD_write_command
(0066)   LCD_en_write();           //********总结这里一定要加这液晶使能*********
     62D DFB2      RCALL	_LCD_en_write
(0067)   delay_nus(20);
     62E E104      LDI	R16,0x14
     62F E010      LDI	R17,0
     630 940E 05AC CALL	_delay_nus
(0068)   LCD_write_command(0x28);  //4位显示
     632 E208      LDI	R16,0x28
     633 DFB3      RCALL	_LCD_write_command
(0069)   LCD_write_command(0x0c);  //显示开
     634 E00C      LDI	R16,0xC
     635 DFB1      RCALL	_LCD_write_command
(0070)   LCD_write_command(0x01);  //清屏
     636 E001      LDI	R16,1
     637 DFAF      RCALL	_LCD_write_command
(0071)   delay_nms(5);             //延时一定要长
     638 E005      LDI	R16,5
     639 E010      LDI	R17,0
     63A 940E 05C4 CALL	_delay_nms
     63C 9508      RET
_LCD_set_rc:
  address              --> R20
  c                    --> R22
  r                    --> R10
     63D 940E 0914 CALL	push_xgsetF00C
     63F 2F62      MOV	R22,R18
     640 2EA0      MOV	R10,R16
(0072) }
(0073) 
(0074) //==========================================
(0075) //函数名称:写地址
(0076) //函数作用:
(0077) //入口参数: 行位置r, 列位置c
(0078) //返回类型:无
(0079) //==========================================
(0080) void LCD_set_rc( uchar r, uchar c )
(0081) {
(0082)     uchar address;
(0083) 
(0084)     if (r == 1)
     641 2D8A      MOV	R24,R10
     642 3081      CPI	R24,1
     643 F419      BNE	0x0647
(0085)     address = 0x80 + c;
     644 2F46      MOV	R20,R22
     645 5840      SUBI	R20,0x80
     646 C005      RJMP	0x064C
(0086)     else if(r == 2)
     647 2D8A      MOV	R24,R10
     648 3082      CPI	R24,2
     649 F411      BNE	0x064C
(0087)     address = 0xc0 + c;
     64A 2F46      MOV	R20,R22
     64B 5440      SUBI	R20,0x40
(0088) 
(0089)     LCD_write_command( address );
     64C 2F04      MOV	R16,R20
     64D DF99      RCALL	_LCD_write_command
     64E 940C 091B JMP	pop_xgsetF00C
_LCD_write_string:
  s                    --> R20
  c                    --> R12
  r                    --> R10
     650 940E 0922 CALL	push_xgset303C
     652 2EC2      MOV	R12,R18
     653 2EA0      MOV	R10,R16
     654 814E      LDD	R20,Y+6
     655 815F      LDD	R21,Y+7
(0090) }
(0091) 
(0092) //==========================================
(0093) //函数名称:写字符串
(0094) //函数作用: 在指定位置写一串字符串
(0095) //入口参数: 行位置r, 列位置c, 字符串*s
(0096) //返回类型:无
(0097) //==========================================
(0098) void LCD_write_string(uchar r, uchar c, uchar *s)
(0099) {
(0100)     LCD_set_rc( r, c ); //写地址
     656 2D2C      MOV	R18,R12
     657 2D0A      MOV	R16,R10
     658 DFE4      RCALL	_LCD_set_rc
     659 C005      RJMP	0x065F
(0101) 
(0102)     while( *s )     	 	// 写显示字符
(0103)     {
(0104)       LCD_write_data( *s );
     65A 01FA      MOVW	R30,R20
     65B 8100      LDD	R16,Z+0
     65C DFA9      RCALL	_LCD_write_data
(0105)       s++;
     65D 5F4F      SUBI	R20,0xFF
     65E 4F5F      SBCI	R21,0xFF
     65F 01FA      MOVW	R30,R20
     660 8020      LDD	R2,Z+0
     661 2022      TST	R2
     662 F7B9      BNE	0x065A
     663 940C 0929 JMP	pop_xgset303C
_LCD_write_char:
  DATA                 --> Y,+2
  c                    --> R12
  r                    --> R10
     665 92AA      ST	R10,-Y
     666 92CA      ST	R12,-Y
     667 2EC2      MOV	R12,R18
     668 2EA0      MOV	R10,R16
(0106)     }
(0107) }
(0108) 
(0109) void LCD_write_char(uchar r, uchar c, uchar DATA)				   //写字符
(0110) {
(0111)  	 LCD_set_rc( r, c );
     669 2D2C      MOV	R18,R12
     66A 2D0A      MOV	R16,R10
     66B DFD1      RCALL	_LCD_set_rc
(0112) 	 LCD_write_data( DATA );
     66C 810A      LDD	R16,Y+2
     66D DF98      RCALL	_LCD_write_data
     66E 90C9      LD	R12,Y+
     66F 90A9      LD	R10,Y+
     670 9508      RET
_LCD_write_array:
  i                    --> R10
  array                --> R12
  c                    --> R22
  r                    --> R20
     671 940E 0930 CALL	push_xgsetF03C
     673 2F62      MOV	R22,R18
     674 2F40      MOV	R20,R16
     675 9721      SBIW	R28,1
     676 84C9      LDD	R12,Y+9
     677 84DA      LDD	R13,Y+10
(0113) }
(0114) 
(0115) //==========================================
(0116) //函数名称:写字符数组
(0117) //函数作用: 在指定位置写一串字符串
(0118) //入口参数: 行位置r, 列位置c, 字符数组chardata[], 字符个数
(0119) //返回类型:无
(0120) //==========================================
(0121) void LCD_write_array( uchar r, uchar c, uchar array[] )
(0122) {
(0123)  	uchar i = 0;
     678 24AA      CLR	R10
     679 C02A      RJMP	0x06A4
(0124)     while( array[i] != '\0' )
(0125) 	{
(0126) 	 	 LCD_write_char( r, c, array[i] );
     67A 2DEA      MOV	R30,R10
     67B 27FF      CLR	R31
     67C 0DEC      ADD	R30,R12
     67D 1DFD      ADC	R31,R13
     67E 8020      LDD	R2,Z+0
     67F 8228      STD	Y+0,R2
     680 2F26      MOV	R18,R22
     681 2F04      MOV	R16,R20
     682 DFE2      RCALL	_LCD_write_char
(0127) 	     if( ++c == 16 )
     683 2F86      MOV	R24,R22
     684 5F8F      SUBI	R24,0xFF
     685 2F68      MOV	R22,R24
     686 3160      CPI	R22,0x10
     687 F4D9      BNE	0x06A3
(0128) 		 {
(0129) 		     if( r == 1 )
     688 3041      CPI	R20,1
     689 F461      BNE	0x0696
(0130) 			 {   
(0131) 			     c = 0;
     68A 2766      CLR	R22
(0132) 				 r = 2;
     68B E042      LDI	R20,2
(0133) 		  	  	 LCD_write_char( r, c, array[i] );
     68C 2DEA      MOV	R30,R10
     68D 27FF      CLR	R31
     68E 0DEC      ADD	R30,R12
     68F 1DFD      ADC	R31,R13
     690 8020      LDD	R2,Z+0
     691 8228      STD	Y+0,R2
     692 2F26      MOV	R18,R22
     693 2F04      MOV	R16,R20
     694 DFD0      RCALL	_LCD_write_char
(0134) 			

⌨️ 快捷键说明

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