ht1621 LCD通用驅(qū)動(dòng)實(shí)例
;LCD設(shè)定(命令模式字的低8位數(shù)據(jù))
BIAS EQU 52H ;1/3 偏壓4背極
RC256 EQU 30H ;系統(tǒng)時(shí)鐘選用片
內(nèi)RC振蕩器
SYSEN EQU 02H ;打開系統(tǒng)時(shí)鐘
LCDON EQU 06H ;打開偏壓發(fā)生器
SYSDIS EQU 00H ;關(guān)閉系統(tǒng)時(shí)鐘和
偏壓發(fā)生器
X32K EQU 28H ;系統(tǒng)時(shí)鐘選擇為
片外晶振
ToneOn EQU 12H ;打開音頻輸出
ToneOff EQU 10H ;關(guān)閉音頻輸出
Tone4k EQU 80H ;音頻輸出頻率為
4K
Tone2k EQU 0C0H ;音頻輸出頻率為2K
TIMEREN EQU 0CH ;時(shí)基輸出使能
TIMERDIS EQU 08H ;時(shí)基輸出禁能
CLRtimeEQU 18H ;清零進(jìn)基發(fā)生器
WDTEN EQU 0EH ;使能WDT溢出標(biāo)志
輸出
WDTDIS EQU 0AH ;禁止WDT溢出標(biāo)志
輸出
CLRWDT EQU 1CH ;清零WDT
IRQEN EQU 10H ;使能IRQ輸出
IRQDIS EQU 00H ;禁止IRQ輸出
FR1 EQU 40H ;設(shè)置時(shí)基輸出
1Hz,WDT溢出時(shí)間4s
;HT1621B控制位(液晶模塊接口定義,用戶根據(jù)自已的需要更改)
CS BIT P0.1 ;HT1621B片選
WRITE BIT P0.3 ;HT1621B寫控制位
SDATA BIT P0.5 ;HT1621B數(shù)據(jù)線
;顯示緩沖區(qū)(用戶根據(jù)自已的需要更改變量的存儲(chǔ)地址)
DISBUFFER EQU 34H ;顯示緩沖區(qū)地址34H--43H(16
字節(jié))
;臨時(shí)變量定義(不會(huì)破壞這些資源,只是臨時(shí)占用,用戶不要自行修改)
lcdbitcnt EQU 03H ;發(fā)送位計(jì)數(shù)器
lcdcommand EQU 02H ;發(fā)送命令緩沖器
lcdadr EQU 01H ;lcd顯存指針
LCDBYTECNT EQU 04H ;發(fā)送字節(jié)數(shù)記數(shù)器
;===============================================================================
====
;向HT1621B發(fā)送命令和數(shù)據(jù)模塊
;軟件包面向用戶的界面程序:
; Send1621Com發(fā)送命令子程序,命令I(lǐng)D為100+0型式 + 命令字
; Send1621ComB發(fā)送命令子程序(B),命令I(lǐng)D為100+1型式 + 命令字
; HT1621DOWN設(shè)置1621進(jìn)行掉電工作方式
; INTI1621初化1621,并打開LCD顯示,用戶可更改相應(yīng)初化字,進(jìn)行1621的不同設(shè)
置。
; BrushLcd 刷新LCD顯示,即將顯示緩沖區(qū)的16字節(jié)數(shù)據(jù)發(fā)送到1621,從SEG0
段開始。
; DISDPTR將DPTR指向的程序存儲(chǔ)器的數(shù)據(jù)(連續(xù)16字節(jié))發(fā)送到1621顯示。
;這此子程序都會(huì)自動(dòng)保護(hù)所需的臨時(shí)單元,所以占用較多的堆棧,用戶要注意這一點(diǎn)。
;===============================================================================
====
;發(fā)送命令程序
;名稱: Send1621Com
;描述: 向HT1621B發(fā)送控制命令,命令內(nèi)容在LCDCOMMAND中。
;所發(fā)的命令類型為ID=100+0+命令,占用堆棧。
Send1621Com:
PUSH ACC
PUSH LCDBITCNT
ACALL INTI ;起動(dòng)1621(即初
化)
MOV LCDBITCNT,#04h
MOV A,#80h ;發(fā)送ID值100+0
ACALL sendb0
MOV A,LCDCOMMAND ;取得命令字
ACALL send1621byte ;發(fā)送到1621
SETB write
SETB cs
SETB sdata
POP LCDBITCNT
POP ACC
RET
;發(fā)送命令程序(B)
;名稱: Send1621ComB
;描述: 向HT1621B發(fā)送控制命令,命令內(nèi)容在LCDCOMMAND中。
;所發(fā)的命令類型為ID=100+1+命令,占用堆棧。
Send1621ComB:
PUSH ACC
PUSH LCDBITCNT
ACALL INTI ;起動(dòng)1621(即初
化)
MOV LCDBITCNT,#04h
MOV A,#90h ;發(fā)送ID值100+1
ACALL sendb0
MOV A,LCDCOMMAND
ACALL send1621byte
SETB write ;將SPI接口均置為
高電平
SETB cs
SETB sdata
POP LCDBITCNT
POP ACC
RET
;HT1621B掉電模式
;使1621進(jìn)行掉電模式,以降低功耗
HT1621DOWN:
PUSH LCDCOMMAND
MOV LCDCOMMAND,#SYSDIS ;關(guān)閉系統(tǒng)振蕩器即進(jìn)行掉電
方式
ACALL Send1621Com
POP LCDCOMMAND
RET
;1621設(shè)置
;描述:進(jìn)行1621的基本設(shè)置,偏壓、背極、系統(tǒng)工作方式
;用戶添加初化內(nèi)容或更改設(shè)置內(nèi)容。
INTI1621:
PUSH LCDCOMMAND
MOV LCDCommand,#bias
ACALL Send1621Com ;工作于1/3偏壓,
4背極
MOV LCDCommand,#X32K
ACALL Send1621Com ;系統(tǒng)時(shí)鐘選擇為
外部時(shí)鐘
MOV LCDCommand,#wdtdis
ACALL Send1621Com ;關(guān)閉看門狗
MOV LCDCommand,#timerdis
ACALL Send1621Com
MOV LCDCommand,#sysen ;啟動(dòng)1621系統(tǒng)振蕩器
ACALL Send1621Com
MOV LCDCommand,#LCDON ;啟動(dòng)1621顯示偏壓發(fā)生器,啟
動(dòng)顯示
ACALL Send1621Com
POP LCDCOMMAND
RET
;刷新顯示子程序
;名稱:BrushLcd
;描述:把顯示緩沖區(qū)DISBUFFER共16個(gè)單元的內(nèi)容送到1621中
BrushLcd:
PUSH LCDBYTECNT
PUSH LCDADR
MOV LCDBYTECNT,#16 ;發(fā)送16個(gè)數(shù)據(jù)
MOV LCDADR,#DISBUFFER ;指向顯示緩沖區(qū)
DISPLAY0:
LCALL SEND1621DATA ;調(diào)用發(fā)送數(shù)據(jù)子
程序,從SEG0段開始
POP LCDADR
POP LCDBYTECNT
RET
;函數(shù)名:DISDPTR
;功能:把DPTR指向的程序存貯器的16個(gè)字節(jié)內(nèi)容直接送到1621的顯示緩沖區(qū)內(nèi)
;參數(shù):DPTR-緩沖區(qū)指針
;返回值:無(wú)
DISDPTR:
PUSH 07H
PUSH 00H
PUSH 06H
PUSH ACC
MOV R7,#10H ;設(shè)置各指針及變
量初值
MOV R0,# DISBUFFER ;先把數(shù)據(jù)讀入顯
示緩沖區(qū)
MOV R6,#00
ICERRORCON:
MOV A,R6
MOVC A,@A+DPTR ;讀取程序區(qū)的數(shù)據(jù)
MOV @R0,A ;放入顯示緩沖區(qū)
INC R0
INC R6
DJNZ R7,ICERRORCON
ACALL BrushLcd ;輸出顯示
POP ACC
POP 06H
POP 00H
POP 07H
RET
;*******************************************************************
;子程序
;用啟盡量不要單獨(dú)的調(diào)用這此子程序
;***********************************************
;************************************************
;發(fā)送數(shù)據(jù)程序
;名稱: Send1621Data
;描述: 向HT1621B發(fā)送BYTECNT個(gè)數(shù)據(jù)(從SEG0開始發(fā)送)
;數(shù)據(jù)在發(fā)送緩沖區(qū)中,緩沖區(qū)指針lcdadr.
;-----------------------------------------------
Send1621Data:
PUSH ACC
PUSH LCDBITCNT
PUSH LCDBYTECNT
PUSH LCDADR
ACALL INTI
MOV LCDBITCNT,#01H ;發(fā)送寫1621RAM命
令
MOV A,#80H ;發(fā)送1位數(shù)據(jù)
ACALL SENDB0
MOV A,#40H ;1621RAM地址設(shè)置
為00H
ACALL SEND1621BYTE
MOV R1,LCDADR
SENDNEXT1:
MOV A,@R1 ;讀取數(shù)據(jù)
ACALL SEND1621BYTE ;發(fā)送數(shù)據(jù)
INC R1
DJNZ LCDBYTECNT,SENDNEXT1
SETB WRITE
SETB CS
SETB SDATA
POP LCDADR
POP LCDBYTECNT
POP LCDBITCNT
POP ACC
RET
;************************************************
;1621初始化子程序
;即起動(dòng)1621
;-----------------------------------------------
INTI:
CLR CS
SETB WRITE
NOP
CLR WRITE
NOP
RET
;******************************************************************
;發(fā)送字節(jié)數(shù)據(jù)子程序
;名稱: Send1621Byte
;描述: 向HT1621B發(fā)送一個(gè)字節(jié)數(shù)據(jù),數(shù)據(jù)在A中
;-----------------------------------------------
Send1621Byte:
PUSH LCDBITCNT
MOV lcdbitcnt,#08h ;發(fā)送8位數(shù)據(jù)位
ACALL SENDB0 ;調(diào)用發(fā)送數(shù)據(jù)位
子程序
POP LCDBITCNT
RET
;******************************************************************
;發(fā)送位數(shù)據(jù)子程序
;名稱: sendb0
;描述: 向HT1621B發(fā)送N位數(shù)據(jù),數(shù)據(jù)在A中,N在LCDBITCNT中,從高位開始發(fā)送
;-----------------------------------------------
SENDB0:
PUSH ACC
PUSH PSW
PUSH LCDBITCNT
SENDB01:
RLC A
MOV SDATA,C ;先發(fā)送高位數(shù)據(jù)
SETB WRITE ;產(chǎn)生WR信號(hào)
NOP
NOP
CLR WRITE
NOP
NOP
DJNZ LCDBITCNT,SENDB01 ;未發(fā)送完,繼續(xù)
POP LCDBITCNT
POP PSW
POP ACC
RET
;========================================================
;表格區(qū)
;ZY886A型LCD數(shù)字顯示表(0-F),供用戶轉(zhuǎn)換使用。(以上程序不用此表)
LCDData:
DB0EBH,60H,0C7H,0E5H,6CH,0ADH,0AFH,0E0H,0EFH,0EDH,0EEH,2FH,07H,67H,8FH,8EH
;===============================================================
;
;以上程序是HT1621的通用程序,對(duì)不同的LCD只是其字模不一樣而以。