model.lst

来自「移动机器人(小车)的物理坐标和逻辑坐标的转换源码」· LST 代码 · 共 1,693 行 · 第 1/5 页

LST
1,693
字号
(0280)         LCD_SEND_HALF_CHAR_LOW(Command);	
     2C4 B18B      IN	R24,0x0B
     2C5 7887      ANDI	R24,0x87
     2C6 B98B      OUT	0x0B,R24
     2C7 2F80      MOV	R24,R16
     2C8 708F      ANDI	R24,0xF
     2C9 0F88      LSL	R24
     2CA 0F88      LSL	R24
     2CB 0F88      LSL	R24
     2CC B02B      IN	R2,0x0B
     2CD 2A28      OR	R2,R24
     2CE B82B      OUT	0x0B,R2
(0281) 		LCD_E = HIGH;
     2CF B18B      IN	R24,0x0B
     2D0 6880      ORI	R24,0x80
     2D1 B98B      OUT	0x0B,R24
(0282) 		LCD_E = LOW;
     2D2 B18B      IN	R24,0x0B
     2D3 778F      ANDI	R24,0x7F
     2D4 B98B      OUT	0x0B,R24
(0283) 	}
(0284)     #else
(0285)         LCD_DATA_PORT = Command;
(0286)         LCD_E = HIGH;
(0287)         LCD_E = LOW;
(0288)     #endif
(0289)     SetRead;		
     2D5 B18A      IN	R24,0x0A
     2D6 7887      ANDI	R24,0x87
     2D7 B98A      OUT	0x0A,R24
     2D8 B18B      IN	R24,0x0B
     2D9 6788      ORI	R24,0x78
     2DA B98B      OUT	0x0B,R24
     2DB 0000      NOP
     2DC B185      IN	R24,0x05
     2DD 6081      ORI	R24,1
     2DE B985      OUT	0x05,R24
(0290) 	SetCommand;
     2DF B185      IN	R24,0x05
     2E0 7F8D      ANDI	R24,0xFD
     2E1 B985      OUT	0x05,R24
     2E2 9508      RET
