本帖最后由 hfbjjs 于 2011-3-3 00:53 编辑
SN 单片机驱动 HT1621 的实用程序
下面子程序,是驱动 HT1621 的测试程序,也是应用 HT1621 的成功程序.
它首先对 HT1621 进行初始化,并且使用芯片内部 RC 振荡器,无需附加其它参数就方便实用,
然后把屏幕全部点亮,暂停一小短时间后,关闭全部显示!
在点亮全部笔段或关闭全部内容的段落里各设置一个中断点,就可以清楚看见屏幕上每一段是怎么点亮或关闭的,它也是熟练人员查找屏幕笔段位置的子程序.-----再厉害的工程师都会使用这么一个步骤的.
因此,它适合驱动此类字符型液晶的人员参考使用.
这里使用的是 28P 封装芯片,具有 4COM*16SEG 驱动能力. SEG 仅仅是 1,3,5,7.....31 奇数引脚有输出.
蜂鸣器不用初始化,需要打开时,调用: ON_BPB 子程序,蜂鸣器发音,需要关闭时调用 OFF_BPB 子程序,关闭蜂鸣器,间隔地打开/关闭蜂鸣器,就可以得到"嘀 -.嘀,嘀...."等发音效果了! ----还可以选择发音频率 2KHZ 或 4KHZ ,组合成更多花样的报警声音!------当然不能够流行音乐那么美了!
有了这一小段程序,基本上就完全解决了 HT1621 的全部驱动原理与实际应用问题了!
;完整子程序
SDA1621 DS 1 ;准备写入到 1621 的数据
LCDADR DS 1 ;准备写入到 1621 的地址
TEMP DS 1 ;临时寄存器
P_CS EQU ;选择 1621 芯片
P_CSM EQU
P_WR EQU ;写 1621 时钟
P_WRM EQU
P_DATA EQU ;写 1621 数据
P_DATAM EQU
;*****************************************
;BPB报警响;HT1621 担任报警
BPB_ON: ;打开 蜂鸣器
MOV_ SDA1621,#40H ;4K
; MOV_ SDA1621,#60H;2K
CALL SEND_COMMAND
MOV_ SDA1621,#09H
CALL SEND_COMMAND ;BPB ON
RET
BPB_OFF:;关闭 蜂鸣器
MOV_ SDA1621,#08H
CALL SEND_COMMAND ;BPB OFF
RET
;TONE 4K 100 010X XXXX X
;TONE 2K 100 011X XXXX X
;-----------------------------
Init_1621:; Init_1621:初始化
BSET P_CSM
BSET P_WRM
BSET P_DATAM
MOV_ SDA1621,#01H ;打开系统振荡器
CALL SEND_COMMAND
; MOV_ SDA1621,#018H;系统时钟源片内RC 振荡器=系统默认
; CALL SEND_COMMAND
MOV_ SDA1621,#29H ;4COM;1/3 BIAS,*** 00101001 *B
CALL SEND_COMMAND
MOV_ SDA1621,#3 ;打开LCD 偏压发生器
CALL SEND_COMMAND
CALL CLR_LCM ;去点亮全部笔段然后暂停 3S ,然后 再关闭全部笔段
RET
;******************************************
SEND_COMMAND: ; 写入命令 ID=100
B0BCLR P_CS ;p10=0 片选有效
B0BSET P_DATA ;COMMAND ID '100' -----;1
CALL B_1621WR
B0BCLR P_DATA ;0
CALL B_1621WR
B0BCLR P_DATA ;0
CALL B_1621WR
MOV_ TEMP,#8 ; SEND CODE 下面写入 8 位
SEND_LOOP1:
B0BCLR P_DATA
B0BTS0 SDA1621.7
B0BSET P_DATA
RLCM SDA1621
CALL B_1621WR
DECMS TEMP
JMP SEND_LOOP1
CALL B_1621WR ;最后1位任意0或1
B0BSET P_CS
RET
;**************************************
B_WRLCD: ;写入数据 ID=101
INCMS LCDADR ;这里每次自动地址 +1
B_WRLCD0:
MOV_ ADR1621,LCDADR
B0BCLR P_CS ;片选有效
B0BSET P_DATA ;"1"
CALL B_1621WR
B0BCLR P_DATA ;"0"
CALL B_1621WR
B0BSET P_DATA :"1"
CALL B_1621WR
MOV_ TEMP,#6 ;发送地址 6 位
@@:
B0BCLR P_DATA ;=0
B0BTS0 ADR1621.5 ;判断 后决定数据引脚 = 0/1
B0BSET P_DATA ;=1
CALL B_1621WR
RLCM ADR1621 ;左移
DECMS TEMP
JMP @B
MOV_ TEMP,#4 ;发送数据 4 位
@@:
B0BCLR P_DATA
B0BTS0 SDA1621.0
B0BSET P_DATA
CALL B_1621WR
RRCM SDA1621 ;右移
DECMS TEMP
JMP @B
B0BSET P_CS
RET
;**************************************************
B_1621WR: ;写入时钟,这里使用 12MHZ 晶体. /4 选项,具体需要根据你程序的频率调整指令延时数值
B0BCLR P_WR
JMP $+1
JMP $+1
NOP
B0BSET P_WR
JMP $+1
NOP
RET
;*********************************************************************
CLR_LCM: ;使用新程序显示全部和关闭全部笔段,比原来节省空间.06-6-26 0:35
MBZ0 LCDADR
JMP B_TL3S
@@:
MOV_ SDA1621,#0FH ;点亮屏幕全部内容-----仅仅低 4 位有效
CALL B_WRLCD ;B_WRLCD 会自动递加一个地址
INCMS LCDADR ;相当于一次 +2 个地址,因为使用 28P 封装芯片
CMPRS1 LCDADR,#32 ;≥32 就到头了!
JMP @B
B_TL3S: ;上面全部显示停留 3S ,利用 LCDADR 再 +6 来计时3S
BTS1 F_KJ05S ;开机全部显示3S时基------这个定时器来产生 0.5S 定时标志,
RET
BCLR F_KJ05S ;开机全部显示3S时基
INCMS LCDADR
CMPRS1 LCDADR,#38; 38=32+6,全屏显示停留 3S/0.5=6 时间
RET
BCLR F_CM1621
;下面关闭全部笔段==============================
CLR LCDADR
@@:
CLR SDA1621 ;=00H,关闭笔段
CALL B_WRLCD ;B_WRLCD 会自动递加一个地址
INCMS LCDADR ;相当于一次 +2 个地址,因为使用 28P 封装芯片
CMPRS1 LCDADR,#32 ;仅仅使用到28P,4*16个SEG笔段
JMP @B
RET
;*************************************************
附:
该子程序使用的芯片引脚图.芯片是由 北京 杰龙电子 委托封装的------市场上 28P 的 HT1621 只有 3COM*16 ,少一个 COM !
在某项目里使用 28P 1621 的局部 PCB 图:
此外,还封装了 QFP44 的版本,以适合不同应用项目,但是,这个子程序都是实用的,上面示例自动地址 +1 与子程序地址 +1 成为 +2 , 如果使用 QFP44 封装,就把这个 +2 变成 +1 就是了!非常方便的!
在某项目里使用 44P 1621 的局部 PCB 图:
对应印刷版实物局部图:
重要提示:
必须非常注意芯片供电=5V,而液晶屏幕不一定=5V,有 3V的,4.5V的,5V....的.必须把芯片 VLCD 的电压调整到与屏幕参数电压相同!否则不是模糊就是鬼影!甚至关闭不了或者点亮不成!
我就是十几年来,一直使用它了!
由于 HT1621 在驱动字符液晶应用中使用频率很高,几乎是业界的代表!这里同时附上它的数据手册(简体中文版本),方便大家就近下载!
下载:
仅供参考! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
|