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

📄 rd_lcd1602b.s

📁 LCD1602键盘显示模块实例
💻 S
📖 第 1 页 / 共 3 页
字号:
_LCDSendData::
	.dbline -1
	.dbline 278
; }
; 
; /***********************************************************
; *   函数说明:向LCD发送数据函数                            *
; *   输入:    需要发送的数据                               *
; *   输出:    无                                           *
; *   调用函数:LCD_SEND_HALF_CHAR_HIGH() LCD_SEND_HALF_CHAR_LOW() *
; ***********************************************************/
; void LCDSendData(char Data)
; {
	.dbline 279
;     SetWrite;
	ldi R24,255
	out 0x1a,R24
	.dbline 279
	.dbline 279
	in R24,0x18
	andi R24,253
	out 0x18,R24
	.dbline 279
	.dbline 280
; 	SetData;
	in R24,0x18
	ori R24,1
	out 0x18,R24
	.dbline 280
	.dbline 294
;     #ifndef _LCD1602_FULL_DATA_MODEL
; 	{
; 		LCD_SEND_HALF_CHAR_HIGH(Data);
; 		LCD_E = HIGH;
; 	    LCD_E = LOW;
; 	}
; 
; 	{
;         LCD_SEND_HALF_CHAR_LOW(Data);	
; 		LCD_E = HIGH;
; 		LCD_E = LOW;
; 	}
;     #else
;         LCD_DATA_PORT = Data;
	out 0x1b,R16
	.dbline 295
;         LCD_E = HIGH;
	in R24,0x18
	ori R24,4
	out 0x18,R24
	.dbline 296
;         LCD_E = LOW;
	in R24,0x18
	andi R24,251
	out 0x18,R24
	.dbline 298
;     #endif
;     SetRead;		
	clr R2
	out 0x1a,R2
	.dbline 298
	ldi R24,255
	out 0x1b,R24
	.dbline 298
	.dbline 298
	in R24,0x18
	ori R24,2
	out 0x18,R24
	.dbline 298
	.dbline 299
; 	SetCommand;
	in R24,0x18
	andi R24,254
	out 0x18,R24
	.dbline 299
	.dbline -2
L13:
	.dbline 0 ; func end
	ret
	.dbsym r Data 16 c
	.dbend
	.dbfunc e LCDWaitForReady _LCDWaitForReady fV
	.even
_LCDWaitForReady::
	.dbline -1
	.dbline 309
; }
; 
; /***********************************************************
; *   函数说明:等待LCD空闲状态函数                          *
; *   输入:    无                                           *
; *   输出:    无                                           *
; *   调用函数:LCDDelayUs()                                 *
; ***********************************************************/
; void LCDWaitForReady(void)
; {
	.dbline 311
; #ifdef _USE_LCD_ONLY_WRITE
; 	LCDDelayUs(500);
	ldi R16,500
	ldi R17,1
	xcall _LCDDelayUs
	.dbline -2
L14:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCDSetXY _LCDSetXY fV
;       Address0 -> R20
;              Y -> R10
;              X -> R22
	.even
_LCDSetXY::
	xcall push_xgsetF00C
	mov R10,R18
	mov R22,R16
	.dbline -1
	.dbline 401
; #else
; 	
; 	SetRead;
; 	SetCommand;
;    
;     LCD_E = HIGH;
; 	while (LCD_BF == 1);   //RW=1,读PD7,为0表示空闲;
;     LCD_E = LOW;
; 	
; #endif
; }
; #else
; 
; /***********************************************************
; *   函数说明:向LCD发送指令函数                            *
; *   输入:    需要发送的指令                               *
; *   输出:    无                                           *
; *   调用函数:LCD_SEND_HALF_CHAR_HIGH()                    *
; *             LCD_SEND_HALF_CHAR_LOW()                     *
; ***********************************************************/
; void LCDSendCommand(char 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(char 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(char X,char Y)
; {
	.dbline 403
;     char Address;
;     if (Y == 0)
	tst R10
	brne L16
X2:
	.dbline 404
; 	{
	.dbline 405
; 	    Address = 0x80 + X;
	mov R20,R22
	subi R20,128    ; addi 128
	.dbline 406
; 	}
	xjmp L17
L16:
	.dbline 408
;     else
; 	{ 
	.dbline 409
;         Address = 0xc0 + X;
	mov R20,R22
	subi R20,64    ; addi 192
	.dbline 410
; 	}
L17:
	.dbline 412
; 	
; 	LCDWaitForReady();
	xcall _LCDWaitForReady
	.dbline 413
;     LCDSendCommand(Address);
	mov R16,R20
	xcall _LCDSendCommand
	.dbline -2
L15:
	.dbline 0 ; func end
	xjmp 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 423
; }
; 
; /***********************************************************
; *   函数说明:LCD字符串显示函数                            *
; *   输入:    要显示的字符串指针                           *
; *   输出:    无                                           *
; *   调用函数:LCDWaitForReady() LCDSendData()              *
; ***********************************************************/
; void LCDDisplayString(char *String)
; {
	xjmp L20
L19:
	.dbline 425
;     while(*String)
; 	{
	.dbline 426
; 	    LCDWaitForReady();
	xcall _LCDWaitForReady
	.dbline 427
; 	    LCDSendData(*String);
	movw R30,R20
	ldd R16,z+0
	xcall _LCDSendData
	.dbline 428
; 		String++;
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 429
; 	}
L20:
	.dbline 424
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L19
X3:
	.dbline -2
L18:
	.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::
	xcall push_arg4
	st -y,R20
	.dbline -1
	.dbline 439
; }
; 
; /***********************************************************
; *   函数说明:数值显示函数(HEX)                            *
; *   输入:    需要显示的数字(无符号长整形)               *
; *   输出:    无                                           *
; *   调用函数:LCDSendData()                                *
; ***********************************************************/
; void LCDDisplayNum(unsigned long Num,char BitCount)
; {
	.dbline 440
;     char a = 0;
	.dbline 441
; 	for (a = 8-BitCount ;a<8;a++)
	ldi R20,8
	ldd R0,y+5
	sub R20,R0
	xjmp L26
L23:
	.dbline 442
; 	{
	.dbline 443
; 	    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
	xcall lsl32
	ldi R24,28
	ldi R25,0
	st -y,R24
	xcall lsr32
	movw R30,R16
	ldi R24,<_CHR
	ldi R25,>_CHR
	add R30,R24
	adc R31,R25
	lpm R16,Z
	xcall _LCDSendData
	.dbline 444
; 	}
L24:
	.dbline 441
	inc R20
L26:
	.dbline 441
	cpi R20,8
	brlo L23
X4:
	.dbline -2
L22:
	.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
	.area data(ram, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_LCD1602B.c
L28:
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_LCD1602B.c
L29:
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_LCD1602B.c
	.area text(rom, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_LCD1602B.c
	.dbfunc e RunString _RunString fV
	.dbsym s RunTimeCounter L29 i
	.dbsym s StringHead L28 c
;         SCREEN -> y+0
;             a1 -> R12
;    StringLong0 -> R10
;         Point0 -> R14
;           EndX -> y+31
;         StartX -> R20
;              Y -> y+27
;         String -> R22,R23
	.even
_RunString::
	st -y,r19
	st -y,r18
	xcall push_xgsetF0FC
	movw R22,R16
	sbiw R28,17
	ldd R20,y+29
	.dbline -1
	.dbline 455
; }
; 
; 
; /***********************************************************
; *   函数说明:滚屏字幕效果                                 *
; *   输入:    需要滚屏的字符串 长度 位置                   *
; *   输出:    无                                           *
; *   调用函数:LOCATE()   PRINT()                           *
; ***********************************************************/
; void RunString(char *String,char Y,char StartX,char EndX)
; {
	.dbline 458
;    static char StringHead = 0;
; 	char SCREEN[17];
; 	char a = 0;
	.dbline 459
; 	char Point = StringHead;
	lds R14,L28
	.dbline 460
; 	char StringLong = StringLength(String);
	movw R16,R22
	xcall _StringLength
	mov R10,R16
	.dbline 463
; 	static unsigned int RunTimeCounter = 0;
; 	
; 	for (a = 0;a<EndX - StartX + 1;a++)
	clr R12
	xjmp L33
L30:
	.dbline 464
; 	{
	.dbline 465
; 	     SCREEN[a] = String[Point];
	mov R30,R14
	clr R31
	add R30,R22
	adc R31,R23
	ldd R2,z+0
	movw R24,R28
	mov R30,R12
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 466

⌨️ 快捷键说明

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