📄 demo.asm
字号:
; 演示程序DEMO
; 该程序可以作为各子程序调用示例,也可以作为程序段使用
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN: MOV SP,#60H
ANL P1,#0E3H ; 间接控制方式初始化RS=R/W=E=0
; 以下是在文本显示方式运行
; LCALL TEXTINT ; 调文本初始化子程序
; 初始化程序调用完成后, 调节液晶驱动电源的电位器, 显示画面将显示出因显
; 示RAM 的随机数据而呈现的随机内容. 这可以作为检查模块与计算机接口电路
; 及其驱动程序的正确性.
LCALL CLEAR ; 清显示RAM
; LJMP DISTEXT ; 文本显示演示程序段
; LJMP BLINK ; 文本光标闪烁演示程序段
; LJMP READRAM ; 读显示数据程序段
; 以下是在图形显示方式运行
LCALL GRAPHINT ; 调图形初始化子程序
LJMP DISCHA ; 显示汉字程序段
; LJMP DRAW ; 绘制线显示程序段
; LJMP WIPE ; 清除线显示程序段
; LJMP SCROLL ; 滚动演示程序段(可与DISCHA联合使用)
;
; 文本形式方式下的字符形式的操作演示程序
; 在程序中涉及到光标指针的设置方法, 字符组写入程序, 读显示数据操作和一
; 个字符写入的程序. 并在显示效果可以观察到底线光标和块状光标的显示效果.
DISTEXT: MOV O_XL,#00H ; 设置列坐标为00
MOV O_YL,#00H ; 设置行坐标为00
SETB CFLUG ; 设置字符写入初次方式
MOV DPTR,#CTAB
MOV R2,#00H
MOV COUNT1,#1AH ; 写入字符个数为26
LOOP: MOV A,R2
MOVC A,@A+DPTR
MOV CODE,A
LCALL CW_PR ; 调写入西文字符组子程序
INC R2
CLR CFLUG
DJNZ COUNT1,LOOP
SJMP $
;;
; 关光标开闪烁设置, 观察块状光标的显示效果.
BLINK: MOV COM,#00H ; 方式设置指令
LCALL PR1
MOV DAT1,#38H ; 开闪烁关光标
LCALL PR2
SJMP $
;;
; 读数据示例程序段
READRAM: MOV O_XL,#00H ; 设置列坐标地址为00
MOV O_YL,#00H ; 设置行坐标地址为00
LCALL DD_PR
SJMP $
; 西文字符表
CTAB: DB 53H,75H,70H,70H,6FH,72H,74H,20H,54H,45H,4CH,3AH
DB 20H,30H,31H,30H,2DH,36H,32H,37H,38H,30H,38H,36H,36H
;;
; 该子程序使用了单字节的汉字代码寄存器, 所以只能建立256 种汉字库. 如果
; 使用时不能满足要求, 则要扩展为双字节汉字代码寄存器. 那时仅修改子程序
; 的前九条指令(计算汉字字模首地址)即可. 汉字显示演示程序如下:
DISCHA: MOV O_XL,#00H
MOV O_YL,#00H
MOV CODE,#00H
LCALL CCW_PR
MOV O_XL,#02H
MOV O_YL,#08H
MOV CODE,#01H
LCALL CCW_PR
MOV O_XL,#04H
MOV O_YL,#10H
MOV CODE,#02H
LCALL CCW_PR
MOV O_XL,#06H
MOV O_YL,#18H
MOV CODE,#03H
LCALL CCW_PR
SJMP $
;-------------- 汉字库 -----------------------------------
CCTAB: DB 000H,040H,037H,010H,083H,060H,02FH,008H ; 清
DB 013H,012H,063H,022H,023H,022H,022H,022H
DB 040H,048H,0FCH,040H,0F8H,040H,0FEH,000H
DB 0F8H,008H,0F8H,008H,0F8H,008H,028H,010H
DB 001H,041H,027H,021H,01FH,004H,0E2H,02FH ; 达
DB 021H,02FH,021H,03FH,021H,051H,08FH,000H
DB 000H,000H,0E0H,000H,0F0H,020H,040H,0F0H
DB 000H,0E0H,000H,0F8H,000H,000H,0FEH,000H
DB 001H,021H,011H,009H,009H,001H,0FFH,004H ; 光
DB 004H,004H,004H,008H,008H,010H,020H,040H
DB 000H,008H,00CH,010H,020H,004H,0FEH,040H
DB 040H,040H,040H,040H,042H,042H,03EH,000H
DB 01FH,041H,07FH,081H,03DH,001H,03DH,001H ; 电
DB 03FH,021H,03FH,021H,03FH,001H,001H,001H
DB 0F0H,004H,0FEH,002H,074H,000H,070H,000H
DB 0F8H,008H,0F8H,008H,0F8H,002H,002H,0FEH
; 绘图演示程序段
; 从(0,0)→(64,64)→(128,0)→(192,64)→(256,0)→(320,64)绘制折线
DRAW: MOV R2,#00H ; 列坐标=0
MOV R3,#00H
MOV R4,#00H ; 行坐标=0
MOV R5,#63 ; 循环量=64
LOOP1: MOV O_XL,R2 ; 设置列坐标
MOV O_XH,R3
MOV O_YL,R4 ; 设置行坐标
LCALL S_DOT ; 调绘点子程序
MOV A,R2 ; 列坐标加一
ADD A,#01H
MOV R2,A
MOV A,R3
ADDC A,#00H
MOV R3,A
INC R4 ; 行坐标加一
DJNZ R5,LOOP1 ; 循环
LOOP2: MOV O_XL,R2 ; 设置列坐标
MOV O_XH,R3
MOV O_YL,R4 ; 设置行坐标
LCALL S_DOT ; 调绘点子程序
MOV A,R2 ; 列坐标加一
ADD A,#01H
MOV R2,A
MOV A,R3
ADDC A,#00H
MOV R3,A
DJNZ R4,LOOP2 ; 行坐标减一, 循环
MOV R5,#63 ; 循环量=64
LOOP3: MOV O_XL,R2 ; 设置列坐标
MOV O_XH,R3
MOV O_YL,R4 ; 设置行坐标
LCALL S_DOT ; 调绘点子程序
MOV A,R2 ; 列坐标加一
ADD A,#01H
MOV R2,A
MOV A,R3
ADDC A,#00H
MOV R3,A
INC R4 ; 行坐标加一
DJNZ R5,LOOP3 ; 循环
LOOP4: MOV O_XL,R2 ; 设置列坐标
MOV O_XH,R3
MOV O_YL,R4 ; 设置行坐标
LCALL S_DOT ; 调绘点子程序
MOV A,R2 ; 列坐标加一
ADD A,#01H
MOV R2,A
MOV A,R3
ADDC A,#00H
MOV R3,A
DJNZ R4,LOOP4 ; 行坐标减一, 循环
MOV R5,#63 ; 循环量=64
LOOP5: MOV O_XL,R2 ; 设置列坐标
MOV O_XH,R3
MOV O_YL,R4 ; 设置行坐标
LCALL S_DOT ; 调绘点子程序
MOV A,R2 ; 列坐标加一
ADD A,#01H
MOV R2,A
MOV A,R3
ADDC A,#00H
MOV R3,A
INC R4 ; 行坐标加一
DJNZ R5,LOOP5 ; 循环
SJMP $
; 从(0,0)→(64,64)→(128,0)→(192,64)→(256,0)→(320,64)消除折线
WIPE: MOV R2,#00H ; 列坐标=0
MOV R3,#00H
MOV R4,#00H ; 行坐标=0
MOV R5,#63 ; 循环量=64
LOOP6: MOV O_XL,R2 ; 设置列坐标
MOV O_XH,R3
MOV O_YL,R4 ; 设置行坐标
LCALL C_DOT ; 调消点子程序
MOV A,R2 ; 列坐标加一
ADD A,#01H
MOV R2,A
MOV A,R3
ADDC A,#00H
MOV R3,A
INC R4 ; 行坐标加一
DJNZ R5,LOOP6 ; 循环
LOOP7: MOV O_XL,R2 ; 设置列坐标
MOV O_XH,R3
MOV O_YL,R4 ; 设置行坐标
LCALL C_DOT ; 调消点子程序
MOV A,R2 ; 列坐标加一
ADD A,#01H
MOV R2,A
MOV A,R3
ADDC A,#00H
MOV R3,A
DJNZ R4,LOOP7 ; 行坐标减一, 循环
MOV R5,#63
LOOP8: MOV O_XL,R2 ; 设置列坐标
MOV O_XH,R3
MOV O_YL,R4 ; 设置行坐标
LCALL C_DOT ; 调消点子程序
MOV A,R2 ; 列坐标加一
ADD A,#01H
MOV R2,A
MOV A,R3
ADDC A,#00H
MOV R3,A
INC R4 ; 行坐标加一
DJNZ R5,LOOP8 ; 循环
LOOP9: MOV O_XL,R2 ; 设置列坐标
MOV O_XH,R3
MOV O_YL,R4 ; 设置行坐标
LCALL C_DOT ; 调消点子程序
MOV A,R2 ; 列坐标加一
ADD A,#01H
MOV R2,A
MOV A,R3
ADDC A,#00H
MOV R3,A
DJNZ R4,LOOP9 ; 行坐标减一, 循环
MOV R5,#63
LOOPA: MOV O_XL,R2 ; 设置列坐标
MOV O_XH,R3
MOV O_YL,R4 ; 设置行坐标
LCALL C_DOT ; 调消点子程序
MOV A,R2 ; 列坐标加一
ADD A,#01H
MOV R2,A
MOV A,R3
ADDC A,#00H
MOV R3,A
INC R4 ; 行坐标加一
DJNZ R5,LOOPA ; 循环
SJMP $
;;
; 滚动演示程序
; 定时间定间距地修改显示起始地址将产生显示画面的平滑滚动. 在文本显示方
; 式下, 滚动是以字符位为单位的. 向左和向右滚动是以一个字符(字节)为单位;
; 向上和向下滚动也是以一字符行为单位的. 在图形显示方式下, 向左和向右滚
; 动是以 8点为(一字节)单位, 向上和向下滚动则是以一点行为单位的. 这里仅
; 提供向上和向下滚动的演示程序. 程序如下:
SADL EQU 32H
SADH EQU 33H
SCROLL: MOV SADL,#00H ; 设置显示起始地址=0000H
MOV SADH,#00H
MOV COUNT1,#64 ; 设置计数器=8
; 向上滚动
SCRU: MOV COM,#08H ; 设置显示起始地址
LCALL PR1
MOV DAT1,SADL
LCALL PR2
MOV COM,#09H
LCALL PR1
MOV DAT1,SADH
LCALL PR2
MOV A,SADL ; 显示起始地址加显示域宽度
ADD A,#PARA1 ; (依实际而定)
MOV SADL,A
MOV A,SADH
ADDC A,#00H
MOV SADH,A
LCALL DELAY ; 调延时子程序
DJNZ COUNT1,SCRU ; 循环
LCALL DELAY
MOV COUNT1,#64 ; 设置计数器=8
; 向下滚动
SCRD: MOV COM,#08H ; 设置显示起始地址
LCALL PR1
MOV DAT1,SADL
LCALL PR2
MOV COM,#09H
LCALL PR1
MOV DAT1,SADH
LCALL PR2
CLR C ; 显示起始地址减显示域宽度
MOV A,SADL
SUBB A,#PARA1 ; (依实际而定)
MOV SADL,A
MOV A,SADH
SUBB A,#00H
MOV SADH,A
LCALL DELAY ; 调延时子程序
DJNZ COUNT1,SCRD ; 循环
SJMP $
;;
; 延时子程序
DELAY: MOV R3,#00H
MOV R4,#00H
DELAY1: NOP
DJNZ R3,DELAY1
DJNZ R4,DELAY1
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -