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

📄 1.asm

📁 LCD12864显示汉字(汇编语言)
💻 ASM
字号:
/***********************************************************
实验名称:LCD12864显示汉字示例程序
程序说明:烧好程序,正确插上LCD12864即可观察到LCD上显示的汉字
注意:USB供电可能不足,这时需要用变压器供电。
作者:RF-X1开发板团队
日期:2008-08-01
***********************************************************/

ORG	0000H
LJMP	MAIN

RS	EQU	P2.0	;信号0数据1选择
RW	EQU	P2.1	;寄存器读1写0
E	EQU	P2.2	;使能脚
PSB	EQU	P2.3	;串0并1行模式选择
RST	EQU	P2.5	;复位信号
LDATA	EQU	P1	;数据输入管脚
KEYF	BIT	00H
DISF	BIT	01H
DISF0	BIT	02H

CHAR_X	EQU	30H	;写入字符的起始坐标80-9F
CHAR_C	EQU	31H	;写入字符的个数
PIC_V	EQU	32H	;图形显示纵坐标
PIC_H	EQU	33H	;图形显示横坐标
CNT0	EQU	34H	;循环参数
CNT1	EQU	35H	;
CNT2	EQU	36H	;
DOT_X	EQU	37H	;画点X坐标
DOT_Y	EQU	38H	;画点Y坐标
DOTH	EQU	39H	;数据高位
DOTL	EQU	3AH	;数据低位

CNT3	EQU	42H
POS	EQU	43H
ORG	0030H

MAIN:	MOV	SP,#50H
	MOV	SCON,#50H
	MOV	TMOD,#20H
	MOV	TH1,#0FDH
	MOV	TL1,#0FDH
	MOV	PCON,#80H
	MOV	CNT3,#50
	MOV	POS,#00H
	CLR	DISF
   CLR     DISF0
	SETB	TR1
	CLR	EA
	LCALL	L_INT
	LCALL	L_CRAM
	
M0:	

       JB      DISF0,M2
        LCALL   L_WEL0
        SJMP	M0
M2:	JB	DISF, M1
	LCALL	L_WEL
	SJMP	M0
M1:	LCALL	DIS
	SJMP	M0


	
L_TEXT:	PUSH	ACC
	MOV	A,#30H
	LCALL	L_WI
	POP	ACC

L_WEL:	PUSH	ACC
	MOV	A,#30H		//显示欢迎界面
	LCALL	L_WI

	MOV	CHAR_X,#80H
	MOV	CHAR_C,#10H
	LCALL	L_WCHR
	MOV	CHAR_X,#90H
	MOV	CHAR_C,#10H
	LCALL	L_WCHR
	POP	ACC
	RET

L_WEL0:	PUSH	ACC
	MOV	A,#30H		//显示欢迎界面
	LCALL	L_WI
	MOV	DPTR,#CH_TAB0
	MOV	CHAR_X,#80H
	MOV	CHAR_C,#10H
	LCALL	L_WCHR
	MOV	CHAR_X,#90H
	MOV	CHAR_C,#10H
	LCALL	L_WCHR
        MOV	CHAR_X,#88H
	MOV	CHAR_C,#10H
	LCALL	L_WCHR
	MOV	CHAR_X,#98H
	MOV	CHAR_C,#10H
	LCALL	L_WCHR
        POP	ACC
	RET

DIS:	PUSH	ACC
	MOV	A,#30H		//显示欢迎界面
	LCALL	L_WI
	MOV	DPTR,#CH_TAB0
	MOV	CHAR_X,#80H
	MOV	CHAR_C,#10H
	LCALL	L_WCHR
	MOV	CHAR_X,#90H
	MOV	CHAR_C,#10H
	LCALL	L_WCHR
	MOV	CHAR_X,#90H
	MOV	CHAR_C,#10H
	LCALL	L_WCHR
	MOV	CHAR_X,#88H
	MOV	CHAR_C,#10H
	LCALL	L_WCHR

	MOV	A,POS
	MOV	B,#6
	MUL	AB
	MOV	R6,A
	INC	R6
DIS0:	DJNZ	R6, DIS1
	JMP	DIS2
