;89C51 T6963 间接控制方式 P1.0-P1.7 -----D0-D7
; P3.2-----------C/D 控制/数据
; P3.3-----------/WR 写
; P3.4-----------/RD 读
; GND------------/CE 片选
; VCC---R_4K7-----/RESET,/HALT 复位
; GND------------FG,GND 框架地,地
; R_10K------- Vadj 亮度调节器中心点
; DMF5001N-----1_FG;2_GND;3_VCC;4_Vadj;5_Vee;6_/WR;7_/RD;8_/CS;9_C/D;10/HALT;11_RSET;
; 12,19------D0,D7 ;20 NC ; 21,22----LED OR EL
ORG 0000H
CD EQU P3.2 ; 通道选择信号
W_R EQU P3.3 ; 写操作信号
R_D EQU P3.4 ; 读操作信号
DAT1 EQU 30H ;
DAT2 EQU 31H ;
COM EQU 32H ;
;测试程序
;该程序为通用测试程序,在240×128规模以内的液晶显示模块都适合。程序使用8031
;汇编语言,接口电路和相应的驱动子程序见上一、二节,初始化程序见三节。
MAIN: MOV R6,#50H ;----------------------------
MOV R7,#00H ;
DELY1: NOP
DJNZ R7,DELY1
DJNZ R6,DELY1 ; 上电延时
MOV SP,#60H ;设堆栈
ORL P3,#1CH ;间接控制方式用 (P3.4=1,P3.3=1,P3.2=1)
TEST: LCALL INT ;调用初始化程序---------------------
MOV DAT1,#00H ;设置显示RAM 首地址
MOV DAT2,#00H
MOV COM,#24H
LCALL PR1
MOV R3,#00 ;设置循环量
MOV R4,#20H ;------------------------------
MOV COM,#0B0H ;设置自动写方式
LCALL PR12
TEST1: LCALL ST3 ;判状态位S2
MOV A,#00H ;置数据"0A" ;---------------------
LCALL PR13 ;写入数据
DJNZ R3, TEST1 ;循环
DJNZ R4, TEST1
MOV COM,#0B2H ;设置自动写结束指令
LCALL PR12
MOV COUNT ,#33 ;
LCALL CGRAM ; 建立CGRAM子程序(地址设定在代码为80H起处)
KKK: LCALL WEN_BEN_1 ; 调用文本方式显示汉字子程序1-------------
LCALL YAN_SHI ;
LCALL WEN_BEN_2 ; 调用文本方式显示汉字子程序2-------------
LCALL YAN_SHI ;
AJMP KKK ; 循环
;该程序执行完毕后,屏上应该满屏显示竖道,同时竖道的左下角有一点,即每8
;行“****”(即图形数据0FH,“”表示空)和“/”(字符代码0FH)的合成
;显示效果。
;************ 读壮态子程序 ******************************
R_ST: MOV P1,#0FFH ; P1口置高
SETB CD ; CD=1
CLR R_D ; /RD=0
MOV A,P1 ; 读壮态
SETB R_D ; RD=1
RET ;
;**************************************************************
;(1) 判状态位STA1,STA0子程序(读写指令和读写数据状态),在写指令的读
; 数据之前这两个标志位必须同时为“1”。
ST01: LCALL R_ST ;
JNB ACC.0, ST01 ;
JNB ACC.1, ST01 ;
RET
;**************************************************************
;(2) 判状态位STA2子程序(数据自动读状态),该位在数据自动读操作过程中
;STA0和STA1有效。在连续读过程中每读一次之前都要确认STA2=1。
ST2: LCALL R_ST ;
JNB ACC.2,ST2 ;
RET
;**************************************************************
;(3) 判状态位STA3子程序(数据自动写状态)
ST3: LCALL R_ST ;
JNB ACC.3,ST3
RET
;**************************************************************
;(4) 判状态位STA6子程序(屏读/屏拷贝状态)
ST6: LCALL R_ST
JB ACC.6,ERR
RET
ERR: LJMP ST6 ; 出错处理程序
;**************************************************************
;间接控制方式是MPU通过I/O并行接口,按照模拟模块时序的方式,间接实现
;对液晶显示模块的控制。根据液晶显示模块的需要,并行接口需要一个11位并行接口
;由上图所示。8031的P1口作为数据总线。P3口中3位作为读、写及寄存器选择信号。
;对于只用于液晶显示模块的电路,/CE信号接地就行了。MPU通过并行接口管理液晶
;显示模块,要对其时序关系有一个清楚的了解,并在程序中应明确地反映出来。间接
;控制方式的基本程序如下:
;有关标志位的子程序可以直接调用直接访问方式中的ST01,ST2,ST3和ST6等子序。
;**************************************************************
; 写指令和写数据子程序
PR1: LCALL ST01 ; 双字节参数指令写入入口
MOV A,DAT1 ; 取第一参数单元数据
LCALL PR13 ; 写入参数
PR11: LCALL ST01 ; 单字节参数指令写入入口
MOV A, DAT2 ; 取第二参数单元数据
LCALL PR13 ; 写入参数
PR12: LCALL ST01 ; 无参数指令写入入口
MOV A, COM ; 取指令代码单元数据
LJMP PR14 ; 写入指令代码
PR13: CLR CD ; C/D=0/数据写入入口
PR14: MOV P1,A ; 设置数据
CLR W_R ; /WR=0
NOP ;------------
SETB W_R ; /WR=1
; SETB CD ;---------------
RET
;**************************************************************
;3、读数据子程序
PR2: LCALL ST01 ; 判状态位
CLR CD ; C/D=0
MOV P1,#0FFH ; P1口置"1"
CLR R_D ; /RD=0
MOV A,P1 ; 读取数据
SETB R_D ; /RD=1
MOV DAT2,A ; 数据存入第二参数/数据单元
RET
;**************************************************************
;初始化程序
; 该程序以240×128点阵的液晶显示模块为例。
INT: MOV DAT1,#00H ;设置文本显示区域首地址 1000H
MOV DAT2,#10H ;-----------------
MOV COM,#40H
LCALL PR1
MOV DAT1,#20H ;设置文本显示区域宽度-------------------
MOV DAT2,#00H ;即一行显示所占字节数
MOV COM,#41H
LCALL PR1
MOV DAT1,#00H ;设置图形显示区域首地址
MOV DAT2,#08H ;或为文本属性区域首地址 -------------------
MOV COM,#42H
LCALL PR1
MOV DAT1,#20H ;设置图形显示区域宽度 -----------------
MOV DAT2,#00H ;或为文本属性区域宽度
MOV COM,#43H ;即一行显示所占字节数
LCALL PR1
MOV COM,#0A7H ;光标形状设置
LCALL PR12
MOV COM,#88H ;显示方式设置,逻辑“或”合成 ------------
LCALL PR12
MOV COM,#97H ;显示开关设置 -------------------
LCALL PR12
RET
;**************************************************************
; 建立CGRAM子程序(地址设定在代码为80H起处)
; 该程序是在内部CGROM有效时建立CGRAM的子程序,所以使用的字符代码是从80H开始的。
; 子程序有一个参数为COUNT,它用于设置写入8*8点阵字符的字模的个数。如果是汉字字模,
; 那么一个汉字字模就需要4个8*8点阵字符字模组合。子程序如下:
COUNT EQU 33H ;西文字符(8*8点阵)个数
CGRAM: MOV DAT1,#00H ; 设置偏移地址------------
MOV DAT2,#00H ;
MOV COM,#22H ;
LCALL PR1
MOV DAT1,#00H ;设置存储器地址指针---------------
MOV DAT2,#00H---------------------------------
MOV COM,24H
LCALL PR1
MOV COM,#0B0H ;设置自动写方式
LCALL PR12
MOV A,COUNT ;计算写入的字节数
MOV B,#08H
MUL AB
MOV COUNT,A ;计算器低8位数据
INC B ;计算器高8位数据
MOV DPTR,#CGTAB ;取字符库首地址
PUSH DPH ;存字符库指针
PUSH DPL
CGRAM1: LCALL ST3 ;判自动写状态位
POP DPL ;取字符库指针
POP DPH
CLR A
MOVC A,@A+DPTR ;取数据
INC DPTR ;字符库指针加一
PUSH DPH ;存字符库指针
PUSH DPL
LCALL PR13 ;写入数据
DJNZ COUNT,CGRAM1 ;计数循环
DJNZ B,CGRAM1
MOV COM,#0B2H ;写入结束自动写指令
LCALL PR12
POP ACC ;修正栈指针
POP ACC
RET
;*********************************************************************************
;示例四:汉字写入子程序(文本方式)
; 在本文方式下显式汉字,首先要建立汉字CGRAM(如上一例所示)要定义汉字代码。
; 在文本方式下写汉字需要写入4个代码以组成一个汉字,子程序如下:
CODE_1 EQU 34H ;
O_Y EQU 35H ; Y
O_X EQU 36H ; X
; -------------------------------------------------------
WRI_CT:
MOV A,O_Y ; 计算显示RAM地址
MOV B, #20H
MUL AB
ADD A, O_X
MOV O_X, A
MOV DAT1, A
MOV A, B
ADDC A, #10H ; 文本显示区首地址为1000H----------------
MOV O_Y, A
MOV DAT2, A ; 设置显示RAM地址
MOV COM, #24H
LCALL PR1
MOV A, CODE_1 ; 取汉字代码
MOV DAT2, A ; 写入左上半部汉字代码
MOV COM, #0C0H
LCALL PR11
MOV A, CODE_1
ADD A, #02H
MOV DAT2, A ; 写入右上半部汉字代码
LCALL PR11
MOV A, #20H ; 显示RAM地址修正
ADD A, O_X
MOV DAT1, A
CLR A
ADDC A, O_Y
MOV DAT2, A
MOV COM, #24H ; 设置显示RAM地址
LCALL PR1
MOV A, CODE_1
INC A
MOV DAT2, A ; 写入左下半部汉字代码
MOV COM, #0C0H
LCALL PR11
MOV A, CODE_1
ADD A, #03H
MOV DAT2, A ; 写入右下半部汉字代码
LCALL PR11
RET
;**************************************************************
;文本方式下汉字显示演示程序1:
WEN_BEN_1:
;------------------------------------------
MOV CODE_1, #01H
MOV O_X,#00H
MOV O_Y, #00H
LCALL WRI_CT
;--------------------------------------
MOV CODE_1, #05H
MOV O_X, #02H
MOV O_Y, #00H
LCALL WRI_CT
;------------------------------------
MOV CODE_1, #09H
MOV O_X,#04H
MOV O_Y, #00H
LCALL WRI_CT
;-------------------------------------
MOV CODE_1, #0DH
MOV O_X,#06H
MOV O_Y, #00H
LCALL WRI_CT
;------------------------------------------
MOV CODE_1, #11H
MOV O_X,#08H
MOV O_Y, #00H
LCALL WRI_CT
;--------------------------------------
MOV CODE_1, #15H
MOV O_X, #0AH
MOV O_Y, #00H
LCALL WRI_CT
;------------------------------------
MOV CODE_1, #19H
MOV O_X,#0CH
MOV O_Y, #00H
LCALL WRI_CT
;-------------------------------------
MOV CODE_1, #1DH
MOV O_X,#0EH
MOV O_Y, #00H
LCALL WRI_CT
RET
;************************************************************************
;文本方式下汉字显示演示程序2:
WEN_BEN_2:
;------------------------------------------
MOV CODE_1, #01H
MOV O_X,#00H
MOV O_Y, #04H
LCALL WRI_CT
;--------------------------------------
MOV CODE_1, #05H
MOV O_X, #02H
MOV O_Y, #04H
LCALL WRI_CT
;------------------------------------
MOV CODE_1, #09H
MOV O_X,#04H
MOV O_Y, #04H
LCALL WRI_CT
;-------------------------------------
MOV CODE_1, #0DH
MOV O_X,#06H
MOV O_Y, #04H
LCALL WRI_CT
;------------------------------------------
MOV CODE_1, #11H
MOV O_X,#08H
MOV O_Y, #04H
LCALL WRI_CT
;--------------------------------------
MOV CODE_1, #15H
MOV O_X, #0AH
MOV O_Y, #04H
LCALL WRI_CT
;------------------------------------
MOV CODE_1, #19H
MOV O_X,#0CH
MOV O_Y, #04H
LCALL WRI_CT
;-------------------------------------
MOV CODE_1, #1DH
MOV O_X,#0EH
MOV O_Y, #04H
LCALL WRI_CT
RET
;************************************************************************
; 示例五 汉字写入子程序(图形方式)
; 在图形方式下显示汉字是比较常用的方式。汉字库作在程序区内,按排序定义各汉字的代码。
; 写入汉字字模如同写入图形数据一般,在里提供单字节汉字代码使用的汉字写入子程序。
;CODE EQU 33H ; 汉字字符代码
;O_Y EQU 35H ; Y坐标(0_127)
;O_X EQU 36H ; X坐标(0_29)
;COUNT EQU 38H ; 计数器
WRI_CC: MOV A, O_Y ; 计算图形显示RAM地址
MOV B, #20H ; 地址显示区宽度为20H
MUL AB
ADD A, O_X
MOV O_X, A
MOV A, B
ADDC A, #08H ; 图形显示区首地址为0800H
MOV O_Y, A
MOV DPTR, #CGTAB ; 计算汉字库字符首地址
MOV A, CODE_1
MOV B, #20H
MUL AB
ADD A, DPL
MOV DPL, A
MOV A, B
ADDC A, DPH
MOV DPH, A
PUSH DPH ; 存字库地址指针
PUSH DPL
MOV COUNT, #10H ; 计数器设置为16次
WRI_CC1: MOV DAT1, O_X ; 设置显示RAM地址
MOV DAT2, O_Y
MOV COM, #24H
LCALL PR1
LCALL PR1
POP DPL ; 取字库地址指针
POP DPH
CLR A
MOVC A, @A+DPTR ; 取左部字模数据
MOV DAT2, A ; 设置数据
MOV A, #10H ; 偏置地址为16
MOVC A, @A+DPTR ; 取右部字模数据
MOV DAT1, A ; 暂存数据
INC DPTR ; 字库地址指针加一
PUSH DPH ; 存字库地址指针
PUSH DPL
MOV COM, #0C0H ; 设置一次写数据指令代码
LCALL PR11 ; 写入数据
MOV DAT2, DAT1 ; 设置右部数据
LCALL PR11 ; 写入数据
MOV A, #20H ; 显示RAM地址修正
ADD A, O_X
MOV O_X, A
CLR A
ADDC A, O_Y
MOV O_Y, A
DJNZ COUNT, WRI_CC1 ; 计数器循环
POP ACC ; 修正栈指针
POP ACC
RET
;----------------------------------------------------------------------------------
; 汉字库
CGTAB: DB 00H, 000H, 000H, 000H, 000H, 000H, 000H, 000H; 0--骗过CGRAM第一单元,否则全屏幕花屏
DB 00H, 040H, 037H, 010H, 083H, 060H, 02FH, 008H; "清"代码为01H
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; "华"代码为05H
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
DB 004H, 0FFH, 005H, 041H, 033H, 014H, 001H, 0F6H; "蓬"代码为09H
DB 01BH, 010H, 013H, 010H, 017H, 010H, 028H, 047H
DB 044H, 0FEH, 040H, 0F8H, 010H, 0E0H, 018H, 046H
DB 0F8H, 040H, 0F8H, 040H, 0FCH, 040H, 046H, 0FCH
DB 000H, 043H, 030H, 010H, 000H, 007H, 0F1H, 011H; "远"代码为0DH
DB 011H, 011H, 012H, 012H, 014H, 028H, 047H, 000H
DB 010H, 0F8H, 000H, 000H, 008H, 0FCH, 020H, 020H
DB 020H, 024H, 024H, 01CH, 000H, 006H, 0FCH, 000H
DB 00H, 040H, 037H, 010H, 083H, 060H, 02FH, 008H; "清"代码为11H
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; "华"代码为15H
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
DB 004H, 0FFH, 005H, 041H, 033H, 014H, 001H, 0F6H; "蓬"代码为19H
DB 01BH, 010H, 013H, 010H, 017H, 010H, 028H, 047H
DB 044H, 0FEH, 040H, 0F8H, 010H, 0E0H, 018H, 046H
DB 0F8H, 040H, 0F8H, 040H, 0FCH, 040H, 046H, 0FCH
DB 000H, 043H, 030H, 010H, 000H, 007H, 0F1H, 011H; "远"代码为1DH
DB 011H, 011H, 012H, 012H, 014H, 028H, 047H, 000H
DB 010H, 0F8H, 000H, 000H, 008H, 0FCH, 020H, 020H
DB 020H, 024H, 024H, 01CH, 000H, 006H, 0FCH, 000H
; 注:这里提供的汉字字模数据表是应用清华蓬远公司提供的汉字字模提取程序PICKZB,EXE建立的,
; 汉字字模排列格式为第1?6字节为汉字左半部分自上而下排列的字模数据,
; 第17?2字节为汉字右半部分自上而下排列的字模数据。
; 图形方式下汉字显示演示程序:
MOV CODE_1 , #00H
MOV O_X, #00H
MOV O_Y, #00H
LCALL WRI_CC
MOV CODE_1, #01H
MOV O_X, #03H
MOV O_Y, #00H
LCALL WRI_CC
MOV CODE_1, #02H
MOV O_X, #06H
MOV O_Y, #00H
LCALL WRI_CC
MOV CODE_1, #03H
MOV O_X, #09H
MOV O_Y, #00H
LCALL WRI_CC
; 示例六 西文字符写入子程序(文本属性显示方式的应用)
; 非文本属性显示方式的西文字符写入非常简单,先设置显示地址指针(24H),
; 再写入字符代码即可。所以这里就不再举例说明了,可以取WRI_C程序的前15条指令作为参考。
; 该程序使用了字符代码和字符显示属性两个参数。将图形显示区域作为文本属性区。
; 在写入字符代码后将字符的属性参数写入相应的属性区内。
;CODE EQU 33H ; 字符代码
ATTR EQU 37H ; 字符属性码(低4位有效)
;O_Y EQU 35H ;Y坐标(0_15)
;O_X EQU 36H ; X坐标(0_29)
WRI_C: MOV A, O_Y ; 计算文本显示RAM地址
MOV B, #20H ; 文本显示区宽度为20H
MUL AB
ADD A, O_X
MOV DAT1, A
MOV A, B
ADDC A, #00H
MOV DAT2, A
PUSH ACC ; 存地址的高8位
MOV COM, #24H ;设置地址指针
LCALL PR1
MOV DAT2, CODE_1 ;写入字符代码
MOV COM, #0C4H
LCALL PR11
POP ACC ;取地址的高8位
ADD A, #08H ;计算相应的属性区RAM地址
MOV DAT2, A
MOV COM, #24H ;设置地址指针
LCALL PR1
MOV DAT2, ATTR ;写入属性参数
MOV COM, #0C4H
LCALL PR11
RET
; ---------------------------------------------------------------------
; 文本属性方式设置程序段
MOV COM, #84H ;设置文本属性显示方式
LCALL PR12
MOV COM, #9FH ;开文本,图形显示及光标闪烁显示
LCALL PR12
;-----------------------------------------------------------------------------
;文本属性方式显示演示程序段
MOV DAT1, #0EH ;文本光标位置设置
MOV DAT2, #01H
MOV COM, #21H
LCALL PR1
MOV R1, #00H ;设置属性寄存器=0
LOOPA: MOV R2, #00H ;设置表间址寄存器=0
MOV R3, #00H ;设置显示X坐标寄存器=0
MOV R4, #01H ;设置显示Y坐标寄存器=1
LOOPB: MOV A, R2
MOV DPTR, #DTAB
MOVC A, @A+DPTR
MOV CODE_1, A ;置字符代码
MOV ATTR, R1 ;置字符属性值
MOV O_X, R3 ;置X坐标
MOV O_Y, R4 ;置Y坐标
LCALL WRI_C ;调子程序
INC R2
INC R3
MOV A, R2
CJNE A, #11, LOOPB
LCALL DELAY
INC R1
LJMP LOOPA
DELAY: MOV R5, #00H
MOV R6, #00H
DELAY1: NOP
DJNZ R5, DELAY1
DJNZ R6, DELAY1
RET
DTAB: DB 37H, 45H, 4CH, 43H, 4FH, 4DH, 45H
DB 00H, 39H, 4FH, 55H; "Welcome you"
; 该演示程序有光标位置设置的程序段。字符属性参数在软件特性中已给出,
; 这里将该参数从0到FH循环设置一遍,使用者可以从中了解参数值的特性。
; 参数与显示效果为:
; 00A~02H, 07H 正向显示
;03H 禁止显示(白)
;04H, 06H 禁止显示(黑)
;05H 负向显示
;08H~0AH, 0FH 正向闪烁显示
;0BH 禁止显示(白)
;0CH, 0EH 禁止显示(黑)
;0DH 负向闪烁显示
; 示例七 绘点程序
; 利用T6960C的位操作指令,可以很简单的设置点或清除点。
; 这样使作图或作曲线简单化了。程序的关键点在于点地址的计算上。子程序如下:
;O_Y EQU 35H ;Y(0_127)/D7
;D7=1; D7=0
;O_X EQU 36H ;X(0_239)
WRI_D: MOV A, O_Y ;RAM
CLR ACC. 7
MOV B, #20H ;20H
MUL AB
MOV DAT1, A
MOV DAT2, B
MOV A, O_X ;
MOV B, #08H
DIV AB ;B
ADD A, DAT1
MOV DAT1, A
MOV A, #08H ;
ADDC A, DAT2
MOV DAT2, A
MOV COM, #24H ;RAM
LCALL PR1
MOV A, B ;
CPL A
ANL A, #07H
XCH A, O_Y ;
SWAP A
ANL A, #08H
ORL A, #0F0H ;
ORL A,O_Y ;
MOV COM, A ;
LCALL PR12
RET
; (0,0)→(80,80)→(160,0)→(240,80)
MOV R2, #00H ;X=0
MOV R3, #00H ;Y=0
MOV R4, #50H ;
LOOP1: MOV A, R2
MOV O_X, A ;X
MOV A, R3
SETB ACC.7 ;
MOV O_Y, A ;Y
LCALL WRI_D ;
INC R2 ;X
INC R3 ;Y
DJNZ R4, LOOP1 ;
DEC R3 ;Y
DEC R3
LOOP2: MOV A, R2
MOV O_X, A
MOV A, R3
SETB ACC. 7
MOV O_Y, A
LCALL WRI_D
INC R2 ;X
DJNZ R3, LOOP2 ;
MOV R4,#50H ;
LOOP3: MOV A, R2
MOV O_X, A
MOV A, R3
SETB ACC.7
;************************************************
YAN_SHI: MOV R4,#07FH ;
KK2: MOV R5,#0FFH ;
KK1: MOV R6,#0FFH ;
DJNZ R6,$ ;
DJNZ R5, KK1 ;
DJNZ R4, KK2 ;
RET ;
;**************************************************
END
一周热门 更多>