×
单片机 > 单片机程序设计 > 详情

ht1621 LCD通用驱动实例

发布时间:2020-06-16 发布时间:
|

;LCD 设定(命令模式字的低8位数据)
BIAS EQU 52H ;1/3 偏压4背极
RC256 EQU 30H ;系统时钟选用片
内RC振荡器
SYSEN EQU 02H ;打开系统时钟
LCDON EQU 06H ;打开偏压发生器
SYSDIS EQU 00H ;关闭系统时钟和

偏压发生器
X32K EQU 28H ;系统时钟选择为
片外晶振        
ToneOn EQU 12H ;打开音频输出
ToneOff EQU 10H ;关闭音频输出
Tone4k EQU 80H ;音频输出频率为
4K
Tone2k EQU 0C0H         ;音频输出频率为2K
TIMEREN EQU 0CH   ;时基输出使能
TIMERDIS EQU 08H ;时基输出禁能
CLRtime         EQU 18H ;清零进基发生器
WDTEN EQU 0EH ;使能WDT溢出标志
输出
WDTDIS EQU 0AH ;禁止WDT溢出标志
输出
CLRWDT EQU 1CH ;清零WDT
IRQEN EQU 10H ;使能IRQ输出
IRQDIS EQU 00H ;禁止IRQ输出
FR1 EQU 40H ;设置时基输出
1Hz,WDT溢出时间4s

;HT1621B控制位(液晶模块接口定义,用户根据自已的需要更改)
CS BIT P0.1 ;HT1621B片选
WRITE BIT P0.3 ;HT1621B写控制位
SDATA BIT P0.5 ;HT1621B数据线

;显示缓冲区(用户根据自已的需要更改变量的存储地址)
DISBUFFER EQU 34H ;显示缓冲区地址34H--43H(16
字节)

;临时变量定义(不会破坏这些资源,只是临时占用,用户不要自行修改)
lcdbitcnt EQU 03H ;发送位计数器
lcdcommand EQU 02H ;发送命令缓冲器
lcdadr EQU 01H ;lcd显存指针
LCDBYTECNT EQU 04H ;发送字节数记数器 

;===============================================================================
====          
;                              向HT1621B发送命令和数据模块
;软件包面向用户的界面程序:
; Send1621Com    发送命令子程序,命令ID为100+0型式 + 命令字
; Send1621ComB    发送命令子程序(B),命令ID为100+1型式 + 命令字
; HT1621DOWN    设置1621进行掉电工作方式
; INTI1621    初化1621,并打开LCD显示,用户可更改相应初化字,进行1621的不同设
置。
; BrushLcd 刷新LCD显示,即将显示缓冲区的16字节数据发送到1621,从SEG0
段开始。
; DISDPTR    将DPTR指向的程序存储器的数据(连续16字节)发送到1621显示。
;这此子程序都会自动保护所需的临时单元,所以占用较多的堆栈,用户要注意这一点。
;===============================================================================
====

;发送命令程序
;名称: Send1621Com
;描述: 向HT1621B发送控制命令,命令内容在LCDCOMMAND中。
;所发的命令类型为ID=100+0+命令,占用堆栈。
Send1621Com:
PUSH ACC
PUSH LCDBITCNT
ACALL INTI ;起动1621(即初
化)
MOV LCDBITCNT,#04h
MOV A,#80h        ;发送ID值100+0
ACALL sendb0
MOV A,LCDCOMMAND ;取得命令字
ACALL send1621byte ;发送到1621
SETB write
SETB cs
SETB sdata
POP LCDBITCNT
POP ACC
RET

;发送命令程序(B)
;名称: Send1621ComB
;描述: 向HT1621B发送控制命令,命令内容在LCDCOMMAND中。
;所发的命令类型为ID=100+1+命令,占用堆栈。
Send1621ComB:
PUSH ACC
PUSH LCDBITCNT
ACALL INTI ;起动1621(即初
化)
MOV LCDBITCNT,#04h
MOV A,#90h ;发送ID值100+1
ACALL sendb0
MOV A,LCDCOMMAND
ACALL send1621byte
SETB write ;将SPI接口均置为
高电平
SETB cs
SETB sdata
POP LCDBITCNT
POP ACC
RET

;HT1621B掉电模式
;使1621进行掉电模式,以降低功耗
HT1621DOWN:
PUSH LCDCOMMAND
MOV LCDCOMMAND,#SYSDIS ;关闭系统振荡器即进行掉电
方式
ACALL Send1621Com                  
POP LCDCOMMAND
RET

;1621设置
;描述:进行1621的基本设置,偏压、背极、系统工作方式
;用户添加初化内容或更改设置内容。
INTI1621:
PUSH LCDCOMMAND
MOV LCDCommand,#bias                    
ACALL  Send1621Com ;工作于1/3偏压,
4背极                 
MOV LCDCommand,#X32K       
ACALL Send1621Com ;系统时钟选择为
外部时钟
MOV LCDCommand,#wdtdis          
ACALL Send1621Com ;关闭看门狗
MOV LCDCommand,#timerdis        
ACALL Send1621Com                                  
MOV LCDCommand,#sysen ;启动1621系统振荡器
ACALL Send1621Com                 
MOV LCDCommand,#LCDON ;启动1621显示偏压发生器,启
动显示
ACALL Send1621Com
POP LCDCOMMAND
RET  

;刷新显示子程序
;名称:BrushLcd
;描述:把显示缓冲区DISBUFFER共16个单元的内容送到1621中
BrushLcd:
PUSH LCDBYTECNT
PUSH LCDADR
MOV LCDBYTECNT,#16 ;发送16个数据
MOV LCDADR,#DISBUFFER ;指向显示缓冲区
DISPLAY0:
LCALL SEND1621DATA ;调用发送数据子
程序,从SEG0段开始
POP LCDADR
POP LCDBYTECNT
RET 

;函数名:DISDPTR
;功能:    把DPTR指向的程序存贮器的16个字节内容直接送到1621的显示缓冲区内
;参数:    DPTR-缓冲区指针
;返回值:无
DISDPTR:
PUSH 07H
PUSH 00H
PUSH 06H
PUSH ACC
MOV R7,#10H ;设置各指针及变
量初值
MOV R0,# DISBUFFER ;先把数据读入显
示缓冲区
MOV R6,#00
ICERRORCON:
MOV A,R6
MOVC A,@A+DPTR ;读取程序区的数据
MOV @R0,A ;放入显示缓冲区
INC R0
INC R6
DJNZ R7,ICERRORCON 
ACALL BrushLcd ;输出显示
POP ACC
POP 06H
POP 00H
POP 07H
RET

;*******************************************************************
;                 子程序
;用启尽量不要单独的调用这此子程序
;***********************************************

;************************************************
;发送数据程序
;名称: Send1621Data
;描述: 向HT1621B发送BYTECNT个数据(从SEG0开始发送)
;           数据在发送缓冲区中,缓冲区指针lcdadr.
;-----------------------------------------------
Send1621Data:
PUSH ACC
PUSH LCDBITCNT
PUSH LCDBYTECNT
PUSH LCDADR
ACALL INTI
MOV LCDBITCNT,#01H ;发送写1621RAM命

MOV A,#80H ;发送1位数据
ACALL SENDB0
MOV A,#40H ;1621RAM地址设置
为00H
ACALL SEND1621BYTE 
MOV R1,LCDADR
SENDNEXT1:
MOV A,@R1 ;读取数据
ACALL SEND1621BYTE ;发送数据
INC R1
DJNZ LCDBYTECNT,SENDNEXT1
SETB WRITE
SETB CS
SETB SDATA
POP LCDADR
POP LCDBYTECNT
POP LCDBITCNT
POP ACC
RET

;************************************************
;1621初始化子程序
;即起动1621
;-----------------------------------------------
INTI:
CLR CS
SETB WRITE
NOP
CLR WRITE
NOP
RET


;******************************************************************
;发送字节数据子程序
;名称: Send1621Byte
;描述: 向HT1621B发送一个字节数据,数据在A中
;-----------------------------------------------
Send1621Byte:
PUSH LCDBITCNT
MOV lcdbitcnt,#08h ;发送8位数据位
ACALL SENDB0 ;调用发送数据位
子程序
POP LCDBITCNT
RET

;******************************************************************
;发送位数据子程序
;名称: sendb0
;描述: 向HT1621B发送N位数据,数据在A中,N在LCDBITCNT中,从高位开始发送
;-----------------------------------------------
SENDB0:
PUSH ACC
PUSH PSW
PUSH LCDBITCNT
SENDB01:
RLC A
MOV SDATA,C ;先发送高位数据
SETB WRITE ;产生WR信号
NOP
NOP
CLR WRITE
NOP
NOP
DJNZ LCDBITCNT,SENDB01 ;未发送完,继续
POP LCDBITCNT
POP PSW
POP ACC
RET

;========================================================
;表格区
;ZY886A型LCD数字显示表(0-F),供用户转换使用。(以上程序不用此表)
LCDData:
DB  0EBH,60H,0C7H,0E5H,6CH,0ADH,0AFH,0E0H,0EFH,0EDH,0EEH,2FH,07H,67H,8FH,8EH
;===============================================================
;
;以上程序是HT1621的通用程序,对不同的LCD只是其字模不一样而以。


关键字:ht1621  LCD  通用驱动

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会