DIS1:	INC	DPTR
	JMP	DIS0
DIS2:	MOV	CHAR_X,#88H
	MOV	CHAR_C,#6
	LCALL	L_WCHR


	MOV	A,POS
	MOV	B,#16
	MUL	AB
	MOV	R6,A
	INC	R6
DIS3:	DJNZ	R6, DIS4
	JMP	DIS5
DIS4:	INC	DPTR
	JMP	DIS3
DIS5:	MOV	CHAR_X,#98H
	MOV	CHAR_C,#10H
	LCALL	L_WCHR
	LCALL	DELAY0
	POP	ACC
	RET




;写入字符
;DPTR 写入字符串的表头
;CHAR_X 起始坐标
;CHAR_C 字符个数
L_WCHR0:PUSH	ACC
	MOV	A,CHAR_X
	MOV	B,#08H
	MOV	A,CHAR_X
	LCALL	L_WI
WCHR1:	CLR	A
	MOV	A, @R0
	LCALL	L_WD
	INC	R0
	DJNZ	CHAR_C,WCHR1 
	MOV	A,#30H
	LCALL	L_WI
	POP	ACC
	RET

;写入字符
;DPTR 写入字符串的表头
;CHAR_X 起始坐标
;CHAR_C 字符个数
L_WCHR:PUSH	ACC
	MOV	A,CHAR_X
	MOV	B,#08H
	MOV	A,CHAR_X
	LCALL	L_WI
WCHR0:	CLR	A
	MOVC	A, @A+DPTR
	LCALL	L_WD
	INC	DPTR
	DJNZ	CHAR_C,WCHR0 
	MOV	A,#30H
	LCALL	L_WI
	POP	ACC
	RET

;全屏显示图形
;图像编码表头存放于DPTR中
;占用34H-36H单元
L_DPIC:	PUSH	ACC
	MOV	PIC_H,#00H
	MOV	CNT0,#02H
DP2:	MOV	PIC_V,#00H
	MOV	CNT1,#20H
DP1:	LCALL	L_XY
	MOV	CNT2,#10H
DP0:	CLR	A
	MOVC	A, @A+DPTR
	LCALL	L_WD
	INC	DPTR
	DJNZ	CNT2, DP0
	INC	PIC_V
	DJNZ	CNT1, DP1
	MOV	PIC_H,#08H
	DJNZ	CNT0, DP2
	MOV	A,#36H
	LCALL	L_WI
	POP	ACC
	RET

;清GDRAM
L_CRAM:	PUSH	ACC
	MOV	PIC_H,#00H
	MOV	CNT0,#02H
CR2:	MOV	PIC_V,#00H
	MOV	CNT1,#20H
CR1:	LCALL	L_XY
	MOV	CNT2,#10H
CR0:	CLR	A
	LCALL	L_WD
	DJNZ	CNT2, CR0
	INC	PIC_V
	DJNZ	CNT1, CR1
	MOV	PIC_H,#08H
	DJNZ	CNT0, CR2
	MOV	A,#36H
	LCALL	L_WI
	POP	ACC
	RET

;在指定坐标画点
L_DOT:	PUSH	ACC
	CLR	C
	MOV	A,#3FH		;将实际坐标转换为屏幕坐标:Y=63-Y0,X=X0
	SUBB	A, DOT_Y	;Y>31?Y=YMOD32,Y=Y
	MOV	B,#20H		;
	DIV	AB
	JZ	DOT0		;Y<31?X=X
	MOV	A,DOT_X		;Y>31,X=X+127
	ADD	A, #80H
	MOV	DOT_X,A
DOT0:	MOV	DOT_Y,B
	MOV	PIC_V,B		;点坐标转换为RAM坐标
	MOV	A,DOT_X
	MOV	B,#10H
	DIV	AB		;A为RAM横坐标,B为改坐标点内第几位
	MOV	PIC_H,A		
	MOV	DOTH,#0FFH	;装配待写入的数据
	MOV	DOTL,#00H
	MOV	A,B
	JZ	DOT1		;余数为0,单独处理
	MOV	R1,#8H		;
	MOV	R0,B		;余数不为零,最高位置1,右移B位
	MOV	A,#80H		;A最高位置一
