; 说明:在文件中定义了LCD操作地址,左半屏的写命令操作地址为2004H,写
; 数据操作地址为2005H,右半屏的写命令操作地址为2000H,写数据操
; 作地址为2001H.
; 在DP-51ProC上连线:连接A2区A15~A10插孔至A3区G2B、G2A、G1、C、B、A插孔;
; 连接A3区/Y0插孔至B3区/CS插孔;
; 连接A2区A0,A1,A2,P10插孔至B3区A0,A1,A2,RST插孔;
;**********************************************************************/
;**********************************************************************/
;控制位和端口
LCD_RST BIT P1.0 ;LCD复位控制,低电平复位
LCD_LS_CMD EQU 2004H ;左(前)半屏的写命令操作地址
LCD_LS_DAT EQU 2005H ;左(前)半屏的写数据操作地址
LCD_RS_CMD EQU 2000H ;右(后)半屏的写命令操作地址
LCD_RS_DAT EQU 2001H ;右(后)半屏的写数据操作地址
;控制命令字
LCM_DISPON EQU 3FH ;显示开
LCM_DISPOFF EQU 3EH ;显示关
LCM_STARTROW EQU 0C0H ;显示起始行0,可以用LCM_STARTROW+x设置起始行。(x<64)
LCM_ADDRSTRY EQU 0B8H ;页起始地址,可以用LCM_ADDRSTRY+x设置当前页(即行)。(x<8)
LCM_ADDRSTRX EQU 40H ;列起始地址,可以用LCM_ADDRSTRY+x设置当前列(即更)。(x<64)
;数据定义
DisRAM XDATA 0C000H ;显示RAM起始地址,64*8*2=1024字节,仿真器RAM起始地址
DisBuf DATA 22H ;34D 8字节显示缓冲区 每行显示16个ASCII字符
DPH1 DATA 32H ;50D 暂存DPH单元
DPL1 DATA 2BH ;43D 暂存DPL单元
;**********************************************************************/
ORG 8000H
ljmp START
ORG 8100H
START: mov SP,#4FH ;堆栈从50H开始
// mov TMOD,#01H ;T0选择方式一的定时
// mov TH0,#0FCH ;1ms定时周期
// mov TL0,#066H
// setb ET0
// setb TR0
;初始化显示
lcall RST_LCD ;复位液晶屏
lcall Clr_DisRAM
lcall DisRAM2LCD
mov DPTR,#LCD_LS_CMD
mov A,#LCM_DISPON
movx @DPTR,A
mov A,#LCM_STARTROW
movx @DPTR,A
mov DPTR,#LCD_RS_CMD
mov A,#LCM_DISPON
movx @DPTR,A
mov A,#LCM_STARTROW
movx @DPTR,A
;User自定义显示内容
mov R7,#1 ;R7确定字符起始横坐标
mov R6,#0 ;R6=0 第一行
mov DisBuf,#1 ;
mov DisBuf+1,#2 ;
mov DisBuf+2,#3 ;
mov DisBuf+3,#4 ;
mov DisBuf+4,#5 ;
mov DisBuf+5,#6 ;
mov DisBuf+6,#7 ;
mov DisBuf+7,#8 ;
mov DisBuf+8,#9 ;
mov DisBuf+9,#0 ;结束标志
lcall Display
mov R7,#1
mov R6,#1 ;R6=1 第二行
mov DisBuf,#2 ;
mov DisBuf+1,#10 ;
mov DisBuf+2,#11 ;
mov DisBuf+3,#12 ;
mov DisBuf+4,#13 ;
mov DisBuf+5,#14 ;
mov DisBuf+6,#15 ;
mov DisBuf+7,#16 ;
mov DisBuf+8,#0 ;结束标志
lcall Display
mov R7,#1
mov R6,#2 ;第三行
mov DisBuf,#8 ;
mov DisBuf+1,#'"' ;
mov DisBuf+2,#'{' ;
mov DisBuf+3,#'`' ;
mov DisBuf+4,#30 ;
mov DisBuf+5,#31 ;
mov DisBuf+6,#0 ;结束标志
lcall Display
mov R7,#1
mov R6,#3 ;第四行
mov DisBuf,#4 ;
mov DisBuf+1,#5 ;
mov DisBuf+2,#7 ;
mov DisBuf+3,#1 ;
mov DisBuf+4,#3 ;
mov DisBuf+5,#6 ;
mov DisBuf+6,#37
mov DisBuf+7,#12
mov DisBuf+8,#0 ;结束标志
lcall Display
lcall DisRAM2LCD
setb P3.2
jb P3.2,$
ljmp Start
;子程序名:Display
;功能:把Disbuf中的文字编码查表显示点阵数据,送DisRAM显示缓冲区
;入口参数:Disbuf 字符编码 ,R7:X,水平位置(0~15) R6:y,垂直位置(0~3)
;占用资源:A,B,DPTR,R0,R7,R6,A,4字节堆栈
Display: push ACC
push B
push PSW
;计算每行输出显示的DisRAM起始地址;
mov A,R7
anl A,#07H
mov R7,A
mov A,R6
anl A,#03H
mov R6,A
mov DPTR,#DisRAM
mov A,DPH
add A,R6 ;R6;y 显示行坐标 y=0~3 最多显示四行 16*4 =64
mov DPH,A
mov A,R7 ;R7:x 显示列坐标,x=0~15 ,16列 16*8=128
mov B,#8
mul AB
mov DPL,A
mov R0,DPL ;暂存堆栈
mov R2,DPH ;DPTR-->R2R0 每次写入DisRAM起始地址
mov R1,#DisBuf
NextChr:
mov A,@R1
jz DisOver
dec A
mov B,#16
mul AB
mov DPTR,#DisCode
add A,DPL
mov DPL,A
mov A,B
addc A,DPH
mov DPH,A ;DPTR-->汉字点阵
mov R5,#8 ;上半个汉字点阵
clr A
Dis_1: movc A,@A+DPTR
mov P2,R2 ;从R2取出保存的DisRAM地址高8位
movx @R0,A
inc R0
mov A,R0
jnz S128
inc R2
S128: clr A
inc DPTR
djnz R5,Dis_1
mov R5,#8 ;下半个字符点阵
mov A,R0 ;R0--->A
add A,#128-8 ;液晶每行128点
mov R0,A
jnc B128
inc R2
B128: clr A
Dis_2: movc A,@A+DPTR
mov P2,R2 ;从R2取出保存的DisRAM地址高8位
movx @R0,A
inc R0
mov A,R0
jnz S1281
inc R2
S1281: clr A
inc DPTR
djnz R5,Dis_2
inc R1
mov A,R0
clr C
subb A,#128 ;液晶每行128点
mov R0,A
jnc $+3
dec R2
ajmp NextChr
DisOver:
pop PSW
pop B
pop ACC
ret
;子程序名:DisRAM2LCD
;功能:显示缓冲区DisRAM数据输出到LCD的显示RAM
;占用资源:DPTR,A ,P2,R0,R6,R7
DisRAM2LCD: mov R7,#0
mov DPTR,#DisRAM
NextPage:
mov P2,#HIGH(LCD_LS_CMD) ;P2+R0-->LCD左半屏命令端口
mov R0,#LOW(LCD_LS_CMD)
mov A,#LCM_ADDRSTRY ;设置页起始行
add A,R7
movx @R0,A
mov P2,#HIGH(LCD_RS_CMD) ;P2+R0-->LCD右半屏命令端口
mov R0,#LOW(LCD_RS_CMD)
movx @R0,A
mov P2,#HIGH(LCD_LS_CMD) ;P2+R0-->LCD左半屏命令端口
mov R0,#LOW(LCD_LS_CMD)
mov A,#LCM_ADDRSTRX ;设置列起始行
movx @R0,A
mov P2,#HIGH(LCD_RS_CMD) ;P2+R0-->LCD右半屏命令端口
mov R0,#LOW(LCD_RS_CMD)
movx @R0,A
mov R6,#64
mov P2,#HIGH(LCD_LS_DAT) ;P2+R0-->LCD左半屏数据端口
mov R0,#LOW(LCD_LS_DAT)
NextDat1: ;连续左半屏写入64字节 一行128/2 一页
movx A,@DPTR
movx @R0,A
inc DPTR
djnz R6,NextDat1
mov R6,#64
mov P2,#HIGH(LCD_RS_DAT);P2+R0-->LCD左半屏数据端口
mov R0,#LOW(LCD_RS_DAT)
NextDat2: ;连续右半屏写入64字节 一页
movx A,@DPTR
movx @R0,A
inc DPTR
djnz R6,NextDat2
inc R7
cjne R7,#8,$+3
jc NextPage ;<8 转移
ret ;>=8 8页(1024字节)已经传送完
;延时子程序
;子程序名:Delay
;功能:延时 1000 ms
;占用资源:R3,R4,R5
Delay: mov R3,#20
Del1: mov R4,#200
Del2: mov R5,#123
nop
Del3: djnz R5,Del3
djnz R4,Del2
djnz R3,Del1 ret
;复位LCD子程序
;子程序名:RST_LCD
;功能:复位LCD,在RST引脚加低电平
;占用资源:R3,R4,R5
RST_LCD: clr LCD_RST
lcall Delay
setb LCD_RST
ret
;清零DisRAM
;子程序名:Clr_DisRAM
;功能:清零DisRAM
;占用资源:DPTR,R7,R6,A
Clr_DisRAM: push PSW
push ACC
push DPL
push DPH
mov R7,#8
clr A
mov DPTR,#DisRAM
Next_C: mov R6,#128
Next_Clr: movx @DPTR,A
inc DPTR
djnz R6,Next_Clr
djnz R7,Next_C
pop DPH
pop DPL
pop ACC
pop PSW
ret
DisCode:#include“1.txt”
END |