(0291) }
(0292) 
(0293) /***********************************************************
(0294) *   函数说明:向LCD发送数据函数                            *
(0295) *   输入:    需要发送的数据                               *
(0296) *   输出:    无                                           *
(0297) *   调用函数:LCD_SEND_HALF_CHAR_HIGH() LCD_SEND_HALF_CHAR_LOW() *
(0298) ***********************************************************/
(0299) void LCDSendData(UINT8 Data)
(0300) {
(0301)     SetWrite;
_LCDSendData:
  Data                 --> R16
     2E3 B18A      IN	R24,0x0A
     2E4 6788      ORI	R24,0x78
     2E5 B98A      OUT	0x0A,R24
     2E6 B18B      IN	R24,0x0B
     2E7 6788      ORI	R24,0x78
     2E8 B98B      OUT	0x0B,R24
     2E9 0000      NOP
     2EA B185      IN	R24,0x05
     2EB 7F8E      ANDI	R24,0xFE
     2EC B985      OUT	0x05,R24
(0302) 	SetData;
     2ED B185      IN	R24,0x05
     2EE 6082      ORI	R24,2
     2EF B985      OUT	0x05,R24
(0303)     #ifndef _LCD1602_FULL_DATA_MODEL
(0304) 	{
(0305) 		LCD_SEND_HALF_CHAR_HIGH(Data);
     2F0 B18B      IN	R24,0x0B
     2F1 7887      ANDI	R24,0x87
     2F2 B98B      OUT	0x0B,R24
     2F3 2F80      MOV	R24,R16
     2F4 7F80      ANDI	R24,0xF0
     2F5 9586      LSR	R24
     2F6 B02B      IN	R2,0x0B
     2F7 2A28      OR	R2,R24
     2F8 B82B      OUT	0x0B,R2
(0306) 		LCD_E = HIGH;
     2F9 B18B      IN	R24,0x0B
     2FA 6880      ORI	R24,0x80
     2FB B98B      OUT	0x0B,R24
(0307) 	    LCD_E = LOW;
     2FC B18B      IN	R24,0x0B
     2FD 778F      ANDI	R24,0x7F
     2FE B98B      OUT	0x0B,R24
(0308) 	}
(0309) 
(0310) 	{
(0311)         LCD_SEND_HALF_CHAR_LOW(Data);	
     2FF B18B      IN	R24,0x0B
     300 7887      ANDI	R24,0x87
     301 B98B      OUT	0x0B,R24
     302 2F80      MOV	R24,R16
     303 708F      ANDI	R24,0xF
     304 0F88      LSL	R24
     305 0F88      LSL	R24
     306 0F88      LSL	R24
     307 B02B      IN	R2,0x0B
     308 2A28      OR	R2,R24
     309 B82B      OUT	0x0B,R2
(0312) 		LCD_E = HIGH;
     30A B18B      IN	R24,0x0B
     30B 6880      ORI	R24,0x80
     30C B98B      OUT	0x0B,R24
(0313) 		LCD_E = LOW;
     30D B18B      IN	R24,0x0B
     30E 778F      ANDI	R24,0x7F
     30F B98B      OUT	0x0B,R24
(0314) 	}
(0315)     #else
(0316)         LCD_DATA_PORT = Data;
(0317)         LCD_E = HIGH;
(0318)         LCD_E = LOW;
(0319)     #endif
(0320)     SetRead;		
     310 B18A      IN	R24,0x0A
     311 7887      ANDI	R24,0x87
     312 B98A      OUT	0x0A,R24
     313 B18B      IN	R24,0x0B
     314 6788      ORI	R24,0x78
     315 B98B      OUT	0x0B,R24
     316 0000      NOP
     317 B185      IN	R24,0x05
     318 6081      ORI	R24,1
     319 B985      OUT	0x05,R24
(0321) 	SetCommand;
     31A B185      IN	R24,0x05
     31B 7F8D      ANDI	R24,0xFD
     31C B985      OUT	0x05,R24
     31D 9508      RET
(0322) }
(0323) 
(0324) /***********************************************************
(0325) *   函数说明:等待LCD空闲状态函数                          *
(0326) *   输入:    无                                           *
(0327) *   输出:    无                                           *
(0328) *   调用函数:LCDDelayUs()                                 *
(0329) ***********************************************************/
(0330) void LCDWaitForReady(void)
(0331) {
(0332) #ifdef _USE_LCD_ONLY_WRITE
(0333) 	LCDDelayUs(500);
(0334) #else
(0335) 	
(0336) 	SetRead;
_LCDWaitForReady:
     31E B18A      IN	R24,0x0A
     31F 7887      ANDI	R24,0x87
     320 B98A      OUT	0x0A,R24
     321 B18B      IN	R24,0x0B
     322 6788      ORI	R24,0x78
     323 B98B      OUT	0x0B,R24
     324 0000      NOP
     325 B185      IN	R24,0x05
     326 6081      ORI	R24,1
     327 B985      OUT	0x05,R24
(0337) 	SetCommand;
     328 B185      IN	R24,0x05
     329 7F8D      ANDI	R24,0xFD
     32A B985      OUT	0x05,R24
(0338)    
(0339)     LCD_E = HIGH;
     32B B18B      IN	R24,0x0B
     32C 6880      ORI	R24,0x80
     32D B98B      OUT	0x0B,R24
(0340) 	while (LCD_BF == 1);   //RW=1,读PD7,为0表示空闲;
     32E B189      IN	R24,0x09
     32F 9586      LSR	R24
     330 9586      LSR	R24
     331 9586      LSR	R24
     332 9586      LSR	R24
     333 9586      LSR	R24
     334 9586      LSR	R24
     335 7081      ANDI	R24,1
     336 3081      CPI	R24,1
     337 F3B1      BEQ	0x032E
(0341)     LCD_E = LOW;
     338 B18B      IN	R24,0x0B
     339 778F      ANDI	R24,0x7F
     33A B98B      OUT	0x0B,R24
     33B 9508      RET
_LCDSetXY:
  Address0             --> R20
  Y                    --> R10
  X                    --> R22
     33C D57C      RCALL	push_xgsetF00C
     33D 2EA2      MOV	R10,R18
     33E 2F60      MOV	R22,R16
(0342) 	
(0343) #endif
(0344) }
(0345) #else
(0346) 
(0347) /***********************************************************
(0348) *   函数说明:向LCD发送指令函数                            *
(0349) *   输入:    需要发送的指令                               *
(0350) *   输出:    无                                           *
(0351) *   调用函数:LCD_SEND_HALF_CHAR_HIGH()                    *
(0352) *             LCD_SEND_HALF_CHAR_LOW()                     *
(0353) ***********************************************************/
(0354) void LCDSendCommand(UINT8 Command)
(0355) {
(0356) 	SetCommand;
(0357) 	{
(0358) 	    SetEnable;
(0359) 		
(0360) 		LCD_SEND_HALF_CHAR_HIGH(Command);
(0361) 		
(0362) 	    SetDisable;
(0363) 	}
(0364) 	{
(0365) 	    SetEnable;
(0366) 		
(0367)         LCD_SEND_HALF_CHAR_LOW(Command);	
(0368) 		
(0369) 		SetDisable;
(0370) 	}
(0371) 	SetCommand;
(0372) }
(0373) 
(0374) /***********************************************************
(0375) *   函数说明:向LCD发送数据函数                            *
(0376) *   输入:    需要发送的数据                               *
(0377) *   输出:    无                                           *
(0378) *   调用函数:LCD_SEND_HALF_CHAR_HIGH()                    *
(0379) *             LCD_SEND_HALF_CHAR_LOW()                     *
(0380) ***********************************************************/
(0381) void LCDSendData(UINT8 Data)
(0382) {
(0383) 	SetData;
(0384) 	{
(0385) 	    SetEnable;
(0386) 		
(0387) 		LCD_SEND_HALF_CHAR_HIGH(Data);
(0388) 		
(0389) 	    SetDisable;
(0390) 	}
(0391) 
(0392) 	{
(0393) 	    SetEnable;
(0394) 		
(0395)         LCD_SEND_HALF_CHAR_LOW(Data);	
(0396) 		
(0397) 		SetDisable;
(0398) 	}
(0399) 	SetCommand;
(0400) }
(0401) 
(0402) /***********************************************************
(0403) *   函数说明:等待LCD空闲状态函数                          *
(0404) *   输入:    无                                           *
(0405) *   输出:    无                                           *
(0406) *   调用函数:LCDDelayUs()                                 *
(0407) ***********************************************************/
(0408) void LCDWaitForReady(void)
(0409) {
(0410) 	LCDDelayUs(30);
(0411) }
(0412) 
(0413) #endif
(0414) 
(0415) 
(0416) /***********************************************************
(0417) *   函数说明:设置显示坐标函数                             *
(0418) *   输入:    x,y坐标值                                    *
(0419) *   输出:    无                                           *
(0420) *   调用函数:LCDWaitForReady()  LCDSendCommand()          *
(0421) ***********************************************************/
(0422) void LCDSetXY(UINT8 X,UINT8 Y)
(0423) {
(0424)     UINT8 Address;
(0425)     if (Y == 0)
     33F 20AA      TST	R10
     340 F419      BNE	0x0344
(0426) 	{
(0427) 	    Address = 0x80 + X;
     341 2F46      MOV	R20,R22
     342 5840      SUBI	R20,0x80
(0428) 	}
     343 C002      RJMP	0x0346
(0429)     else
(0430) 	{ 
(0431)         Address = 0xc0 + X;
     344 2F46      MOV	R20,R22
     345 5440      SUBI	R20,0x40
(0432) 	}
(0433) 	
(0434) 	LCDWaitForReady();
     346 DFD7      RCALL	_LCDWaitForReady
(0435)     LCDSendCommand(Address);
     347 2F04      MOV	R16,R20
     348 DF5F      RCALL	_LCDSendCommand
     349 C576      RJMP	pop_xgsetF00C
_LCDDisplayString:
  String               --> R20
     34A 934A      ST	R20,-Y
     34B 935A      ST	R21,-Y
     34C 01A8      MOVW	R20,R16
(0436) }
(0437) 
(0438) /***********************************************************
(0439) *   函数说明:LCD字符串显示函数                            *
(0440) *   输入:    要显示的字符串指针                           *
(0441) *   输出:    无                                           *
(0442) *   调用函数:LCDWaitForReady() LCDSendData()              *
(0443) ***********************************************************/
(0444) void LCDDisplayString(UINT8 *String)
(0445) {
     34D C006      RJMP	0x0354
(0446)     while(*String)
(0447) 	{
(0448) 	    LCDWaitForReady();
     34E DFCF      RCALL	_LCDWaitForReady
(0449) 	    LCDSendData(*String);
     34F 01FA      MOVW	R30,R20
     350 8100      LDD	R16,Z+0
     351 DF91      RCALL	_LCDSendData
(0450) 		String++;
     352 5F4F      SUBI	R20,0xFF
     353 4F5F      SBCI	R21,0xFF
     354 01FA      MOVW	R30,R20
     355 8020      LDD	R2,Z+0
     356 2022      TST	R2
     357 F7B1      BNE	0x034E
     358 9159      LD	R21,Y+
     359 9149      LD	R20,Y+
     35A 9508      RET
_LCDDisplayNum:
  a1                   --> R20
  BitCount             --> Y,+5
  Num                  --> Y,+1
     35B D4AD      RCALL	push_arg4
     35C 

⌨️ 快捷键说明

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