SN 单片机驱动 HT1621 的实用程序

[复制链接]
查看7081 | 回复3 | 2011-3-2 23:33:59 | 显示全部楼层 |阅读模式
本帖最后由 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
xxzddzyx | 2011-3-8 21:05:02 | 显示全部楼层
xiexiexiexiexiexie
xuwang | 2011-4-1 22:33:45 | 显示全部楼层
非常感谢!!!
xuwang | 2011-4-1 22:34:18 | 显示全部楼层
非常感谢!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则