📄 液晶程序.txt
字号:
;**********************************************************
;R2用于存放键盘的键值。R5-R6用于延时设置。R5还用于光标的移位设置
;
;
W_C_GLCD XDATA 8000H;8000H
W_D_GLCD XDATA 8200H;8001H
R_B_GLCD XDATA 8100H;8002H
R_D_GLCD XDATA 8300H;8003H
;===================================================
KEY DATA 30H
N DATA 31H ;行数变量
ADDR DATA 32H ;起始的显示位置
X DATA 33H
Y DATA 34H
POS DATA 35H
MOVE_UP DATA 36H
MOVE_DN DATA 37H
UP_DOWN DATA 38H
MODENUM DATA 39H ;方式总数量减1
MODEFLAG DATA 3AH ;方式:00-AM,01-FM,02-ASK,03-FSK,04-PSK,05-DPSK,06-QPSK,07-OQPSK08-DQPSK
MODEFLAG1 DATA 3BH ;用于暂存方式的变量
FRSH DATA 3CH ;源
FRSL DATA 3DH
FRDH DATA 3EH ;目标
FRDL DATA 3FH
FR00 DATA 40H ;存储输入的频率,
FR01 DATA 41H
FR02 DATA 42H
FR03 DATA 43H
FR04 DATA 44H
FR10 DATA 45H ;暂存频率变量
FR11 DATA 46H
FR12 DATA 47H
FR13 DATA 48H
FR14 DATA 49H
;FR15 DATA 4AH
INFPOS DATA 4AH ;输入频率指示
NOWKEY DATA 4BH
DELO DATA 4CH ;延时外层循环
DELI DATA 4DH ;延时内层循环
RRLONG DATA 4EH ;低位将要去掉的长度
USENUM DATA 4FH ;相位累加器的高段有效数
ACC0 DATA 50H
ACC1 DATA 51H
FRDATA0 DATA 52H
FRDATA1 DATA 53H
FR05 DATA 54H
FR06 DATA 55H
INFPOS1 DATA 56H
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV SP,#60h ;设置堆栈 ,sp总是初始化到内部RAM地址07。
;也可以改SP值,从而改变堆栈的位置
LCALL INITIAL_GLCD ;调用LCD初试化
LCALL DELAY
CH_BUSY:
MOV DPTR,#8100H
MOVX A,@DPTR
ANL A,#80H
JNZ CH_BUSY
MOV DPTR,#8000H
MOV A,#80H
MOVX @DPTR,A
LCALL DELAY
MOV DPTR,#HANG
MOV A,#00H
MOVC A,@A+DPTR
MOV DPTR,#8200H
MOVX @DPTR,A
LCALL DELAY
MOV DPTR,#HANG
MOV A,#01H
MOVC A,@A+DPTR
MOV DPTR,#8200H
MOVX @DPTR,A
JMP $
HANG: DB "王"
;----------------------------------------------------------------------------
;光标移位控制,POS为移位数
CURSOR_MOVE:
PUSH A
MOV A,#02H ;光标回到第一行第一列
CALL COMMAND_GLCD
MOV A,POS
JZ END_MOVE
MOV R5,A
MOVE:
MOV A,#14H ;光标移到
CALL COMMAND_GLCD
DJNZ R5,MOVE
END_MOVE:
POP A
RET
;--------------------------------------------------------------------------
;显示汉字16X16点阵
DHZ: MOV B,N ; 显示数量
DHZ1: MOV A,ADDR;
ORL A,#80H ; 送显示地址
LCALL COMMAND_GLCD ; 调写命令子程序
DHZ2:
CLR A
MOVC A,@A+DPTR ; 查找汉字的高位码
INC DPTR
LCALL WRITE_GLCD ; 送显示
CLR A
MOVC A,@A+DPTR ; 查找汉字的低位码
INC DPTR
LCALL WRITE_GLCD ; 送显示
DJNZ B,DHZ2
RET
;---------------------------------------------------------
;***************************************************************
INITIAL_GLCD:
PUSH ACC
MOV DELO,#01H
MOV DELI,#0FH
MOV A,#30H ;功能设定
CALL COMMAND_GLCD
LCALL DELAY
MOV A,#30H ;功能设定
CALL COMMAND_GLCD
MOV A,#30H
LCALL DELAY ;功能设定
CALL COMMAND_GLCD
LCALL DELAY
MOV A,#06H ;显示器控制:游标不显示;但是字会闪烁
CALL COMMAND_GLCD
MOV A,#01H
LCALL DELAY;清除显示器
CALL COMMAND_GLCD
MOV A,#0FH ;进入模式设定
CALL COMMAND_GLCD
POP ACC
RET
;----------------------------------------------------------------------------
;检查LCD 忙碌标志
CHKBUSY_GLCD:
PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#R_B_GLCD
CHK: MOVX A,@DPTR
JB ACC.7,CHK ;判别是不是忙?
POP ACC
POP DPL
POP DPH
RET
;---------------------------------------------------------------
;写命令到 GLCD
COMMAND_GLCD:
PUSH DPH
PUSH DPL
CALL CHKBUSY_GLCD ;判别是不是忙?
MOV DPTR,#W_C_GLCD
MOVX @DPTR,A ;写入命令
POP DPL
POP DPH
RET
;---------------------------------------------------------------
;写资料到 GLCD
WRITE_GLCD:
PUSH DPH
PUSH DPL
CALL CHKBUSY_GLCD ;判别是不是忙?
MOV DPTR,#W_D_GLCD ;写入数据
MOVX @DPTR,A
POP DPL
POP DPH
RET
;清除 LCD 的显示幕
CLEAR_GLCD:
PUSH ACC
MOV A,#01H ;清除显示器
CALL COMMAND_GLCD
POP ACC
RET
;由此可计算出延时的总周期数N为:N=DELO*DELI*2+DELO*2+DELO*2+4=2*DELO*DELI+4*DELO+4
;延时的时间为:t=T*N,T为指令周期
DELAY: ;执行次数 周期个数
MOV R5,DELO ; 1 2
DELAY1:
MOV R6,DELI ; DELO 2
DELAY2:
DJNZ R6,DELAY2 ; DELO*DELI 2
DJNZ R5,DELAY1 ; DELO 2
RET ; 1 2
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -