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

📄 lcd.asm

📁 1602显示测试程序
💻 ASM
字号:
;----------------------------------------
;		LCD DISPLAYER
;----------------------------------------
;----------------INSTRUCTION------------
;--命令数据控制:LCD_RS->P1.0
;--读写控制端口:LCD_RW->P1.1
;--选通控制端口:LCD_EN->P1.2
;--信号灯控制口:COMM_STATE->P3.2
;--结束灯控制口:COMM_END->P1.7
;--按键开关端口:KEY->P1.6
;--P0口对应LCD数据口

;--命令缓冲区位于:08H		1位
;--参数长度缓冲区位于:09H,其中高半位为发送长度,低半位为接受长度
;--发送参数缓冲区位于:0A-11H	8位
;--键盘缓冲区位于:12H-13H		2位
;--接受参数缓冲区位于:14H-1BH	8位
;--光标位置存储区位于:1CH	1位
;--KEY_STATE=01H为按键状态
;--SHIFT_STATE=02H为光标移动状态
;--RETURN_STATE=03H为光标返回状态
;LCD_CH=04H
;LCD_CGRAM_ADD=05H,LCD_DDRAM_ADD=06H为地址寄存区
;LCD_RAM_RD=07H为读出数据状态缓冲区
;LCD_RAM_WR=08H为写入数据显示缓冲区
;LCD_DISP_RAM=09H~29H为显示数据存储区
;LCD_BUSY=2AH为检测状态位
;MODE_NU=2BH为
;--定义LCD控制端口
	LCD_RS	EQU	P1.0
	LCD_RW	EQU	P1.1	
	LCD_EN	EQU	P1.2

;--定义通讯端口
	COMM_STATE	EQU	P3.2
	COMM_END	EQU	P1.7
	KEY		EQU	P1.6

;--定义变量
	KEY_STATE		EQU	00H
	SHIFT_STATE		EQU	01H
	RERURN_STATE	EQU	02H
;--定义RAM
	CURSOR_POS		EQU	1CH
;	LCD_CH		EQU	30H
;	LCD_CGRAM_ADD	EQU	31H
;	LCD_DDRAM_ADD	EQU	32H
;	LCD_RAM_RD		EQU	33H
;	LCD_RAM_WR		EQU	35H	;33H 数据暂存区,35H~55H为显示数据存储区
	LCD_CH		EQU	1DH	
	LCD_CGRAM_ADD	EQU	1EH
	LCD_DDRAM_ADD	EQU	1FH
	LCD_RAM_RD		EQU	20H
	LCD_RAM_WR		EQU	21H
;--主程序
	ORG	0000H
	LJMP	MAIN
MAIN:
	MOV	SP,#30H
	CLR	COMM_STATE
	CLR	COMM_END
KEYSCAN:
	JB	KEY,KEYSCAN
	LCALL	LCD_INIT		;--LCD初始化
	SETB	COMM_STATE

	MOV	DPTR,#EXP_LOGO	
	LCALL	DISPLAY_STRING
	LCALL	DL1S
	
	CLR	COMM_STATE
	SETB	COMM_END
	MOV	A,#0
	LCALL	SET_DDRAM
	
	MOV	DPTR,#INIT_LOGO	;---初始化HOST
	LCALL	DISPLAY_STRING
	LCALL	DL1S

	LJMP	MAIN
;----------------SUB---------------------
;--------------LCD初始化------------------
LCD_INIT:
	CLR	LCD_RS
	CLR	LCD_RW
	LCALL	CLR_LCD		;---清屏

	MOV	P0,#00000110B	;---设置光标移动方向,并指定显示是否移动.(增量方式,不移动)
	SETB	LCD_EN
	LCALL	DL40US
	CLR	LCD_EN

	LCALL	HIDE_CURSOR		;---设置显示开关(显示),光标开关(关),字符闪烁(关)

	MOV	P0,#00111000B	;---功能设置.(8位,2行,5*7字体)
	SETB	LCD_EN
	LCALL	DL40US
	CLR	LCD_EN

	MOV	A,#0			;---设置DDRAM地址(0)
	LCALL	SET_DDRAM
	RET
;---------------清屏显示------------------
CLR_LCD:			;数据指针清零,所有显示清零
	NOP			;清屏
	CLR	LCD_RS
	CLR	LCD_RW
	MOV	P0,#00000001B
	SETB	LCD_EN
	LCALL	DL2MS
	CLR	LCD_EN
	LCALL	DL2MS
	RET
;-------------设置光标返回-------------
SET_CURSOR_RETURN:	;数据指针清零,光标退回初始状态
	NOP
	CLR	LCD_RS
	CLR	LCD_RW
	MOV	P0,#00000010B
	SETB	LCD_EN
	LCALL	DL2MS
	CLR	LCD_EN
	LCALL	DL2MS
	RET
;--------------设置输入方式----------------
SET_LCD_IN:			;当读或写一个字符后,地址指针加一且光标加一,整屏显示不移动
	NOP
	CLR	LCD_RS
	CLR	LCD_RW
	MOV	P0,#00000110B
	SETB	LCD_EN
	LCALL	DL40US
	CLR	LCD_EN
	LCALL	DL40US
	RET
SET_INPUT_MODE1:
	NOP
	CLR	LCD_RS
	CLR	LCD_RW
	MOV	P0,#00000110B
	SETB	LCD_EN
	LCALL	DL40US
	CLR	LCD_EN
	LCALL	DL40US
	RET
SET_INPUT_MODE2:
	NOP
	CLR	LCD_RS
	CLR	LCD_RW
	MOV	P0,#00000111B
	SETB	LCD_EN
	LCALL	DL40US
	CLR	LCD_EN
	LCALL	DL40US
	RET
;-------------设置显示开关---------------
SET_LCD_DISP:		;开显示,不显示光标,光标不显示
	NOP
	CLR	LCD_RS
	CLR	LCD_RW
	MOV	P0,#00001100B
	SETB	LCD_EN
	LCALL	DL40US
	CLR	LCD_EN
	LCALL	DL40US
	RET
SET_DISP_CLOSE:
	NOP
	CLR	LCD_RS
	CLR	LCD_RW
	MOV	P0,#00001000B
	SETB	LCD_EN
	LCALL	DL40US
	CLR	LCD_EN
	LCALL	DL40US
	RET
SET_LCD_DISP1:
	NOP
	CLR	LCD_RS
	CLR	LCD_RW
	MOV	P0,#00001111B
	SETB	LCD_EN
	LCALL	DL40US
	CLR	LCD_EN
	LCALL	DL40US
	RET
SET_DISP_ONOFF1:		;开显示,不显示光标,字符光标不显示
	NOP
	CLR	LCD_RS
	CLR	LCD_RW
	MOV	P0,#00001100B
	SETB	LCD_EN
	LCALL	DL40US
	CLR	LCD_EN
	LCALL	DL40US
	RET
SET_SHOW_CURSOR:		;开显示,光标关,字符光标闪
	NOP
	CLR	LCD_RS
	CLR	LCD_RW
	MOV	P0,#00001101B
	SETB	LCD_EN
	LCALL	DL40US
	CLR	LCD_EN
	LCALL	DL40US
	RET
SET_HIDE_CURSOR:		;开显示,光标关,字符光标不闪
	NOP
	CLR	LCD_RS
	CLR	LCD_RW
	MOV	P0,#00001100B
	SETB	LCD_EN
	LCALL	DL40US
	CLR	LCD_EN
	LCALL	DL40US
	RET
SET_CURSOR_POS:
	MOV	A,CURSOR_POS
	MOV	DPTR,#CURSORTAB
	MOVC	A,@A+DPTR
	LCALL	SET_DDRAM_ADD
	RET	
HIDE_CURSOR:
	MOV	P0,#00001100B
	SETB	LCD_EN
	LCALL	DL40US
	CLR	LCD_EN
	RET
;------------设置移位方式-----------
SET_SHIFT_MODE:		;光标移位,左移
	NOP
	CLR	LCD_RS
	CLR	LCD_RW
	MOV	P0,#10H	;00010000B
	SETB	LCD_EN
	LCALL	DL40US
	CLR	LCD_EN
	LCALL	DL40US
	RET
;------------功能设置---------------
SET_FUNC_SETTING1:
	NOP
	CLR	LCD_RS
	CLR	LCD_RW
	MOV	P0,#00111000B;---DL=8位,N=2行,F=5*7
	SETB	LCD_EN
	LCALL	DL40US
	CLR	LCD_EN
	LCALL	DL40US
	RET
