📄 lcdled.asm
字号:
XPOS DATA 50H ;列方向地址指针
YPOS DATA 51H ;行方向地址指针
;
CS2 EQU 0200H ;P2.1
CS1 EQU 0400H ;P2.2
CS EQU 8000H ;P2.7
RW EQU 0800H ;P2.3
RS EQU 0100H ;P2.0
;
SER BIT P1.4
SCLR BIT P1.5
SRCLK BIT P1.6
RCK BIT P1.7
REGA DATA 30H
REGB DATA 31H
REGC DATA 32H
REGD DATA 33H
REGE DATA 34H
ORG 0000H
AJMP LCD
ORG 0030H
;
;******************************************************************************************
;
; /*LCD液晶显示实验*/
;
;******************************************************************************************
;
LCD: MOV SP,#60H
CALL LCDRESET ;复位
MOV A,#00H
CALL LCDFILL ;空格填充整屏
MOV XPOS,#00H ;设置页
MOV YPOS,#00H ;设置列
MOV DPTR,#STRING1 ;字符串首地址
MOV REGD,DPL
MOV REGE,DPH
LCD1: CALL PUTSTR
AJMP LCD1
;
;*****************************************************************************
; /* 显示字符子程序 */
;*****************************************************************************
PUTSTR: CALL LCDRESET ;复位
; CALL LCDELAY ;延时
CALL GETADDR ;取要显示字符的地址
PUSH DPL
PUSH DPH
JNB B.7,PSRE ;判断是中文还是英文
CALL HZKPOS
CALL PUTCHARDOT ;显示中文
CALL PUTCHARDOT
JMP PSR1
PSRE: CALL HZKPOS ;显示英文
CALL PUTCHARDOT
PSR1: POP DPH
POP DPL
RET
;
;*****************************************************************************
; /* 计算字符在库中的地址 */
;*****************************************************************************
;
HZKPOS: MOV R2,#5 ;32字节
HZKPOS1: CLR C
RLC A
MOV R0,A
MOV A,B
RLC A
MOV B,A
MOV A,R0
DJNZ R2,HZKPOS1
MOV DPTR,#HZKDOT
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
RET
;
;*****************************************************************************
; /* 显示半个中文或一个英文子程序 */
;*****************************************************************************
;
PUTCHARDOT: MOV R7,#8
PAC_PA: CLR A
MOVC A,@A+DPTR ;取出字符
CALL LCDWRITE ;显示字符(上半段)
INC YPOS
INC DPTR
CLR A
MOVC A,@A+DPTR ;取出字符
CALL LCDWRITE ;显示字符(下半段)
DEC YPOS
INC DPTR
CALL CUSORNEXT
MOV A,XPOS
JNZ PAC_LAX
INC YPOS
PAC_LAX: DJNZ R7,PAC_PA
RET
;
;*****************************************************************************
; /* 调整行列指针 */
;*****************************************************************************
;
CUSORNEXT: ANL YPOS,#7
INC XPOS
MOV A,XPOS
JNB ACC.7,CNT_LAX
MOV XPOS,#0 ;满128列列指针赋初值
INC YPOS ;行指针加1
MOV A,YPOS
ANL A,#0F8H
JZ CNT_LAX
MOV YPOS,#0 ;满8行行指针赋初值
CNT_LAX: RET
;
;*****************************************************************************
; /* 取字符的地址 */
;*****************************************************************************
;
GETADDR: MOV DPL,REGD
MOV DPH,REGE
CLR A
MOVC A,@A+DPTR
INC DPTR
MOV B,A
INC A
JZ GETADDR1 ;取出的数据的为00转并清零标志位
CLR A
MOVC A,@A+DPTR
CJNE A,#0FFH,GETADDR2 ;检查是否是最后一个字符
CALL DELAY400MS
CALL DELAY400MS
CALL DELAY400MS
GETADDR1:
LJMP LED ;若是最后一个字符转到开始
; AJMP LCD
GETADDR2: INC DPTR
MOV REGD,DPL
MOV REGE,DPH
RET
;
;*****************************************************************************
; /* 定位并写数据子程序 */
;*****************************************************************************
;
LCDWRITE: CALL LCDPOS ;内部写数指针定位
CALL LCDWD ;写数据
RET
;
;*****************************************************************************
; /* 内部写数指针定位子程序*/
;*****************************************************************************
;
LCDPOS: PUSH ACC
MOV A,XPOS
JB ACC.6,LPOS1
MOV A,YPOS ;XPOS列方向小于64则对CS1操作
ANL A,#07H
ADD A,#0B8H
CALL LCDWC1 ;设页码
MOV A,XPOS
ANL A,#3FH
ADD A,#40H
CALL LCDWC1 ;设列码
AJMP LPOS2
LPOS1: MOV A,YPOS ;XPOS列方向大于等于64则对CS2操作
ANL A,#07H
ADD A,#0B8H
CALL LCDWC2 ;设页码
MOV A,XPOS
ANL A,#3FH
ORL A,#40H
CALL LCDWC2 ;设列码
LPOS2: POP ACC
RET
;
;*****************************************************************************
; /* 送数据子程序 */
;*****************************************************************************
;
LCDWD: MOV B,A
MOV A,XPOS
JB ACC.6,LWD1
MOV A,B ;XPOS列方向小于64则对CS1操作
CALL LCDWD1
JMP LWD2
LWD1: MOV A,B ;XPOS列方向大于等于64则对CS2操作
CALL LCDWD2
LWD2: RET
;
;*****************************************************************************
; /* LCD整屏显示A的内容 */
;*****************************************************************************
;
LCDFILL: MOV R7,A
MOV YPOS,#00H
LCDFILL1: MOV XPOS,#00H
LCDFILL2: MOV A,R7
CALL LCDWRITE ;定位并写数据
INC XPOS
MOV A,XPOS
CJNE A,#128,LCDFILL2 ;XPOS<128则循环(128列)
INC YPOS
MOV A,YPOS
CJNE A,#8,LCDFILL1 ;YPOS<8则循环(8页)
MOV XPOS,#0
MOV YPOS,#0
RET
;
;*****************************************************************************
; /* LCD控制器复位 */
;*****************************************************************************
;
LCDRESET: MOV A,#3FH ;打开LCD显示
CALL LCDWC1
CALL LCDWC2
MOV A,#0C0H ;设显示起始行
CALL LCDWC1
CALL LCDWC2
RET
;
;*****************************************************************************
; /* 送控制字子程序 */
;*****************************************************************************
;
LCDWC1: PUSH DPH
PUSH DPL
CALL WAITIDLE1
MOV DPTR,#CS+CS1 ;E=1 CS1=1 RS=0
MOVX @DPTR,A
POP DPL
POP DPH
RET
LCDWC2: PUSH DPH
PUSH DPL
CALL WAITIDLE2
MOV DPTR,#CS+CS2 ;E=1 CS2=1 RS=0
MOVX @DPTR,A
POP DPL
POP DPH
RET
;
;*****************************************************************************
; /* 写数据子程序 */
;*****************************************************************************
;
LCDWD1: PUSH DPH
PUSH DPL
CALL WAITIDLE1
MOV DPTR,#CS+CS1+RS ;E=1 CS1=1 RS=1
MOVX @DPTR,A
POP DPL
POP DPH
RET
;
LCDWD2: PUSH DPH
PUSH DPL
CALL WAITIDLE2
MOV DPTR,#CS+CS2+RS ;E=1 CS2=1 RS=1
MOVX @DPTR,A
POP DPL
POP DPH
RET
;
;*****************************************************************************
; /* 读数据子程序 */
;*****************************************************************************
;
LCDRD1: PUSH DPH
PUSH DPL
CALL WAITIDLE1
MOV DPTR,#CS+CS1+RS+RW ;E=1 CS1=1 RS=1
MOVX A,@DPTR
POP DPL
POP DPH
RET
;
LCDRD2: PUSH DPH
PUSH DPL
CALL WAITIDLE2
MOV DPTR,#CS+CS2+RS+RW ;E=1 CS2=1 RS=1
MOVX A,@DPTR
POP DPL
POP DPH
RET
;
;*****************************************************************************
; /* 检忙子程序 */
;*****************************************************************************
;
WAITIDLE1: PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#CS+CS1+RW ;E=1 CS2=1 RS=1
WT1_PA: MOVX A,@DPTR
JB ACC.7,WT1_PA
POP ACC
POP DPL
POP DPH
RET
;
WAITIDLE2: PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#CS+CS2+RW ;E=1 CS2=1 RS=1
WT2_PA: MOVX A,@DPTR
JB ACC.7,WT2_PA
POP ACC
POP DPL
POP DPH
RET
;
;*****************************************************************************
; /* 延时子程序 */
;*****************************************************************************
;
DELAY400MS: MOV R7,#20 ;400MS
DL4_PA: MOV R6,#100
DL4_PB: MOV R5,#100
DJNZ R5,$
DJNZ R6,DL4_PB
DJNZ R7,DL4_PA
RET
;
LCDELAY: MOV R6,#1
DLY_PA: MOV R5,#0
DLY_PB: MOV R4,#0
DJNZ R4,$
DJNZ R5,DLY_PB
DJNZ R6,DLY_PA
RET
;
;
;******************************************************************************************
;
; /*点阵LED滚动屏实验*/
;
;******************************************************************************************
;16X16LED汉字显示实验,移动显示“欢迎使用”
;列扫描由74LS154控制P1.0-P1.3对应154的A-D
;行扫描由74HC595移位控制
;P1.4-SER,P1.5-SCLR、P1.6-SRCLK,P1.7-RCK
;
LED:
; JB FLAGC,LED1
MOV REGC,#04H ;延时常数
MOV DPTR,#LEDTAB ;汉字表的位置
MOV REGA,DPL
MOV REGB,DPH
LED1: MOV DPL,REGA
MOV DPH,REGB
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -