⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcdv115.inc

📁 本程序为某企业的税控机固件程序.基于东芝TMP93CS41 16位单片机编写,符合国家标准.该程序已经经过多次长期调试.
💻 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 + -