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

📄 car.lst

📁 本次设计的自动往返电动小汽车
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0152) //
(0153) void shifth(void)			   				  //控制高速
(0154) {
(0155)     OCR1BH = 0xFF; 	   					 
_shifth:
    02CD EF8F      LDI	R24,0xFF
    02CE BD89      OUT	0x29,R24
(0156)  	OCR1BL = 0xFF;
    02CF BD88      OUT	0x28,R24
(0157) }
    02D0 9508      RET
(0158) //////////////////////////////
(0159) //
(0160) void stop(void)								  //制动
(0161) {
(0162)     OCR1BH = 0x00; 	   					 
_stop:
    02D1 2422      CLR	R2
    02D2 BC29      OUT	0x29,R2
(0163)  	OCR1BL = 0x00;
    02D3 BC28      OUT	0x28,R2
(0164) }
    02D4 9508      RET
(0165) //////////////////////////////
(0166) //
(0167) void shiftl(void)							  //控制低速
(0168) {
(0169)     OCR1BH = 0x01; 	   					 
_shiftl:
    02D5 E081      LDI	R24,1
    02D6 BD89      OUT	0x29,R24
(0170)  	OCR1BL = 0xFF;
    02D7 EF8F      LDI	R24,0xFF
    02D8 BD88      OUT	0x28,R24
(0171) }
    02D9 9508      RET
FILE: C:\DOCUME~1\Administrator\桌面\自动往返小汽车\源程序\自动往返小车lcd版\1602B_LCD.c
(0001) /**********************************************************
(0002) /* TC1602B LCD DISPLAY
(0003) /* LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
(0004)                    入命令
(0005) /* LCD第一行显示寄存器地址:0X80-0X8F
(0006) /* LCD第二行显示寄存器地址:0XC0-0XCF
(0007) /* 光标命令:
(0008) /* LCD_write_char(0x0e,0);    //光标开
(0009) /* LCD_write_char(0x0d,0);    //光标所在字符闪烁  
(0010) /* LCD_write_char(0x0c,0);    //光标关  
(0011) **********************************************************/
(0012) #include <io8515v.h>
(0013) #include <macros.h>
(0014) #include "1602LCD.h"
(0015) 
(0016) void LCD_init(void) 
(0017) { 
(0018)   LCD_CTRL_DDR|=LCD_RS | LCD_EN | LCD_RW;
_LCD_init:
    02DA B387      IN	R24,0x17
    02DB 608E      ORI	R24,0xE
    02DC BB87      OUT	0x17,R24
(0019)   LCD_DATA_DDR|=LCD_DATA;
    02DD B387      IN	R24,0x17
    02DE 6F80      ORI	R24,0xF0
    02DF BB87      OUT	0x17,R24
(0020)   delay_nms(100); 
    02E0 E604      LDI	R16,0x64
    02E1 E010      LDI	R17,0
    02E2 D107      RCALL	_delay_nms
(0021)   LCD_write_char(0x28,0); 					    //功能设置  
    02E3 2722      CLR	R18
    02E4 2733      CLR	R19
    02E5 E208      LDI	R16,0x28
    02E6 E010      LDI	R17,0
    02E7 D03A      RCALL	_LCD_write_char
(0022)   LCD_write_char(0x28,0); 					    //功能设置  
    02E8 2722      CLR	R18
    02E9 2733      CLR	R19
    02EA E208      LDI	R16,0x28
    02EB E010      LDI	R17,0
    02EC D035      RCALL	_LCD_write_char
(0023)   LCD_write_char(0x28,0); 					    //功能设置    
    02ED 2722      CLR	R18
    02EE 2733      CLR	R19
    02EF E208      LDI	R16,0x28
    02F0 E010      LDI	R17,0
    02F1 D030      RCALL	_LCD_write_char
(0024)   LCD_write_char(0x28,0); 					    //功能设置  
    02F2 2722      CLR	R18
    02F3 2733      CLR	R19
    02F4 E208      LDI	R16,0x28
    02F5 E010      LDI	R17,0
    02F6 D02B      RCALL	_LCD_write_char
(0025)   LCD_write_char(0x28,0); 					    //功能设置  
    02F7 2722      CLR	R18
    02F8 2733      CLR	R19
    02F9 E208      LDI	R16,0x28
    02FA E010      LDI	R17,0
    02FB D026      RCALL	_LCD_write_char
(0026)   LCD_write_char(0x28,0); 					    //功能设置  
    02FC 2722      CLR	R18
    02FD 2733      CLR	R19
    02FE E208      LDI	R16,0x28
    02FF E010      LDI	R17,0
    0300 D021      RCALL	_LCD_write_char
(0027)   delay_nus(100); 
    0301 E604      LDI	R16,0x64
    0302 E010      LDI	R17,0
    0303 D0CE      RCALL	_delay_nus
(0028)   LCD_write_char(0x06,0);      					//显示光标移动设置
    0304 2722      CLR	R18
    0305 2733      CLR	R19
    0306 E006      LDI	R16,6
    0307 E010      LDI	R17,0
    0308 D019      RCALL	_LCD_write_char
(0029)   delay_nus(100);
    0309 E604      LDI	R16,0x64
    030A E010      LDI	R17,0
    030B D0C6      RCALL	_delay_nus
(0030)   LCD_write_char(0x01,0);      					//显示清屏
    030C 2722      CLR	R18
    030D 2733      CLR	R19
    030E E001      LDI	R16,1
    030F E010      LDI	R17,0
    0310 D011      RCALL	_LCD_write_char
(0031)   delay_nms(2);
    0311 E002      LDI	R16,2
    0312 E010      LDI	R17,0
    0313 D0D6      RCALL	_delay_nms
(0032)   LCD_write_char(0x0C,0); 						//显示开 
    0314 2722      CLR	R18
    0315 2733      CLR	R19
    0316 E00C      LDI	R16,0xC
    0317 E010      LDI	R17,0
    0318 D009      RCALL	_LCD_write_char
(0033)   delay_nus(100);
    0319 E604      LDI	R16,0x64
    031A E010      LDI	R17,0
(0034) }
    031B C0B6      RJMP	_delay_nus
(0035)  
(0036) void LCD_en_write(void)        //EN端产生一个高电平脉冲,写LCD
(0037)   {
(0038)     LCD_EN_PORT |= LCD_EN;
_LCD_en_write:
    031C 9AC3      SBI	0x18,3
(0039)     delay_nus(5);
    031D E005      LDI	R16,5
    031E E010      LDI	R17,0
    031F D0B2      RCALL	_delay_nus
(0040)     LCD_EN_PORT &= ~LCD_EN;
    0320 98C3      CBI	0x18,3
(0041)   }
    0321 9508      RET
_LCD_write_char:
  data_temp            --> R22
  command_temp         --> R20
  data                 --> R12
  command              --> R10
    0322 D0FD      RCALL	push_gset4
    0323 2EC2      MOV	R12,R18
    0324 2ED3      MOV	R13,R19
    0325 2EA0      MOV	R10,R16
    0326 2EB1      MOV	R11,R17
(0042) 
(0043) /****************************************************************
(0044) /* LCD_write_char    : 英文字符串显示函数
(0045) /* 输入参数:*s      :英文字符串指针?
(0046)              X、Y    : 显示字符串的位置,X:0-15,Y:0-1
(0047)                      LCD第一行显示寄存器地址:0X80-0X8F
(0048)                      LCD第一行显示寄存器地址:0XC0-0XCF 		
(0049) *****************************************************************/
(0050) void LCD_write_char(unsigned command,unsigned data)
(0051)   {
(0052)     unsigned command_temp,data_temp;        
(0053)     
(0054) 	command_temp = command;
    0327 2D4A      MOV	R20,R10
    0328 2D5B      MOV	R21,R11
(0055)     data_temp = data;
    0329 2D6C      MOV	R22,R12
    032A 2D7D      MOV	R23,R13
(0056)     LCD_wait_Ready();
    032B D052      RCALL	_LCD_wait_Ready
(0057)     LCD_RW_PORT &= ~LCD_RW;             //RW=0
    032C 98C2      CBI	0x18,2
(0058)     if (command == 0)
    032D 3040      CPI	R20,0
    032E 0745      CPC	R20,R21
    032F F471      BNE	0x033E
(0059)       {
(0060)    	 LCD_RS_PORT |= LCD_RS;             //RS=1 
    0330 9AC1      SBI	0x18,1
(0061)    	 LCD_DATA_PORT &= 0X0F;
    0331 B388      IN	R24,0x18
    0332 708F      ANDI	R24,0xF
    0333 BB88      OUT	0x18,R24
(0062) 	 LCD_DATA_PORT |= data_temp&0xf0;   //send high 4bit
    0334 2F86      MOV	R24,R22
    0335 2F97      MOV	R25,R23
    0336 7F80      ANDI	R24,0xF0
    0337 7090      ANDI	R25,0
    0338 B228      IN	R2,0x18
    0339 2433      CLR	R3
    033A 2A28      OR	R2,R24
    033B 2A39      OR	R3,R25
    033C BA28      OUT	0x18,R2
(0063)       }
    033D C00D      RJMP	0x034B
(0064)     else 
(0065)       {
(0066) 	 LCD_RS_PORT &= ~LCD_RS;            //RS=0
    033E 98C1      CBI	0x18,1
(0067) 	 LCD_DATA_PORT &= 0X0F;
    033F B388      IN	R24,0x18
    0340 708F      ANDI	R24,0xF
    0341 BB88      OUT	0x18,R24
(0068)      LCD_DATA_PORT |= command_temp&0xf0;//send high 4bit
    0342 2F84      MOV	R24,R20
    0343 2F95      MOV	R25,R21
    0344 7F80      ANDI	R24,0xF0
    0345 7090      ANDI	R25,0
    0346 B228      IN	R2,0x18
    0347 2433      CLR	R3
    0348 2A28      OR	R2,R24
    0349 2A39      OR	R3,R25
    034A BA28      OUT	0x18,R2
(0069)       }
(0070)     LCD_en_write();
    034B DFD0      RCALL	_LCD_en_write
(0071)     command_temp=command_temp << 4;     //send low 4bit
    034C 0F44      LSL	R20
    034D 1F55      ROL	R21
    034E 0F44      LSL	R20
    034F 1F55      ROL	R21
    0350 0F44      LSL	R20
    0351 1F55      ROL	R21
    0352 0F44      LSL	R20
    0353 1F55      ROL	R21
(0072)     data_temp=data_temp       << 4;
    0354 0F66      LSL	R22
    0355 1F77      ROL	R23
    0356 0F66      LSL	R22
    0357 1F77      ROL	R23
    0358 0F66      LSL	R22
    0359 1F77      ROL	R23
    035A 0F66      LSL	R22
    035B 1F77      ROL	R23
(0073)     LCD_DATA_PORT &= 0X0F;
    035C B388      IN	R24,0x18
    035D 708F      ANDI	R24,0xF
    035E BB88      OUT	0x18,R24
(0074)     if (command==0)
    035F 20AA      TST	R10
    0360 F461      BNE	0x036D
    0361 20BB      TST	R11
    0362 F451      BNE	0x036D
(0075)       LCD_DATA_PORT |= data_temp&0xf0;
    0363 2F86      MOV	R24,R22
    0364 2F97      MOV	R25,R23
    0365 7F80      ANDI	R24,0xF0
    0366 7090      ANDI	R25,0
    0367 B228      IN	R2,0x18
    0368 2433      CLR	R3
    0369 2A28      OR	R2,R24
    036A 2A39      OR	R3,R25
    036B BA28      OUT	0x18,R2
    036C C009      RJMP	0x0376
(0076)     else
(0077)       LCD_DATA_PORT |= command_temp&0xf0;
    036D 2F84      MOV	R24,R20
    036E 2F95      MOV	R25,R21
    036F 7F80      ANDI	R24,0xF0
    0370 7090      ANDI	R25,0
    0371 B228      IN	R2,0x18
    0372 2433      CLR	R3
    0373 2A28      OR	R2,R24
    0374 2A39      OR	R3,R25
    0375 BA28      OUT	0x18,R2
(0078)     LCD_en_write();
    0376 DFA5      RCALL	_LCD_en_write
(0079)     LCD_RW_PORT |= LCD_RW;
    0377 9AC2      SBI	0x18,2
(0080)     LCD_RS_PORT ^= LCD_RS;    
    0378 E082      LDI	R24,2
    0379 B228      IN	R2,0x18
    037A 2628      EOR	R2,R24
    037B BA28      OUT	0x18,R2
(0081)   }
    037C D084      RCALL	pop_gset4
    037D 9508      RET
(0082) 
(0083) void LCD_wait_Ready(void)                  //等待LCD空闲
(0084)   {
(0085)     LCD_DATA_DDR &= ~0x80;                 //PB7 I/O口方向设置为输入
_LCD_wait_Ready:
    037E 98BF      CBI	0x17,7
(0086)     LCD_RW_PORT |= LCD_RW;                 //RW=1
    037F 9AC2      SBI	0x18,2
(0087)     LCD_RS_PORT &= ~LCD_RS;                //RS=0
    0380 98C1      CBI	0x18,1
(0088)     LCD_EN_PORT |= LCD_EN;                 //EN=1
    0381 9AC3      SBI	0x18,3
(0089)     while (!( LCD_DATA_PIN&0x80 ) == 0);   //RW=1,读PD7,为0表示空闲;
    0382 99B7      SBIC	0x16,7
    0383 C003      RJMP	0x0387
    0384 E001      LDI	R16,1
    0385 E010      LDI	R17,0
    0386 C002      RJMP	0x0389
    0387 2700      CLR	R16
    0388 2711      CLR	R17
    0389 3000      CPI	R16,0
    038A 0701      CPC	R16,R17
    038B F3B1      BEQ	0x0382
(0090)     LCD_EN_PORT &= ~LCD_EN;                //EN=0
    038C 98C3      CBI	0x18,3
(0091)     LCD_DATA_DDR |= 0xf0;
    038D B387      IN	R24,0x17
    038E 6F80      ORI	R24,0xF0
    038F BB87      OUT	0x17,R24
(0092)   }
    0390 9508      RET