DOT2:	RR	A		;右移一位
	DJNZ	R1, DOT4	;是否移了八位?
	MOV	R1,#08H		;是,把高八位数据清零
	MOV	DOTH,#00H	
	MOV	A,#80H		;A重置为最高位1
DOT4:	DJNZ	R0, DOT2	
	MOV	R2,DOTH	
	CJNE	R2, #00H, DOT5	;判断高八位数据是否为零,是,则
	MOV	DOTH,#00H
	MOV	DOTL,A
	SJMP	DOT3
DOT5:	MOV	DOTH,A
	SJMP	DOT3
DOT1:	MOV	DOTH,#00H
	ORL	DOTH, #80H
DOT3:	LCALL	L_XY
	LCALL	L_RD	;预读
	LCALL	L_RD	;读入高字节
	ORL	DOTH,A	;读入低字节
	LCALL	L_RD
	ORL	DOTL,A

	LCALL	L_XY
	MOV	A,DOTH
	LCALL	L_WD
	MOV	A,DOTL
	LCALL	L_WD
	POP	ACC
	RET
		

;设置图形显示坐标
;坐标格式为PIC_V+80H,PICY+80H 
L_XY:	PUSH	ACC		;保存现场
	MOV	A,#34H		;设置液晶为扩展模式
	LCALL	L_WI
	ORL	PIC_V,#80H	;格式化坐标
	MOV	A,PIC_V
	LCALL	L_WI	
	ORL	PIC_H,#80H
	MOV	A,PIC_H;
	LCALL	L_WI
	MOV	A, #30H		;设置液晶为基本模式
	LCALL	L_WI
	POP	ACC
	RET
;清屏
L_CLR:	MOV	A,#01H
	LCALL	L_WI
	RET

;初始化液晶
L_INT:	LCALL	L_SET
	LCALL	L_CHK
	MOV	A,#00110000B;D2=0基本模式,D4=1八位接口
	LCALL	L_WI
	MOV	A,#00000001B;清屏
	LCALL	L_WI
	MOV	A,#00001100B;开显示
	LCALL	L_WI
	RET

;复位及设置工作方式
L_SET:	CLR	RST	;复位
	LCALL	DELAY0	;延时50ms
	SETB	RST	
	SETB	PSB	;设置为并口通讯方式
	RET
	
;检查是否忙碌
;RS=0,RW=1,E=高电平,A=数据
L_CHK:	MOV	LDATA,#0FFH
	CLR	RS
	SETB	RW
	SETB	E
	JB	LDATA.7, $
	CLR	E
	RET

;写数据
;RS=1,RW=0,E=高脉冲,A=数据
L_WD:	LCALL	L_CHK
	SETB	RS
	CLR	RW
	MOV	LDATA,A
	SETB	E
	NOP
	NOP
	CLR	E
	RET

;写指令
;RS=0,RW=0,E=高脉冲,A=数据
L_WI:	LCALL	L_CHK
	CLR	RS
	CLR	RW
	MOV	LDATA,A
	SETB	E
	NOP
	NOP
	CLR	E
	RET

;读数据
;RS=1,RW=1,E=高电平,A=数据
L_RD:	LCALL	L_CHK
	MOV	LDATA,#0FFH
	SETB	RS
	SETB	RW
	SETB	E
	NOP
	MOV	A,LDATA
	CLR	E
	RET

DELAY0:	MOV	R0,#64H		;延时50ms
D00:	MOV	R1,#0FAH	;100*250*2=50000us=50ms
	DJNZ	R1,$
	DJNZ	R0, D00
	RET

DELAY1:	MOV	R0,#14H	
D10:	MOV	R1,#0FAH
	DJNZ	R1,$
	DJNZ	R0,D10
	RET

CH_TAB0:	
	DB '      RF-X1     '
	DB '51单片机开发板  '
	DB '它是您最好的选择'	
	DB '实惠好用欢迎订购'

   

XX:	DB	80H,90H,88H,98H		;字符显示各行起始坐标
	END

⌨️ 快捷键说明

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