SET_FUNC_SETTING2:	;F=5*10
	NOP
	CLR	LCD_RS
	CLR	LCD_RW
	MOV	P0,#00111100B
	SETB	LCD_EN
	LCALL	DL40US
	CLR	LCD_EN
	LCALL	DL40US
	RET
;--------------CGRAM地址设置----------------
SET_CGRAM_ADD:	;设置CGRAM地址,完发送接收数据
	NOP
	CLR	LCD_RS
	CLR	LCD_RW
	MOV	A,LCD_CGRAM_ADD
	ANL	A,#3FH	;00111111B
	ORL	A,#40H	;01000000B
	MOV	P0,A		
	SETB	LCD_EN
	LCALL	DL40US
	CLR	LCD_EN
	LCALL	DL40US
	RET
;-------------DDRAM地址设置-----------------
SET_DDRAM_ADD:
	MOV	A,#0
	ORL	A,#80H
	MOV	P0,A
	SETB	LCD_EN
	LCALL	DL40US
	CLR	LCD_EN
	RET
SET_DDRAM_ADD1:
	NOP
	CLR	LCD_RS
	NOP
	CLR	LCD_RW
	NOP
	MOV	A,LCD_DDRAM_ADD
	ANL	A,#7FH	;01111111B
	ORL	A,#80H	;10000000B
	MOV	P0,A
	SETB	LCD_EN
	LCALL	DL80US
	CLR	LCD_EN
	LCALL	DL80US
	RET
;---设置DDRAM字程序,参数为A(地址)
SET_DDRAM:
	CLR	LCD_RS
	ORL	A,#80H
	MOV	P0,A
	SETB	LCD_EN
	LCALL	DL40US
	CLR	LCD_EN
	RET
;------------忙标志/读地址计数器-------------
SET_LCD_CHECK:		;读命令
	NOP
	MOV	LCD_CH,#00H
	CLR	LCD_RS
	SETB	LCD_RW
	SETB	LCD_EN
	NOP
	NOP
	MOV	A,P0
	ANL	A,#80H
	JZ	FREE
	MOV	LCD_CH,#0FFH
FREE:	
	CLR	LCD_EN
	RET
;-------------从D口读数据----------------
SET_LCD_READ:
	NOP
	SETB	LCD_RS
	SETB	LCD_RW
	SETB	LCD_EN
	LCALL	DL40US
	MOV	A,P0
	MOV	LCD_RAM_RD,A
	CLR	LCD_EN
	LCALL	DL40US
	RET
;-------------从D口写数据----------------
SET_LCD_WRITE:
	NOP
	SETB	LCD_RS
	NOP
	CLR	LCD_RW
	NOP
	MOV	A,LCD_RAM_WR
	NOP
	MOV	P0,A
	SETB	LCD_EN
	NOP
	LCALL	DL80US
	CLR	LCD_EN
	NOP
	LCALL	DL80US
	RET
;----------显示字符串------------------
;---显示字符串,参数是首地址(DPTR),一行16字
DISPLAY_STRING:
	MOV	R5,#0
DISPLAY_STRING_1:
	CLR	A					;LCD显示地址初值A = 00H
	MOVC	A,@A+DPTR				;---判断A是否为'#',如果不是,则跳转,如果是,退出子程序
	CJNE	A,#23H,DISPLAY_STRING_2
	CLR	LCD_RS
	RET
DISPLAY_STRING_2:
	SETB	LCD_RS
	MOV	P0,A
	SETB	LCD_EN
	LCALL	DL40US
	CLR	LCD_EN
	INC	DPTR
	INC	R5
	CJNE	R5,#16,DISPLAY_STRING_1		
	MOV	A,#40H				;---第二行显示数据
	CLR	LCD_RS				
	LCALL	SET_DDRAM
	SJMP	DISPLAY_STRING_1	
;--------------DISP_RAM------------------
;R1地址增量,R0为显示区地址指针
;----------------------------------------
RAM:	
	MOV	R1,#0H		;DISPLAY RAM
	MOV	R0,#35H		;显示缓冲区首地址指针
	NOP
RAM_ALL:
	MOV	A,R1
	MOVC	A,@A+DPTR		;DPTR=?
	CJNE	A,#23H,RDIS_NEND	;23H->MODE_NU
	SJMP	RAM_NEND
RDIS_NEND:	
	MOV	@R0,A
	INC	R0
	INC	R1
	CJNE	R1,#20H,RAM_ALL
	SJMP	RALL_END
RDIS_END:	
	CJNE	R1,#20H,RAM_NEND
	SJMP	RALL_END
RAM_NEND:	
	MOV	@R0,#8FH
	INC	R1
	INC	R0
	SJMP	RDIS_END
RALL_END:	
	RET
;--------------RAM_WR--------------------
;将35H~54H所有显示数据写如LCD显示RAM中
;R3为地址增量,R0为显示区地址指针
;----------------------------------------
RAM_WR:
	MOV	LCD_DDRAM_ADD,#0H		;INPUT MCS51 RAM INTO ALL OF THE LCD RAM
	LCALL	SET_DDRAM_ADD			;发ADD_DD地址字符命令
	NOP
	MOV	R3,#0H
	MOV	R0,#35H
RAM_WR1:	
	NOP
	MOV	LCD_RAM_WR,@R0		;35H~54H显示数据区数据,通过显示缓冲区写入LCD显示数据区
	LCALL	SET_LCD_WRITE			;
	INC	R3
	INC	R0
	CJNE	R3,#10H,RAM_WR1		;16bytes
	NOP
;第二行显示数据
	MOV	LCD_DDRAM_ADD,#40H		;第二行起始地址40H
	LCALL	SET_DDRAM_ADD
	NOP
	MOV	R3,#0H
RAM_WR2:	
	NOP
	MOV	LCD_RAM_WR,@R0
	LCALL	SET_LCD_WRITE
	INC	R3
	INC	R0
	CJNE	R3,#10H,RAM_WR2
	NOP
	RET
;---------------DELAY----------
;------------------------------
;-----------10US---------------
DL10US:
	MOV	R7,#5
DL10US1:
	DJNZ	R7,DL10US1
	RET
;-----------40US---------------
DL40US:
	MOV	R7,#20
DL40US1:
	DJNZ	R7,DL40US1
	RET
;-----------80US--------------
DL80US:
	MOV	R7,#40
DL80US1:
	DJNZ	R7,DL80US1
	RET
;-----------2MS---------------
DL2MS:
	MOV	R7,#100
DL2MS1:
	MOV	R6,#10
DL2MS2:
	DJNZ	R6,DL2MS2
	DJNZ	R7,DL2MS1
	RET
;------------10MS------------
DL10MS:
	MOV	R7,#100
DL10MS1:
	MOV	R6,#50
DL10MS2:
	DJNZ	R6,DL10MS2
	DJNZ	R7,DL10MS1
	RET
;------------20MS------------
DL20MS:
	MOV	R7,#100
DL20MS1:
	MOV	R6,#100
DL20MS2:
	DJNZ	R6,DL20MS2
	DJNZ	R7,DL20MS1
	RET
;------------50MS------------
DL50MS:
	MOV	R7,#100
DL50MS1:
	MOV	R6,#250
DL50MS2:
	DJNZ	R6,DL50MS2
	DJNZ	R7,DL50MS1
	RET
;-------------1S------------
DL1S:
	MOV	R7,#5
	MOV	R6,#250
	MOV	R5,#250
	DJNZ	R5,$
	DJNZ	R6,$-4
	DJNZ	R7,$-8
	RET
;-------------3S------------
DL3S:
	MOV	R7,#50
DL3S1:
	MOV	R6,#250
DL3S2:
	MOV	R5,#60
DL3S3:
	DJNZ	R5,DL3S3
	DJNZ	R6,DL3S2
	DJNZ	R7,DL3S1
	RET

;------------显示数据表----------
EXP_LOGO:	DB	'== LCD DISPLAYER ==#'
INIT_LOGO:	DB	'Complete Initializing Lcd #'
CURSORTAB:	DB	5,6,12,13,40H,41H,42H,43H,44H,45H,46H,47H,48H,49H,4AH,4BH,4CH,4DH,4EH,4FH
DISP1:	DB	'HELLO,HOW DO YOU DO!#'          ;#字符ASC||码值为#23H
DISP2:	DB	'HELLO!!#'
DISP3:	DB	'HELLO@@#'
;------------显示数据表---------
	END

⌨️ 快捷键说明

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