📄 1.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 + -