📄 lcd初始化.inc
字号:
;LCD初始化程序--------------------------------------------------------------
lcd_ini:
;文本显示区域设置
mov lcd_data1,#00h;设置文本显示区域首地址
mov lcd_data2,#10h;(从显存10000h至1200h单元为为本显示区)
mov lcd_com_reg,#40h
lcall lcd_two_data_wr;调用写双字节参数指令子程序
mov lcd_data1,#20h;set文本显示区宽度
mov lcd_data2,#00h
mov lcd_com_reg,#41h;文本显示区宽度设置指令代码
lcall lcd_two_data_wr
;图形显示区域设置
mov lcd_data1,#00h;设置图形显示区域首地址
mov lcd_data2,#00h;(显存0000h-1000h单元为图形显示区域)
mov lcd_com_reg,#42h;图形显示区域首地址设置指令代码
lcall lcd_two_data_wr;调用写双字节参数指令子程序
mov lcd_data1,#20h;set图形显示区宽度
mov lcd_data2,#00h
mov lcd_com_reg,#43h;图形显示区宽度设置指令代码
lcall lcd_two_data_wr
;显示方式及显示开关设置
mov lcd_com_reg,#81h;显示方式设定
lcall lcd_not_data_wr;调用not data read-in program
mov lcd_com_reg,#9ch;显示开关设置(94为文本显示,98为图形显示,9c为文本+图形显示)
lcall lcd_not_data_wr;调用无参数写入子程序
;清除图形显示区域
mov lcd_data1,#00h
mov lcd_data2,#00h
mov lcd_com_reg,#24h;设置写入数据首地址(1000h)
lcall lcd_two_data_wr
lcall auto_write_set;设置自动写入方式
push 03h
push 04h
mov r3,#00h;设置循环量(共清除5120byte,其中文本显示区512byte,CGRAM区)
mov r4,#10h;34h
lcall lcd_not_data_wr;调用无参数写入子程序
clear_1: lcall st3;判断auto read-in 状态位
mov a,#00h;正常显示数据
jnb mirror_bit,clear_1a;判断是否进行反向显示
mov a,#0ffh;反向显示数据
clear_1a: lcall pr13;调用data read-in program
djnz r3,clear_1;循环read-in data(共写入28kb byte data)
djnz r4,clear_1
lcall auto_write_over;设置自动写入终止
;清除文本显示区域
mov lcd_data1,#00h
mov lcd_data2,#10h
mov lcd_com_reg,#24h;设置写入数据首地址(1000h)
lcall lcd_two_data_wr
lcall auto_write_set;设置自动写入方式
mov r3,#00h
mov r4,#10h
lcall lcd_not_data_wr;调用无参数写入子程序
clear_2: lcall st3;判断auto read-in 状态位
mov a,#0h
lcall pr13;调用data read-in program
djnz r3,clear_2;循环read-in data(共写入28kb byte data)
djnz r4,clear_2
lcall auto_write_over;设置自动写入终止
pop 04h
pop 03h
ret
;auto read-in mode set------------------------------------------------------
auto_write_set: mov lcd_com_reg,#0b0h;set auto read-in mode
lcall lcd_not_data_wr
ret
;auto read-in mode over-----------------------------------------------------
auto_write_over: mov lcd_com_reg,#0b3h;set auto read-in stop instruction
lcall lcd_not_data_wr
ret
;单字节数据写入方式设定-----------------------------------------------------
one_byte_data_write_set:mov lcd_com_reg,#0c0h;设置单字节写入方式
lcall lcd_one_data_wr
ret
;read status byte-----------------------------------------------------------
r_st: mov dptr_reg,#1
MOV DPTR,#lcd_c_add;设置指令通道地址
xch a,dph
anl a,p2
xch a,dph
MOVX A,@DPTR;read state byte
mov dptr_reg,#0
RET
;判断LCD status bit,STA0 STA1-----------------------------------------------
;D0 STA0: LCD指令读写状态 1:准备好 0:忙
;D1 STA1: LCD数据读写状态 1:准备好 0:忙
st01:
push 02h
mov r2,#00h
st01_1: lcall r_st;调用read status byte program
djnz r2,st01_2
lcall alarm_2
ajmp $
st01_2: jnb acc.0,st01_1;判断STA0 status
jnb acc.1,st01_1;判断STA1 status
pop 02h
ret
;判断LCD status bit,STA2----------------------------------------------------
;D2 STA2: LCD数据自动读状态 1:准备好 0:忙
st2: push 02h
mov r2,#00h
st2_1: lcall r_st;调用read status byte program
djnz r2,st2_2
lcall alarm_2
ljmp $
st2_2: jnb acc.2,st2_1;判断STA2 status
pop 02h
ret
;判状LCD status bit STA3----------------------------------------------------
;D3 STA3: LCD数据自动写状态 1:准备好 0:忙
st3: push 02h
mov r2,#00h
st3_1: lcall r_st;调用read status byte program
djnz r2,st3_2
lcall alarm_2
ajmp $
st3_2: jnb acc.3,st3_1;判断STA3 status
pop 02h
ret
;写指令和写数据子程序-------------------------------------------------------
lcd_two_data_wr: lcall st01;双字节参数指令写入入口
mov a,lcd_data1;取第一个参数
lcall pr13;写入参数
lcd_one_data_wr: lcall st01;单字节参数指令写入入口
mov a,lcd_data2;取第二个参数
lcall pr13
lcd_not_data_wr: lcall st01;无参数指令写入入口
mov a,lcd_com_reg;取指令代码
ljmp pr14;写入指令代码
pr13: mov dptr_reg,#1
mov dptr,#lcd_d_add;设置数据通道地址
pr14: mov dptr_reg,#1
xch a,dph
anl a,p2
xch a,dph
movx @dptr,a;写入操作数
mov dptr_reg,#0
ret
;读数据子程序---------------------------------------------------------------
pr2: lcall st01 ;判断状态位
mov dptr_reg,#1
mov dptr,#lcd_d_add;设置数据通道地址
xch a,dph
anl a,p2
xch a,dph
movx a,@dptr;读操作数
mov dptr_reg,#0
mov lcd_data2,a
ret
;图形数据写入位置计算---------------------------------------------------------
figure_data_wr_addr_count:
mov a,lcd_y;lcd数据写入位置计算
mov b,#32d
mul ab
add a,lcd_x
mov lcd_x,a
mov a,b
mov lcd_y,a
mov lcd_com_reg,#24h
lcall lcd_two_data_wr;设置写入位置
ret
;字符数据写入位置计算---------------------------------------------------------
ascci_data_wr_addr_count:
mov a,lcd_y
mov b,#32
mul ab
add a,lcd_x
mov lcd_x,a
mov a,b
add a,#10h
mov lcd_y,a
mov lcd_com_reg,#24h
lcall lcd_two_data_wr;设置写入位置
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -