📄 lcdv115.inc
字号:
;***********************************************************
;程序名称: LCD显示子程序
;程序开发: 前锋集团技术中心 江海波
;编写时间: 2004年12月17日
;软件环境: 供QF561型税控器的上层C语言使用
;硬件环境: ST7920主控的LCD显示器,串行接口
;MCU: TOSHIBA TMP93CS41@max 16M/1
;程序版本: V1.15
;最后修订时间: 2004年12月17日
;修订部分说明: 由于实验证明液晶的片选信号无效,我们改换了CLK端口
; 并取消了片选信号,由于在实践中不需要读取LCD中信息,
; 我们取消了读取函数.
; V1.15版本在1.10版本基础之上加快了程序运行的速度
;**********************************************************
;定义伪指令,当硬件结构改变时修改本位置上的指令即可完成程序修改
;----------------------------------------------------------
;LCD显示器的时钟CLK信号被设置在端口lcd_clk_port的lcd_clk_bit位上
lcd_clk_port equ P9
lcd_clk_bit equ 1
;----------------------------------------------------------
;LCD显示器的数据SID信号被设置在端口lcd_sid_port的lcd_sid_bit位上
lcd_sid_port equ P9
lcd_sid_bit equ 0
;----------------------------------------------------------
;LCD要显示的字符被C程序放置在lcd_code区段,格式为:
;当前行(1 Byte) + 汉字(GBK) OR 西文(ASCII) + 包尾(固定为0x00)
;其中当前行的表示方法为:
;80H表示第一行
;90H表示第二行
;88H表示第三行
;98H表示第四行
;这个缓冲区的首地址还用于高亮显示的行坐标指示,方法为:
;00H高亮第一行
;01H高亮第二行
;02H高亮第三行
;03H高亮第四行
;这个缓冲区被设置在地址:
lcd_code equ 0x10B
;----------------------------------------------------------
;本程序需要一个字节作为标志位,这个标志位被安排在地址:
show_flag equ 0x11D
;----------------------------------------------------------
;***********************全局函数声明***********************
PUBLIC __init_lcd ;---LCD初始化函数,可供C语言调用
PUBLIC __lcd_show ;---LCD显示程序,由上层C语言调用
PUBLIC __lcd_high_light ;---LCD高亮一行程序,由上层C语言调用
PUBLIC __clr_lcd ;---LCD清屏函数,清除所有显示的字符
PUBLIC __cursor_on ;---LCD打开光标显示
PUBLIC __cursor_off ;---LCD关闭光标显示
;**********************************************************
;**********************函数调用方式************************
;__init_lcd ;---LCD初始化函数,直接调用,无参数
;__lcd_show ;---LCD显示程序,在lcd_code中填充代码后调用本函数
;__lcd_high_light ;---LCD高亮一行程序,由上层C语言调用,在lcd_code中填充行代码后调用本函数
;__clr_lcd ;---LCD清屏函数,清除所有显示的字符,直接调用,无参数
;__cursor_on ;---LCD打开光标显示,直接调用,无参数
;__cursor_off ;---LCD关闭光标显示,直接调用,无参数
;**********************通用寄存器分配**********************
;通用寄存器堆分配:a,位指针;b临时变量,在当前子程序中适用;c计数器
;w,数据寄存器,在本子程序中全局有效,作为发送数据时的信息传递
;e,发送个数计数器
;xix:数据指针
;show_flag:LCD通讯程序标志show_flag.7=R/W;show_flag.6=D/C
;----------------------------------------------------------
;本程序内部伪指令定义:
lcd_rw equ 7 ;---LCD读/写控制位
lcd_dc equ 6 ;---LCD数据/命令控制位
;*******************LCD显示专用延迟函数********************
show_delay_100us: ;显示延迟函数,0.1ms
ld b,0x1E ;0x1E=30,延迟0.1mS
s_d_100_loop: ;Show Delay 100us Loop
nop ;2s*9=18 statu
nop
nop
nop
nop
nop
nop
nop
nop
djnz s_d_100_loop ;7s/11 statu
ret
;**********************************************************
show_delay_3ms: ;显示延迟函数,2.88ms
ld b,0xFD ;0xFD=253延迟2.88mS
s_d_3_loop: ;Show Delay 3ms Loop
ldcf 7,(PA) ;由于ldcf指令的执行时间长,这里用来
ldcf 7,(PA) ;代替nop指令作延迟用,并没有实际意义
ldcf 7,(PA)
ldcf 7,(PA)
ldcf 7,(PA)
ldcf 7,(PA)
ldcf 7,(PA)
ldcf 7,(PA)
ldcf 7,(PA)
ldcf 7,(PA)
djnz b,s_d_3_loop
ret
;******************LCD发送同步信号函数*********************
show_syn_rw_dc: ;SHOW SYNchronization
set lcd_sid_bit,(lcd_sid_port) ;SID=1
ld c,0x05 ;发送5个"1"
s_s_loop: ;Show Synchronization LOOP
set lcd_clk_bit,(lcd_clk_port) ;CLOCK=1
res lcd_clk_bit,(lcd_clk_port) ;CLOCK=0
djnz c,s_s_loop
res lcd_sid_bit,(lcd_sid_port) ;此时SID=0,CLK=0
;*******************LCD发送读写控制信号********************
show_rw_dc: ;SHOW Read/Write signal & Data/Command
ldcf lcd_rw,(show_flag) ;show_flag.0标示读/写控制位
stcf lcd_sid_bit,(lcd_sid_port) ;SID=show_flag.0=R/W
set lcd_clk_bit,(lcd_clk_port) ;CLOCK=1
res lcd_clk_bit,(lcd_clk_port) ;CLOCK=0
ldcf lcd_dc,(show_flag) ;show_flag.1标示数据/命令控制位
stcf lcd_sid_bit,(lcd_sid_port) ;SID=show_flag.1=D/C
set lcd_clk_bit,(lcd_clk_port) ;CLOCK=1
res lcd_clk_bit,(lcd_clk_port) ;CLOCK=0
res lcd_sid_bit,(lcd_sid_port) ;SID=0,发送固定"0"位
set lcd_clk_bit,(lcd_clk_port) ;CLOCK=1
res lcd_clk_bit,(lcd_clk_port) ;CLOCK=0
ret ;此时SID=0,CLK=0
;**********************LCD发送数据函数*********************
;------------将存放在W寄存器中的一个字节发送出去-----------
show_sen_data: ;SHOW SENd DATA
ld c,0x04 ;循环计数器
s_h_h: ;发送高半字节---Send High Half
rlc 1,w ;从高字节开始发送
stcf lcd_sid_bit,(lcd_sid_port) ;SID=Date<C>
set lcd_clk_bit,(lcd_clk_port) ;CLK=1
res lcd_clk_bit,(lcd_clk_port) ;CLK=0
djnz c,s_h_h
res lcd_sid_bit,(lcd_sid_port) ;SID=0,发送高位后的4个连"0"
s_h_h_loop: ;Send High Half Loop
set lcd_clk_bit,(lcd_clk_port) ;CLK=1
res lcd_clk_bit,(lcd_clk_port) ;CLK=0
set lcd_clk_bit,(lcd_clk_port) ;CLK=1
res lcd_clk_bit,(lcd_clk_port) ;CLK=0
set lcd_clk_bit,(lcd_clk_port) ;CLK=1
res lcd_clk_bit,(lcd_clk_port) ;CLK=0
set lcd_clk_bit,(lcd_clk_port) ;CLK=1
res lcd_clk_bit,(lcd_clk_port) ;CLK=0
ld c,0x04 ;循环计数器
s_l_h: ;发送低半字节---Send Low Half
rlc 1,w ;从高字节开始发送
stcf lcd_sid_bit,(lcd_sid_port) ;SID=Data<C>
set lcd_clk_bit,(lcd_clk_port) ;CLK=1
res lcd_clk_bit,(lcd_clk_port) ;CLK=0
djnz c,s_l_h
res lcd_sid_bit,(lcd_sid_port) ;SID=0,发送低位后的4个连"0"
s_l_h_loop: ;Send Low Half Loop
set lcd_clk_bit,(lcd_clk_port) ;CLK=1
res lcd_clk_bit,(lcd_clk_port) ;CLK=0
set lcd_clk_bit,(lcd_clk_port) ;CLK=1
res lcd_clk_bit,(lcd_clk_port) ;CLK=0
set lcd_clk_bit,(lcd_clk_port) ;CLK=1
res lcd_clk_bit,(lcd_clk_port) ;CLK=0
set lcd_clk_bit,(lcd_clk_port) ;CLK=1
res lcd_clk_bit,(lcd_clk_port) ;CLK=0
ret ;此时SID=0,CLK=0
;---------------------Main Of LCD Show---------------------
;*********************LCD初始化函数************************
__init_lcd: ;INITialization LCD device
di ;关闭中断
res lcd_rw,(show_flag) ;Write LCD
res lcd_dc,(show_flag) ;Send Command
call show_syn_rw_dc ;发送同步头
ld w,0x0C ;---命令---开显示---整体显示ON,光标显示OFF
call show_sen_data
call show_delay_100us
call show_syn_rw_dc ;发送同步头
ld w,0x01 ;---命令---清屏
call show_sen_data
call show_delay_3ms
call show_delay_3ms
ei 0x00 ;任务完成,开启中断
ret
;*********************LCD显示函数**************************
__lcd_show: ;Show Code From C Leve
di ;关闭中断
res lcd_rw,(show_flag) ;Write LCD
res lcd_dc,(show_flag) ;Send Command
call show_syn_rw_dc ;发送同步头
ld w,(lcd_code)
call show_sen_data ;发送显示行的首地址
call show_delay_100us
set lcd_dc,(show_flag) ;Send Data
call show_syn_rw_dc ;发送同步头
ld xix,lcd_code ;载入显示字符的首地址
inc 1,xix
ld e,16 ;一行16个字符
lcd_show_loop:
ld b,(xix)
cp b,0x00
jp z,lcd_show_end
ld w,(xix+)
call show_sen_data ;发送数据
call show_delay_100us
djnz e,lcd_show_loop
lcd_show_end: ;发送完毕,返回
ei 0x00 ;任务完成,开启中断
ret
;*********************LCD高亮函数**************************
__lcd_high_light: ;Hight Light One Line On The Lcd
di ;关闭中断
res lcd_rw,(show_flag) ;Write LCD
res lcd_dc,(show_flag) ;Send Command
call show_syn_rw_dc ;发送同步头
ld w,0x34 ;---命令,使用扩充指令集
call show_sen_data
call show_delay_100us
call show_syn_rw_dc ;发送同步头
ld w,(lcd_code) ;---载入要高亮显示的行
or w,0x04 ;---命令,高亮显示,反白的行由C语言控制
call show_sen_data
call show_delay_100us
call show_syn_rw_dc ;发送同步头
ld w,0x30 ;---命令,使用基本指令集
call show_sen_data
call show_delay_100us
ei 0x00 ;任务完成,开启中断
ret
;*********************LCD清屏函数**************************
__clr_lcd: ;Clear All The Characters That Was Showed On The LCD
di ;关闭中断
res lcd_rw,(show_flag) ;Write LCD
res lcd_dc,(show_flag) ;Send Command
call show_syn_rw_dc ;发送同步头
ld w,0x01 ;---命令---清屏
call show_sen_data
call show_delay_3ms
call show_delay_3ms
ei 0x00 ;任务完成,开启中断
ret
;*********************打开LCD光标函数**********************
__cursor_on: ;Turn On The Cursor
di ;关闭中断
res lcd_rw,(show_flag) ;Write LCD
res lcd_dc,(show_flag) ;Send Command
call show_syn_rw_dc ;发送同步头
ld w,0x0F ;---命令,开光标显示
call show_sen_data
call show_delay_100us
ei 0x00 ;任务完成,开启中断
ret
;*******************关闭LCD光标函数**********************
__cursor_off: ;Turn Off The Cursor
di ;关闭中断
res lcd_rw,(show_flag) ;Write LCD
res lcd_dc,(show_flag) ;Send Command
call show_syn_rw_dc ;发送同步头
ld w,0x0C ;---命令,开光标显示
call show_sen_data
call show_delay_100us
ei 0x00 ;任务完成,开启中断
ret
;**********************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -