📄 subprogram.asm
字号:
;SUBPROGRAM FOR LCD DISPLAY
;ASM FILE FOR LCD DISPLAY
;;;;.asm
; 直接访问方式地址定义,根据用户平台接口修改
;;WE MUST SHUOMING THAT THE CHINESECU AND THE CHARACTO CU MUST BUILD IN ASM FILES
;;必须说明中文字库埠?/和西文字库都要在汇编和文件中建立
CWADD1 EQU 0D000H ; 写指令代码地址
DWADD1 EQU 0D001H ; 写参数及显示数据地址
DRADD1 EQU 0D001H ; 读参数及显示数据地址
; 间接控制方式信号定义,根据用户平台接口修改
;//RS EQU P3.0 ; RS
;//RD EQU P3.1 ; /RD
;//WR EQU P3.2 ; /WR
;//DATBUS EQU P1 ; 数据总线
; 程序参数定义,根据用户选择的LCM型号修改
PARA1 EQU 0A0H ; 显示区域宽度
; 程序变量定义,根据用户平台提供的内部资源修改
COM EQU 50H ; 指令寄存器
DAT1 EQU 51H ; 参数及显示数据寄存器
COUNT1 EQU 52H ; 计数器1
COUNT2 EQU 53H ; 计数器2
O_XL EQU 54H ; X坐标低8位寄存器(字节)
; X坐标低8位寄存器(点列)
O_XH EQU 55H ; X坐标高8位寄存器(点列)
; D7位为绘点(D7=1)和消点(D7=0)标志位
O_YL EQU 56H ; Y坐标寄存器低8位(点行)
O_YH EQU 57H ; Y坐标寄存器高8位(点行)
CODEE EQU 58H ; 字符代码
GRAYB EQU 59H
; 00H-暗;01H-淡;
; 10H-深;11H-亮
GRAYH EQU 5AH ; 灰度数据寄存器高字节
GRAYL EQU 5BH ; 灰度数据寄存器低?
PUBLIC GRAYB
PUBLIC CLEAR,_ONEBYTE_PR,_CLCW_PR,_CL_DOT
PUBLIC _W_DOT,_CCW_PR,_CC24PR,_CW_PR,_CW_PRR,_CLCW_PRR
mypro segment code
rseg mypro ; 允许编译器重新定位
;=====汉字(16x16点阵)库===============================
; 根据北京清华蓬远科贸公司提供的软件PICKHZ.EXE建立字库
CCTAB: DB 000H,040H,037H,010H,083H,060H,02FH,008H;清
DB 013H,022H,0E3H,022H,023H,022H,022H,022H
DB 040H,048H,0FCH,040H,0F8H,040H,0FEH,008H
DB 0FCH,008H,0F8H,008H,0F8H,008H,028H,010H
DB 004H,004H,008H,008H,018H,029H,04AH,008H;华
DB 009H,001H,0FFH,001H,001H,001H,001H,001H
DB 040H,048H,058H,060H,0C0H,040H,044H,044H
DB 03CH,000H,0FEH,000H,000H,000H,000H,000H
; 汉字(24x24点阵)写入子程序
;=====汉字(24x24点阵)库===============================
; 根据北京清华蓬远科贸公司提供的软件PICKHZ.EXE建立字库
CCTAB24:DB 000H,000H,000H,07FH,000H,020H,018H,00CH;蓬
DB 00CH,008H,001H,00CH,07EH,00CH,00CH,00CH
DB 00CH,00DH,00CH,00CH,032H,061H,020H,000H
DB 082H,0E3H,0C3H,0FFH,0D3H,09AH,03FH,030H
DB 049H,087H,019H,064H,086H,07FH,006H,07FH
DB 006H,0FFH,006H,006H,004H,0FFH,0FFH,000H
DB 000H,080H,00CH,0FEH,000H,040H,0E0H,0C0H
DB 080H,000H,0FEH,078H,000H,0F0H,000H,0E0H
DB 000H,0F8H,000H,000H,000H,0FEH,0F8H,000H
DB 000H,018H,00CH,006H,006H,004H,000H,000H;远
DB 006H,07FH,006H,006H,006H,006H,006H,006H
DB 006H,006H,006H,006H,009H,030H,010H,000H
DB 000H,000H,03FH,000H,000H,000H,000H,0FFH
DB 019H,019H,019H,019H,019H,019H,019H,011H
DB 031H,021H,060H,0C0H,000H,0FFH,07FH,000H
DB 000H,060H,0F0H,000H,000H,000H,018H,0FCH
DB 080H,080H,080H,080H,080H,088H,088H,088H
DB 08CH,0FCH,0F8H,000H,000H,0FFH,0FCH,000H
; 汉字(24x24点阵)演示程序 callby
;DISCH24:MOV GRAYB,#4CH ;灰度值设置: 正向显示
; MOV O_XL,#0CH
; MOV O_YL,#20H
; MOV O_YH,#00H
; MOV CODEE,#00H
; LCALL _CC24PR
;;; MOV GRAYB,#0C4H ;灰度值设置: 负向显示
; MOV O_XL,#15H
; MOV O_YL,#38H
; MOV O_YH,#01H
; MOV CODEE,#01H
; LCALL _CC24PR
; SJMP $
; 绘图演示程序段 callby
;DRAW: MOV GRAYB,#0C0H ;有灰度的显示将把所有显示都分成相应的灰度等级
; MOV R2,#00H
; MOV R3,#00H
; MOV R4,#00H
; MOV R5,#00H
; LOOP1: MOV O_XL,R2
; MOV O_XH,R3
; MOV O_YL,R4
; MOV O_YH,R5
; LCALL _W_DOT
; MOV A,R2
; MOV R2,A
; MOV A,R3
; ADDC A,#00H
; MOV R3,A
; MOV A,R4
; ADD A,#01H
; MOV R4,A
; MOV A,R5
; ADDC A,#00H
; MOV R5,A
; CJNE A,#01H,LOOP1
; SJMP $
;----------------------------------callby----------------
;WIPE: MOV GRAYB,#00H
; MOV R2,#00H
; MOV R3,#80H
; MOV R4,#00H
; MOV R5,#00H
; LOOP2: MOV O_XL,R2
; MOV O_XH,R3
; MOV O_YL,R4
; MOV O_YH,R5
; LCALL _W_DOT
; MOV A,R2
; ADD A,#01H
; MOV R2,A
; MOV A,R3
; ADDC A,#00H
; MOV R3,A
; MOV A,R4
; ADD A,#01H
; MOV R4,A
; MOV A,R5
; ADDC A,#00H
; MOV R5,A
; CJNE A,#01H,LOOP2
; SJMP $
;;;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; 直接访问方式的驱动子程序
; 程序口地址设置CWADD1,DWADD1,DRADD1
; 占用内部资源DAT1,A,COM
; 程序输入变量: DAT1,,COM
;===============直接访问方式驱动子程序==================
; 写指令子程序 ////childprogram(7)
PR1: PUSH DPL
PUSH DPH
MOV DPTR,#CWADD1
MOV A,COM
MOVX @DPTR,A
POP DPH
POP DPL
RET
; 写数据子程序 childprogram(8)
PR2: PUSH DPL
PUSH DPH
MOV DPTR,#DWADD1
MOV A,DAT1
MOVX @DPTR,A
POP DPH
POP DPL
RET
; 读数据子程序 childprogram(9)
PR3: PUSH DPL
PUSH DPH
MOV DPTR,#DRADD1
MOVX A,@DPTR
MOV DAT1,A
POP DPH
POP DPL
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;======西文字符库==============================================
CHTAB: DB 000H,000H,000H,000H,000H,000H,000H,000H ;" "代码"0"
DB 004H,004H,004H,004H,000H,000H,004H,000H ; ! 代码"1"
DB 00AH,00AH,00AH,00AH,000H,000H,000H,000H ; " 代码"2"
DB 00AH,00AH,01FH,00AH,01FH,00AH,00AH,000H ; # 代码"3"
DB 004H,00FH,014H,00EH,005H,01EH,004H,000H ; $ 代码"4"
DB 018H,019H,002H,004H,008H,013H,003H,000H ; % 代码"5"
DB 00CH,012H,014H,008H,015H,012H,00DH,000H ; & 代码"6"
DB 00CH,004H,008H,000H,000H,000H,000H,000H ; ' 代码"7"
DB 002H,004H,008H,008H,008H,004H,002H,000H ; ( 代码"8"
DB 008H,004H,002H,002H,002H,004H,008H,000H ; ) 代码"9"
DB 000H,004H,015H,00EH,015H,004H,000H,000H ; * 代码"A"
DB 000H,004H,004H,01FH,004H,004H,000H,000H ; + 代码"B"
DB 000H,000H,000H,000H,00CH,004H,008H,000H ; , 代码"C"
DB 000H,000H,000H,01FH,000H,000H,000H,000H ; - 代码"D"
DB 000H,000H,000H,000H,000H,00CH,00CH,000H ; . 代码"E"
DB 000H,001H,002H,004H,008H,010H,000H,000H ; / 代码"F"
DB 00EH,011H,013H,015H,019H,011H,00EH,000H ; 0 代码"10"
DB 004H,00CH,004H,004H,004H,004H,00EH,000H ; 1 代码"11"
DB 00EH,011H,001H,002H,004H,008H,01FH,000H ; 2 代码"12"
DB 01FH,002H,004H,002H,001H,011H,00EH,000H ; 3 代码"13"
DB 002H,006H,00AH,012H,01FH,002H,002H,000H ; 4 代码"14"
DB 01FH,010H,01EH,001H,001H,011H,00EH,000H ; 5 代码"15"
DB 006H,008H,010H,01EH,011H,011H,00EH,000H ; 6 代码"16"
DB 01FH,001H,002H,004H,004H,004H,004H,000H ; 7 代码"17"
DB 00EH,011H,011H,00EH,011H,011H,00EH,000H ; 8 代码"18"
DB 00EH,011H,011H,00EH,001H,002H,00CH,000H ; 9 代码"19"
DB 000H,00CH,00CH,000H,00CH,00CH,000H,000H ; : 代码"1A"
DB 000H,00CH,00CH,000H,00CH,004H,008H,000H ; ; 代码"1B"
DB 002H,004H,008H,010H,008H,004H,002H,000H ; < 代码"1C"
DB 000H,000H,01FH,000H,01FH,000H,000H,000H ; = 代码"1D"
DB 008H,004H,002H,001H,002H,004H,008H,000H ; > 代码"1E"
DB 00EH,011H,001H,002H,004H,000H,004H,000H ; ? 代码"1F"
DB 00EH,011H,001H,00DH,015H,015H,00EH,000H ; @ 代码"20"
DB 00EH,011H,011H,011H,01FH,011H,011H,000H ; A 代码"21"
DB 01EH,009H,009H,00EH,009H,009H,01EH,000H ; B 代码"22"
DB 00EH,011H,010H,010H,010H,011H,00EH,000H ; C 代码"23"
DB 01EH,009H,009H,009H,009H,009H,01EH,000H ; D 代码"24"
DB 01FH,010H,010H,01FH,010H,010H,01FH,000H ; E 代码"25"
DB 01FH,010H,010H,01EH,010H,010H,010H,000H ; F 代码"26"
DB 00EH,011H,010H,013H,011H,011H,00FH,000H ; G 代码"27"
DB 011H,011H,011H,01FH,011H,011H,011H,000H ; H 代码"28"
DB 00EH,004H,004H,004H,004H,004H,00EH,000H ; I 代码"29"
DB 007H,002H,002H,002H,002H,012H,00CH,000H ; J 代码"2A"
DB 011H,012H,014H,018H,014H,012H,011H,000H ; K 代码"2B"
DB 010H,010H,010H,010H,010H,010H,01FH,000H ; L 代码"2C"
DB 011H,01BH,015H,011H,011H,011H,011H,000H ; M 代码"2D"
DB 011H,019H,019H,015H,013H,013H,011H,000H ; N 代码"2E"
DB 00EH,011H,011H,011H,011H,011H,00EH,000H ; O 代码"2F"
DB 01EH,011H,011H,01EH,010H,010H,010H,000H ; P 代码"30"
DB 00EH,011H,011H,011H,015H,012H,00BH,000H ; Q 代码"31"
DB 01EH,011H,011H,01EH,014H,012H,011H,000H ; R 代码"32"
DB 00EH,011H,010H,00EH,001H,011H,00EH,000H ; S 代码"33"
DB 01FH,004H,004H,004H,004H,004H,004H,000H ; T 代码"34"
DB 011H,011H,011H,011H,011H,011H,00EH,000H ; U 代码"35"
DB 011H,011H,011H,011H,011H,00AH,004H,000H ; V 代码"36"
DB 011H,011H,011H,015H,015H,01BH,011H,000H ; W 代码"37"
DB 011H,011H,00AH,004H,00AH,011H,011H,000H ; X 代码"38"
DB 011H,011H,011H,00AH,004H,004H,004H,000H ; Y 代码"39"
DB 01FH,001H,002H,004H,008H,010H,01FH,000H ; Z 代码"3A"
DB 00EH,008H,008H,008H,008H,008H,00EH,000H ; [ 代码"3B"
DB 000H,010H,008H,004H,002H,001H,000H,000H ; \ 代码"3C"
DB 00EH,002H,002H,002H,002H,002H,00EH,000H ; ] 代码"3D"
DB 004H,00AH,011H,000H,000H,000H,000H,000H ; ^ 代码"3E"
DB 000H,000H,000H,000H,000H,000H,01FH,000H ; _ 代码"3F"
DB 010H,008H,004H,000H,000H,000H,000H,000H ; ` 代码"40"
DB 000H,000H,00EH,001H,00FH,011H,00FH,000H ; a 代码"41"
DB 010H,010H,016H,019H,011H,011H,01EH,000H ; b 代码"42"
DB 000H,000H,00EH,011H,010H,011H,00EH,000H ; c 代码"43"
DB 001H,001H,00DH,013H,011H,011H,00FH,000H ; d 代码"44"
DB 000H,000H,00EH,011H,01FH,010H,00EH,000H ; e 代码"45"
DB 002H,005H,004H,00EH,004H,004H,004H,000H ; f 代码"46"
DB 000H,00DH,013H,013H,00DH,001H,00EH,000H ; g 代码"47"
DB 010H,010H,016H,019H,011H,011H,011H,000H ; h 代码"48"
DB 004H,000H,00CH,004H,004H,004H,00EH,000H ; i 代码"49"
DB 002H,000H,006H,002H,002H,012H,00CH,000H ; j 代码"4A"
DB 008H,008H,009H,00AH,00CH,00AH,009H,000H ; k 代码"4B"
DB 00CH,004H,004H,004H,004H,004H,00EH,000H ; l 代码"4C"
DB 000H,000H,01AH,015H,015H,015H,015H,000H ; m 代码"4D"
DB 000H,000H,016H,019H,011H,011H,011H,000H ; n 代码"4E"
DB 000H,000H,00EH,011H,011H,011H,00EH,000H ; o 代码"4F"
DB 000H,016H,019H,019H,016H,010H,010H,000H ; p 代码"50"
DB 000H,00DH,013H,013H,00DH,001H,001H,000H ; q 代码"51"
DB 000H,000H,016H,019H,010H,010H,010H,000H ; r 代码"52"
DB 000H,000H,00FH,010H,01EH,001H,01FH,000H ; s 代码"53"
DB 008H,008H,01CH,008H,008H,009H,006H,000H ; t 代码"54"
DB 000H,000H,012H,012H,012H,012H,00DH,000H ; u 代码"55"
DB 000H,000H,011H,011H,011H,00AH,004H,000H ; v 代码"56"
DB 000H,000H,011H,011H,015H,015H,00AH,000H ; w 代码"57"
DB 000H,000H,011H,00AH,004H,00AH,011H,000H ; x 代码"58"
DB 000H,000H,011H,011H,013H,00DH,001H,00EH ; y 代码"59"
DB 000H,000H,01FH,002H,004H,008H,01FH,000H ; z 代码"5A"
DB 002H,004H,004H,008H,004H,004H,002H,000H ; { 代码"5B"
DB 002H,002H,002H,000H,002H,002H,002H,000H ; | 代码"5C"
DB 008H,004H,004H,002H,004H,004H,008H,000H ; } 代码"5D"
DB 008H,015H,002H,000H,000H,000H,000H,000H ; ~ 代码"5E"
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH ;" "代码"5F"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 灰度生成子程序(字节)GRAYt m childprogram//(6)//
; 占用内部资源:GRAYB,GRAYH,GRAYL,COUNT2,A
; 内部调用子程序:PR2
; 程序调用入口: GRAY
; 程序输入变量:GRAYB
; 灰度生成子程序(字节)如下:
_GRAY: ; MOV GRAYB,R7 ;用两个字节来描述一个字节的内容这一个字节的数据,1代表前景数据,0代表背景数据,但是
;MOV A,R6 ;前景数据是分等级的我们一定要注意这一点,这里似乎又是堆栈内存空间的不足造成了这样
;MOV GRAYB,#0CH ;的无法预知的错误
MOV GRAYH,#00H ; 灰度寄存器清零
MOV GRAYL,#00H
MOV COUNT2,#08H
GRAY1: RLC A ; 取数据位
PUSH ACC ; 存数据
MOV A,GRAYB ; 取灰度寄存器,首先得到前景和后景的灰度的等级.
JC GRAY3 ; 判数据位是否为"0" ,这一个跳转上选择显示前景还是显示后景
MOV C,ACC.3 ; 为"1" 取前景灰度数据
XCH A,GRAYL ; 生成灰度数据,前景和背景形成反差和0,1形成反差是一样的道理
RLC A
XCH A,GRAYL ;GRAYH<-GRAY_L 也就是说两个变量全部加入移位的过程,C位的隐含的使用
XCH A,GRAYH
RLC A
XCH A,GRAYH
MOV C,ACC.2 ; 取前景灰度数据
XCH A,GRAYL
RLC A
XCH A,GRAYL
XCH A,GRAYH
RLC A
XCH A,GRAYH
GRAY2: POP ACC ; 取数据
DJNZ COUNT2,GRAY1 ; 计数器计数
MOV DAT1,GRAYH ; 数据写入显示RAM
LCALL PR2
MOV DAT1,GRAYL ; 已经设好地址而后才写入数据.
LCALL PR2
RET
GRAY3: MOV C,ACC.7 ; 为"0"取背景灰度数据
XCH A,GRAYL ; 生成灰度数据
RLC A
XCH A,GRAYL
XCH A,GRAYH
RLC A
XCH A,GRAYH
MOV C,ACC.6 ; 取背景灰度数据
XCH A,GRAYL
RLC A
XCH A,GRAYL
XCH A,GRAYH
RLC A
XCH A,GRAYH
LJMP GRAY2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 汉字写入子程序(16*16点阵字库)CCW_PR childprogra (5)m
; 占用内部资源:O_XL,O_YL,O_YH,CODE,COUNT1,A,B,DPTR
; 内部调用子程序:PR1,PR2,GRAY
; 连接字库: CCTAB
; 程序参数: PARA1
; 程序调用入口: CCW_PR
; 程序输入变量: O_XL,O_YL,O_YH,CODE ,之所以O_XL只用一个字节是因为横向是以字节为单位的640*480横向也就是60个字节
; 汉字写入子程序如下: 基本的过程就是首先计算地址而后取字模的数据
_CCW_PR: MOV A,R7 ;注意参数的传递的顺序奇数是低字节,而偶数是高字节
MOV O_XL,A
MOV A,R5
MOV O_YL,A
MOV A,R4
MOV O_YH,A
MOV A,R3
MOV CODEE,A
MOV COUNT1,#00H ; 计数器=0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -