📄 lcd1.asm
字号:
;-----------上下滚动 -----------
A0 EQU P3.2 ;寄存器选择信号
R_W EQU P3.3 ;读_写选择信号
E1 EQU P3.4 ;使能信号1
E2 EQU P3.5 ;使能信号2
PD1 EQU 3DH ;122/2分成左右两半屏122x32
COLUMN EQU 30H ;列地址寄存器(0-63H)
PAGE_ EQU 31H ;页地址寄存器D1,DO:页地址
CODE_ EQU 32H ;字符代码寄存器
COUNT EQU 33H ;计数器
DIR EQU 34H
CTEMP EQU 38H
COM EQU 20H ;指令寄存器
DAT EQU 21H ;数据寄存器
ORG 0
LJMP MAIN
;-----------初始化程序
INIT: MOV COM,#0E2H ;复位
LCALL PR0
LCALL PR3
MOV COM,#0A4H ;关闭休闭状态
LCALL PR0
LCALL PR3
MOV COM,#0A9H ;设置1/32占空比
LCALL PR0
LCALL PR3
MOV COM,#0A0H ;正向排序设置
LCALL PR0
LCALL PR3
MOV COM,#0C0H ;设置显示起始行为第一行
LCALL PR0
LCALL PR3
MOV COM,#0AFH ;开显示设置
LCALL PR0
LCALL PR3
RET
;-----------清屏程序
CLEAR: MOV R4,#00H ;页面地址暂存器设置
CLEAR1: MOV A,R4 ;取页地址值
ORL A,#0B8H ;"或"页面地址设置代码
MOV COM,A ;页面地址设置
LCALL PR0
LCALL PR3
MOV COM,#00H ;列地址设置为"0"
LCALL PR0
LCALL PR3
MOV R3,#50H ;一页清80个字节
CLEAR2: MOV DAT,#00H ;显示数据为"0"
LCALL PR1
LCALL PR4
DJNZ R3,CLEAR2 ;页内字节清零循环
INC R4
CJNE R4,#04H,CLEAR1 ;RAM区清零循环
RET
;--------------写指令代码子程序(E1)
PR0: CLR A0 ;AO=0
SETB R_W ;R_W=1
PR01: MOV P1,#0FFH ;P1口置"1"
SETB E1 ;E1=1
MOV A,P1 ;读状态字
CLR E1 ;E1=0
JB ACC.7,PR01 ;判"忙"标志为"0",否再读
CLR R_W ;R_W=0
MOV P1,COM ;写指令代码
SETB E1 ;E1=1
CLR E1 ;E1=0
RET
;-------------写显示数据子程序(E1)
PR1: CLR A0 ;A0=0
SETB R_W ;R_W=1
PR11: MOV P1,#0FFH ;P1口置"1"
SETB E1 ;E1=1
MOV A,P1 ;读状态字
CLR E1 ;E1=0
JB ACC.7,PR11 ;判"忙"标志为"0"否,否再读
SETB A0 ;A0=1
CLR R_W ;R_W=0
MOV P1,DAT ;写数据
SETB E1 ;E1=1
CLR E1 ;E1=0
RET
;-------------读显示数据子程序(E1)
PR2: CLR A0 ;A0 =0
SETB R_W ;R_W=1
PR21: MOV P1,#0FFH ;P1口置"1"
SETB E1 ;E1=1
MOV A,P1 ;读状态字
CLR E1 ;E1=0
JB ACC.7,PR21 ;判"忙"标志为"0"否,否再读
SETB A0 ;A0=1
MOV P1, #0FFH ;P1口置"1"
SETB E1 ;E1=1
MOV DAT,P1 ;读数据
CLR E1 ;E1=0
RET
;--------------写指令代码子程序(E2)
PR3: CLR A0 ;A0 =0
SETB R_W ;R_W=1
PR31: MOV P1,#0FFH ;P1口置"1"
SETB E2 ;E1=1
MOV A,P1 ;读状态字
CLR E2 ;E1=0
JB ACC.7,PR31 ;判"忙"标志为"0",否再读
CLR R_W ;R_W=0
MOV P1,COM ;写指令代码
SETB E2 ;E1=1
CLR E2 ;E1=0
RET
;-------------写显示数据子程序(E2)
PR4: CLR A0 ;A0=0
SETB R_W ;R_W=1
PR41: MOV P1,#0FFH ;P1口置"1"
SETB E2 ;E1=1
MOV A,P1 ;读状态字
CLR E2 ;E1=0
JB ACC.7,PR41 ;判"忙"标志为"0"否,否再读
SETB A0 ;A0=1
CLR R_W ;R_W=0
MOV P1,DAT ;写数据
SETB E2 ;E1=1
CLR E2 ;E1=0
RET
;-------------读显示数据子程序(E2)
PR5: CLR A0 ;A0 =0
SETB R_W ;R_W=1
PR51: MOV P1,#0FFH ;P1口置"1"
SETB E2 ;E2=1
MOV A,P1 ;读状态字
CLR E2 ;E2=0
JB ACC.7,PR51 ;判"忙"标志为"0"否,否再读
SETB A0 ;A0=1
MOV P1, #0FFH ;P1口置"1"
SETB E2 ;E2=1
MOV DAT,P1 ;读数据
CLR E2 ;E2=0
RET
;-------------中文显示子程序
CCW_PR: MOV DPTR,#CCTAB ;确定字符字模块首地址
MOV A,CODE_ ;取代码
MOV B,#20H ;字模块宽度为 32个字节
MUL AB ;代码×32
ADD A,DPL ;字符字模块首地址
MOV DPL,A ;=字模库首地址+代码×32
MOV A,B
ADDC A,DPH
MOV DPH,A
PUSH COLUMN ;列地址入栈
PUSH COLUMN ;列地址入栈
MOV CODE_,#00H ;代码寄存器借用为间址寄存器
CCW_1: MOV COUNT,#10H ;计数器设置为 16
MOV A,PAGE_ ;读页地址寄存器
ANL A,#03H
ORL A,#0B8H ;"或"页地址设置代码
MOV COM,A ;写页地址设置指令
LCALL PR0
LCALL PR3
POP COLUMN ;取到地址值
MOV A,COLUMN ;读列地址寄存器
CLR C
SUBB A,#PD1 ;列地址一模块参数
JC CCW_2 ;<0为左半屏显示区域(E1)
MOV COLUMN,A ;≥0为右半屏显示区域(E2)
MOV A,PAGE_
SETB ACC.3 ;设置区域标志位。
MOV PAGE_,A ;"0"为E1,"1"为E2
CCW_2: MOV COM,COLUMN ;设置列地址值
MOV A,PAGE_ ;判区域标志以确定设置哪个控制器
JNB ACC.3,CCW_3
LCALL PR3 ;区域E2
LJMP CCW_4
CCW_3: LCALL PR0 ;区域E1
CCW_4: MOV A,CODE_ ;取间址寄存器值
MOVC A,@A+DPTR ;取汉字字模数据
MOV DAT,A ;写数据
MOV A,PAGE_
JNB ACC.3,CCW_5
LCALL PR4 ;区域E2
LJMP CCW_6
CCW_5: LCALL PR1 ;区域E1
CCW_6: INC CODE_ ;间址寄存器加一
INC COLUMN ;列地址寄存器加一
MOV A,COLUMN ;判列地址是否超出区域范围
CJNE A,#PD1,CCW_7
CCW_7: JC CCW_8 ;未超出则继续
MOV A,PAGE_ ;超出则判是否在区域E2
JB ACC.3,CCW_8 ;在区域E2则退出
SETB ACC.3 ;在区域E1则修改成区域E2
MOV PAGE_,A
MOV COM,#00H ;设置区域E2列地址为"0"
LCALL PR3
CCW_8: DJNZ COUNT,CCW_4 ;当页循环
MOV A,PAGE_ ;读页地址寄存器
JB ACC.7,CCW_9 ;判完成标志D7位,"1"则完成退出
INC A ;否则页地址加一
SETB ACC.7 ;置完成位为"1"
CLR ACC.3
MOV PAGE_,A
MOV CODE_,#10H ;间址寄存器设置为 16
LJMP CCW_1 ;大循环
CCW_9: RET
;-------------中文字符库-----------------
CCTAB:
DB 000H,040H,042H,042H,042H,042H,042H,0FEH ;天
DB 042H,042H,042H,042H,042H,042H,040H,000H
DB 000H,080H,040H,020H,010H,008H,006H,001H
DB 002H,004H,008H,010H,030H,060H,020H,000H
DB 000H,040H,042H,042H,042H,042H,042H,0FEH ;天
DB 042H,042H,042H,042H,042H,042H,040H,000H
DB 000H,080H,040H,020H,010H,008H,006H,001H
DB 002H,004H,008H,010H,030H,060H,020H,000H
DB 024H,038H,0E0H,03FH,0E8H,024H,026H,012H ;辉
DB 0D2H,03EH,0D2H,012H,012H,016H,002H,000H
DB 040H,030H,00FH,000H,03FH,010H,008H,009H
DB 009H,009H,0FFH,009H,009H,009H,008H,000H
DB 080H,060H,000H,0FFH,010H,008H,07CH,054H ;煌
DB 056H,055H,054H,054H,054H,07CH,000H,000H
DB 040H,030H,00EH,003H,004H,038H,025H,025H
DB 025H,03FH,025H,025H,025H,035H,020H,000H
DB 000H,040H,042H,042H,042H,042H,042H,0FEH ;天
DB 042H,042H,042H,042H,042H,042H,040H,000H
DB 000H,080H,040H,020H,010H,008H,006H,001H
DB 002H,004H,008H,010H,030H,060H,020H,000H
DB 080H,060H,000H,0FFH,010H,008H,07CH,054H ;煌
DB 056H,055H,054H,054H,054H,07CH,000H,000H
DB 040H,030H,00EH,003H,004H,038H,025H,025H
DB 025H,03FH,025H,025H,025H,035H,020H,000H
DB 010H,014H,094H,0D4H,0BFH,094H,09CH,014H ;教
DB 050H,0F8H,00FH,008H,088H,078H,008H,000H
DB 009H,009H,048H,088H,07EH,005H,044H,044H
DB 020H,020H,013H,00CH,033H,0C0H,040H,000H
DB 040H,020H,0F0H,00CH,003H,000H,038H,0C0H ;仪
DB 001H,00EH,004H,0E0H,01CH,000H,000H,000H
DB 000H,000H,0FFH,000H,040H,040H,020H,010H
DB 00BH,004H,00BH,010H,020H,060H,020H,000H
DB 00H,40H,42H,44H,5CH,0C8H,40H,7FH,40H,0C0H,50H,4EH,44H,60H,40H,00H ;光
DB 00H,80H,40H,20H,18H,07H,00H,00H,00H,3FH,40H,40H,40H,40H,78H,00H
DB 24H,38H,0E0H,3FH,0E8H,24H,26H,12H,0D2H,3EH,0D2H,12H,12H,16H,02H,00H ;辉
DB 40H,30H,0FH,00H,3FH,10H,08H,09H,09H,09H,0FFH,09H,09H,09H,08H,00H
DB 00H,00H,1EH,10H,90H,0F0H,90H,9FH,90H,90H,90H,90H,9EH,00H,00H,00H ;岁
DB 00H,84H,82H,41H,40H,22H,2CH,10H,10H,08H,04H,03H,00H,00H,00H,00H
DB 00H,00H,00H,00H,00H,0FFH,11H,11H,11H,11H,11H,0FFH,00H,00H,00H,00H ;月
DB 00H,40H,20H,10H,0CH,03H,01H,01H,01H,21H,41H,3FH,00H,00H,00H,00H
;----------------中文演示显示程序段
MAIN:
LCALL INIT
LCALL CLEAR
MOV PAGE_,#00H
MOV COLUMN,#00H
MOV CODE_,#00H
LCALL CCW_PR
MOV PAGE_,#00H
MOV COLUMN,#10H
MOV CODE_,#01H
LCALL CCW_PR
MOV PAGE_,#00H
MOV COLUMN,#20H
MOV CODE_,#02H
LCALL CCW_PR
MOV PAGE_,#00H
MOV COLUMN,#30H
MOV CODE_,#03H
LCALL CCW_PR
MOV PAGE_,#02H
MOV COLUMN,#3AH
MOV CODE_,#04H
LCALL CCW_PR
MOV PAGE_,#02H
MOV COLUMN,#4AH
MOV CODE_,#05H
LCALL CCW_PR
MOV PAGE_, #02H
MOV COLUMN,#5AH
MOV CODE_,#06H
LCALL CCW_PR
MOV PAGE_,#02H
MOV COLUMN,#6AH
MOV CODE_,#07H
LCALL CCW_PR
; SJMP $
;LCALL S_DOWN
LCALL S_UP
SJMP $
;--------滚动演示程序段 ------------
; 定时间隔地有规律地修改显示起始行地址,将产生显
;示画面平滑向上或向下滚动的效果。示例程序如下:
S_UP: MOV R7,#00H ;向上改动程序
S_UP1: MOV A,#0C0H ;显示起始行设置代码
ORL A,R7
MOV COM,A
LCALL PR0
LCALL PR3
LCALL DELAY ;调延时子程序
INC R7
CJNE R7,#20H,S_UP1
LJMP S_UP
;--------------------
S_DOWN: MOV R7,#1FH ;向下滚动程序
MOV COM,#0C0H ;显示起始行设置代码
LCALL PR0
LCALL PR3
LCALL DELAY
S_DOWNI: MOV A,#0C0H ;显示起始行设置代码
ORL A,R7
MOV COM,A
LCALL PR0
LCALL PR3
LCALL DELAY
DJNZ R7,S_DOWNI
LJMP S_DOWN
;-----------------------------------------
DELAY: MOV R6,#00H ;延时子程序
MOV R5,#00H
DELAY1: NOP
DJNZ R5,DELAY1
DJNZ R6,DELAY1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -