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

📄 rd_lcd1602b.s

📁 移动机器人(小车)的物理坐标和逻辑坐标的转换源码
💻 S
📖 第 1 页 / 共 3 页
字号:
; 	}
	.dbline 289
;     #else
;         LCD_DATA_PORT = Command;
;         LCD_E = HIGH;
;         LCD_E = LOW;
;     #endif
;     SetRead;		
	in R24,0xa
	andi R24,135
	out 0xa,R24
	.dbline 289
	in R24,0xb
	ori R24,120
	out 0xb,R24
	.dbline 289
	nop
	.dbline 289
	.dbline 289
	in R24,0x5
	ori R24,1
	out 0x5,R24
	.dbline 289
	.dbline 290
; 	SetCommand;
	in R24,0x5
	andi R24,253
	out 0x5,R24
	.dbline 290
	.dbline -2
L12:
	.dbline 0 ; func end
	ret
	.dbsym r Command 16 c
	.dbend
	.dbfunc e LCDSendData _LCDSendData fV
;           Data -> R16
	.even
_LCDSendData::
	.dbline -1
	.dbline 300
; }
; 
; /***********************************************************
; *   函数说明:向LCD发送数据函数                            *
; *   输入:    需要发送的数据                               *
; *   输出:    无                                           *
; *   调用函数:LCD_SEND_HALF_CHAR_HIGH() LCD_SEND_HALF_CHAR_LOW() *
; ***********************************************************/
; void LCDSendData(UINT8 Data)
; {
	.dbline 301
;     SetWrite;
	in R24,0xa
	ori R24,120
	out 0xa,R24
	.dbline 301
	in R24,0xb
	ori R24,120
	out 0xb,R24
	.dbline 301
	nop
	.dbline 301
	.dbline 301
	in R24,0x5
	andi R24,254
	out 0x5,R24
	.dbline 301
	.dbline 302
; 	SetData;
	in R24,0x5
	ori R24,2
	out 0x5,R24
	.dbline 302
	.dbline 304
;     #ifndef _LCD1602_FULL_DATA_MODEL
; 	{
	.dbline 305
; 		LCD_SEND_HALF_CHAR_HIGH(Data);
	in R24,0xb
	andi R24,135
	out 0xb,R24
	.dbline 305
	mov R24,R16
	andi R24,240
	lsr R24
	in R2,0xb
	or R2,R24
	out 0xb,R2
	.dbline 305
	.dbline 306
; 		LCD_E = HIGH;
	in R24,0xb
	ori R24,128
	out 0xb,R24
	.dbline 307
; 	    LCD_E = LOW;
	in R24,0xb
	andi R24,127
	out 0xb,R24
	.dbline 308
; 	}
	.dbline 310
; 
; 	{
	.dbline 311
;         LCD_SEND_HALF_CHAR_LOW(Data);	
	in R24,0xb
	andi R24,135
	out 0xb,R24
	.dbline 311
	mov R24,R16
	andi R24,15
	lsl R24
	lsl R24
	lsl R24
	in R2,0xb
	or R2,R24
	out 0xb,R2
	.dbline 311
	.dbline 312
; 		LCD_E = HIGH;
	in R24,0xb
	ori R24,128
	out 0xb,R24
	.dbline 313
; 		LCD_E = LOW;
	in R24,0xb
	andi R24,127
	out 0xb,R24
	.dbline 314
; 	}
	.dbline 320
;     #else
;         LCD_DATA_PORT = Data;
;         LCD_E = HIGH;
;         LCD_E = LOW;
;     #endif
;     SetRead;		
	in R24,0xa
	andi R24,135
	out 0xa,R24
	.dbline 320
	in R24,0xb
	ori R24,120
	out 0xb,R24
	.dbline 320
	nop
	.dbline 320
	.dbline 320
	in R24,0x5
	ori R24,1
	out 0x5,R24
	.dbline 320
	.dbline 321
; 	SetCommand;
	in R24,0x5
	andi R24,253
	out 0x5,R24
	.dbline 321
	.dbline -2
L13:
	.dbline 0 ; func end
	ret
	.dbsym r Data 16 c
	.dbend
	.dbfunc e LCDWaitForReady _LCDWaitForReady fV
	.even
_LCDWaitForReady::
	.dbline -1
	.dbline 331
; }
; 
; /***********************************************************
; *   函数说明:等待LCD空闲状态函数                          *
; *   输入:    无                                           *
; *   输出:    无                                           *
; *   调用函数:LCDDelayUs()                                 *
; ***********************************************************/
; void LCDWaitForReady(void)
; {
	.dbline 336
; #ifdef _USE_LCD_ONLY_WRITE
; 	LCDDelayUs(500);
; #else
; 	
; 	SetRead;
	in R24,0xa
	andi R24,135
	out 0xa,R24
	.dbline 336
	in R24,0xb
	ori R24,120
	out 0xb,R24
	.dbline 336
	nop
	.dbline 336
	.dbline 336
	in R24,0x5
	ori R24,1
	out 0x5,R24
	.dbline 336
	.dbline 337
; 	SetCommand;
	in R24,0x5
	andi R24,253
	out 0x5,R24
	.dbline 337
	.dbline 339
;    
;     LCD_E = HIGH;
	in R24,0xb
	ori R24,128
	out 0xb,R24
L15:
	.dbline 340
; 	while (LCD_BF == 1);   //RW=1,读PD7,为0表示空闲;
L16:
	.dbline 340
	in R24,0x9
	lsr R24
	lsr R24
	lsr R24
	lsr R24
	lsr R24
	lsr R24
	andi R24,1
	cpi R24,1
	breq L15
X2:
	.dbline 341
;     LCD_E = LOW;
	in R24,0xb
	andi R24,127
	out 0xb,R24
	.dbline -2
L14:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCDSetXY _LCDSetXY fV
;       Address0 -> R20
;              Y -> R10
;              X -> R22
	.even
_LCDSetXY::
	rcall push_xgsetF00C
	mov R10,R18
	mov R22,R16
	.dbline -1
	.dbline 423
; 	
; #endif
; }
; #else
; 
; /***********************************************************
; *   函数说明:向LCD发送指令函数                            *
; *   输入:    需要发送的指令                               *
; *   输出:    无                                           *
; *   调用函数:LCD_SEND_HALF_CHAR_HIGH()                    *
; *             LCD_SEND_HALF_CHAR_LOW()                     *
; ***********************************************************/
; void LCDSendCommand(UINT8 Command)
; {
; 	SetCommand;
; 	{
; 	    SetEnable;
; 		
; 		LCD_SEND_HALF_CHAR_HIGH(Command);
; 		
; 	    SetDisable;
; 	}
; 	{
; 	    SetEnable;
; 		
;         LCD_SEND_HALF_CHAR_LOW(Command);	
; 		
; 		SetDisable;
; 	}
; 	SetCommand;
; }
; 
; /***********************************************************
; *   函数说明:向LCD发送数据函数                            *
; *   输入:    需要发送的数据                               *
; *   输出:    无                                           *
; *   调用函数:LCD_SEND_HALF_CHAR_HIGH()                    *
; *             LCD_SEND_HALF_CHAR_LOW()                     *
; ***********************************************************/
; void LCDSendData(UINT8 Data)
; {
; 	SetData;
; 	{
; 	    SetEnable;
; 		
; 		LCD_SEND_HALF_CHAR_HIGH(Data);
; 		
; 	    SetDisable;
; 	}
; 
; 	{
; 	    SetEnable;
; 		
;         LCD_SEND_HALF_CHAR_LOW(Data);	
; 		
; 		SetDisable;
; 	}
; 	SetCommand;
; }
; 
; /***********************************************************
; *   函数说明:等待LCD空闲状态函数                          *
; *   输入:    无                                           *
; *   输出:    无                                           *
; *   调用函数:LCDDelayUs()                                 *
; ***********************************************************/
; void LCDWaitForReady(void)
; {
; 	LCDDelayUs(30);
; }
; 
; #endif
; 
; 
; /***********************************************************
; *   函数说明:设置显示坐标函数                             *
; *   输入:    x,y坐标值                                    *
; *   输出:    无                                           *
; *   调用函数:LCDWaitForReady()  LCDSendCommand()          *
; ***********************************************************/
; void LCDSetXY(UINT8 X,UINT8 Y)
; {
	.dbline 425
;     UINT8 Address;
;     if (Y == 0)
	tst R10
	brne L19
X3:
	.dbline 426
; 	{
	.dbline 427
; 	    Address = 0x80 + X;
	mov R20,R22
	subi R20,128    ; addi 128
	.dbline 428
; 	}
	rjmp L20
L19:
	.dbline 430
;     else
; 	{ 
	.dbline 431
;         Address = 0xc0 + X;
	mov R20,R22
	subi R20,64    ; addi 192
	.dbline 432
; 	}
L20:
	.dbline 434
; 	
; 	LCDWaitForReady();
	rcall _LCDWaitForReady
	.dbline 435
;     LCDSendCommand(Address);
	mov R16,R20
	rcall _LCDSendCommand
	.dbline -2
L18:
	.dbline 0 ; func end
	rjmp pop_xgsetF00C
	.dbsym r Address0 20 c
	.dbsym r Y 10 c
	.dbsym r X 22 c
	.dbend
	.dbfunc e LCDDisplayString _LCDDisplayString fV
;         String -> R20,R21
	.even
_LCDDisplayString::
	st -y,R20
	st -y,R21
	movw R20,R16
	.dbline -1
	.dbline 445
; }
; 
; /***********************************************************
; *   函数说明:LCD字符串显示函数                            *
; *   输入:    要显示的字符串指针                           *
; *   输出:    无                                           *
; *   调用函数:LCDWaitForReady() LCDSendData()              *
; ***********************************************************/
; void LCDDisplayString(UINT8 *String)
; {
	rjmp L23
L22:
	.dbline 447
;     while(*String)
; 	{
	.dbline 448
; 	    LCDWaitForReady();
	rcall _LCDWaitForReady
	.dbline 449
; 	    LCDSendData(*String);
	movw R30,R20
	ldd R16,z+0
	rcall _LCDSendData
	.dbline 450
; 		String++;
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 451
; 	}
L23:
	.dbline 446
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L22
X4:
	.dbline -2
L21:
	.dbline 0 ; func end
	ld R21,y+
	ld R20,y+
	ret
	.dbsym r String 20 pc
	.dbend
	.dbfunc e LCDDisplayNum _LCDDisplayNum fV
;             a1 -> R20
;       BitCount -> y+5
;            Num -> y+1
	.even
_LCDDisplayNum::
	rcall push_arg4
	st -y,R20
	.dbline -1
	.dbline 461
; }
; 
; /***********************************************************
; *   函数说明:数值显示函数(HEX)                            *
; *   输入:    需要显示的数字(无符号长整形)               *
; *   输出:    无                                           *
; *   调用函数:LCDSendData()                                *
; ***********************************************************/
; void LCDDisplayNum(unsigned long Num,UINT8 BitCount)
; {
	.dbline 462
;     UINT8 a = 0;
	.dbline 463
; 	for (a = 8-BitCount ;a<8;a++)
	ldi R20,8
	ldd R0,y+5
	sub R20,R0
	rjmp L29
L26:
	.dbline 464
; 	{
	.dbline 465
; 	    LCDSendData(CHR[(Num<<(a<<2))>>28]);
	mov R2,R20
	clr R3
	lsl R2
	rol R3
	lsl R2
	rol R3
	ldd R16,y+1
	ldd R17,y+2
	ldd R18,y+3
	ldd R19,y+4
	st -y,R2
	rcall lsl32
	ldi R24,28
	ldi R25,0
	st -y,R24
	rcall lsr32
	movw R30,R16
	ldi R24,<_CHR
	ldi R25,>_CHR
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	rcall _LCDSendData
	.dbline 466
; 	}
L27:
	.dbline 463
	inc R20
L29:
	.dbline 463
	cpi R20,8
	brlo L26
X5:
	.dbline -2
L25:
	.dbline 0 ; func end
	ld R20,y+
	adiw R28,4
	ret
	.dbsym r a1 20 c
	.dbsym l BitCount 5 c
	.dbsym l Num 1 l
	.dbend
	.dbfunc e RunString _RunString fV
;           EndX -> R3
;         StartX -> R2
;              Y -> R1
;         String -> R0,R1
	.even
_RunString::
	.dbline -1
	.dbline 477
; }
; 
; 
; /***********************************************************
; *   函数说明:滚屏字幕效果                                 *
; *   输入:    需要滚屏的字符串 长度 位置                   *
; *   输出:    无                                           *
; *   调用函数:LOCATE()   PRINT()                           *
; ***********************************************************/
; void RunString(UINT8 *String,UINT8 Y,UINT8 StartX,UINT8 EndX)

⌨️ 快捷键说明

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