_LCD_set_xy:
  address              --> R20
  y                    --> R20
  x                    --> R22
    0391 D088      RCALL	push_gset2
    0392 2F42      MOV	R20,R18
    0393 2F60      MOV	R22,R16
(0093) 
(0094) /**********************************************************
(0095) /* LCD_set_xy        : 设置LCD显示的起始位置
(0096) /* 输入参数:x、y    : 显示字符串的位置,X:0-15,Y:0-1
(0097)                      LCD第一行显示寄存器地址:0X80-0X8F
(0098)                      LCD第一行显示寄存器地址:0XC0-0XCF
(0099) ***********************************************************/
(0100) void LCD_set_xy( unsigned char x, unsigned char y )
(0101)   {
(0102)     unsigned char address;
(0103)     if (y == 0) address = 0x80 + x;
    0394 2344      TST	R20
    0395 F419      BNE	0x0399
    0396 2F46      MOV	R20,R22
    0397 5840      SUBI	R20,0x80
    0398 C002      RJMP	0x039B
(0104)     else 
(0105)        address = 0xC0 + x;
    0399 2F46      MOV	R20,R22
    039A 5440      SUBI	R20,0x40
(0106)     LCD_write_char( address, 0 );
    039B 2722      CLR	R18
    039C 2733      CLR	R19
    039D 2F04      MOV	R16,R20
    039E 2711      CLR	R17
    039F DF82      RCALL	_LCD_write_char
(0107)   }
    03A0 D05C      RCALL	pop_gset2
    03A1 9508      RET
_LCD_write_string:
  s                    --> R20
  Y                    --> R10
  X                    --> R22
    03A2 D07A      RCALL	push_gset3
    03A3 2EA2      MOV	R10,R18
    03A4 2F60      MOV	R22,R16
    03A5 814E      LDD	R20,Y+6
    03A6 815F      LDD	R21,Y+7
(0108) /**********************************************************
(0109) /* LCD_write_string  : 英文字符串显示函数
(0110) /* 输入参数:*s      :英文字符串指针;
(0111) /*           X、Y    : 显示字符串的位置
(0112) ***********************************************************/
(0113) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0114)   {
(0115)     LCD_set_xy( X, Y );
    03A7 2D2A      MOV	R18,R10
    03A8 2F06      MOV	R16,R22
    03A9 DFE7      RCALL	_LCD_set_xy
    03AA C009      RJMP	0x03B4
(0116)     while (*s) 
(0117)       {
(0118)         LCD_write_char( 0, *s );
    03AB 2FE4      MOV	R30,R20
    03AC 2FF5      MOV	R31,R21
    03AD 8120      LDD	R18,Z+0
    03AE 2733      CLR	R19
    03AF 2700      CLR	R16
    03B0 2711      CLR	R17
    03B1 DF70      RCALL	_LCD_write_char
(0119) 	    s ++;
    03B2 5F4F      SUBI	R20,0xFF
    03B3 4F5F      SBCI	R21,0xFF
    03B4 2FE4      MOV	R30,R20
    03B5 2FF5      MOV	R31,R21
    03B6 8020      LDD	R2,Z+0
    03B7 2022      TST	R2
    03B8 F791      BNE	0x03AB
(0120)       }
(0121)   }
    03B9 D045      RCALL	pop_gset3
    03BA 9508      RET
_LCD_write:
  data                 --> Y+4
  Y                    --> R22
  X                    --> R20
    03BB D05E      RCALL	push_gset2

⌨️ 快捷键说明

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