HT1632C是一款很常用的LED(数码管或点阵)驱动芯片,虽然官方已经宣布该芯片明年(2021年)即将寿终正寝(停产),但是相同厂家生产的同系列芯片的控制方式通常是相同的(事实上,大多数LED驱动芯片差别也不大),所以了解HT1632C的控制原理对快速上手其它芯片也有一定的积极意义。

HT1632C内部也有一片显存(Display RAM, DRAM),我们在文章《液晶显示模组LCD1602之指令篇(1)》中已经说过:你往显存写什么,屏幕上就会相应显示什么。这句话对于HT1632C(以及绝大多数显示器件驱动芯片)也是适用的,所以我们首先需要明确:LED显示状态与显存数据的对应(映射)关系。数据手册标记了下图所示的DRAM映射表。

这张表是针对24个OUTBIT与16个COM的配置(32个OUTBIT与8个COM配置对应的映射表稍有不同,有兴趣的读者可参考数据手册),这可以通过命令来设置,你很快就会知道。另外,我们还用红色位号(VD11、VD12、VD21、VD22)标记了4个数据位,有分教!

上表告诉我们:如果OUTXX行与COMXX列交叉的单元格数据位为1,则相应的LED就会被点亮,反之则熄灭,简单吧!例如,COM0列与OUT1行交叉数据位为1,则VD12就会被点亮。当然,前提是你的硬件电路是正确的,我们就使用数据手册中的典型应用电路,如下图所示:

我们标记了LED点阵左上角四个LED的位号,VD11表示第1行第1列,VD12表示第1行第2列,其它依此类推。需要注意的是,电路图中LED的位置相对于DRAM映射表旋转了90,所以VD11的状态应该取决于DRAM映射表中COM0与OUT0交叉的单元格数据位,也就是地址0x00的D0位,VD12的状态应该取决于DRAM映射表中COM0与OUT1交叉的单元格数据位,也就是地址0x04的D0位,对不对?

为了修改DRAM数据,我们先来看看它的指令集,如下图所示(红色框内的指令是后续将要使用到的):

注意“ID”列,在HT1632C被称为模式识别码,简单的说,它用来标记传输的串行数据的具体意义。HT1632C有4种模式识别码,如下表所示:

我们来看看写DRAM数据时序(Write Data),如下图所示:

首先发送模式识别码“101”,表示后续跟随的11位串行数据是往DRAM地址(7位)中写入数据(4位)。需要特别注意的是:7位地址的最高位先发送,而4位数据的最低位反而先发送。在众多使用串行通讯接口的控制器件中,这可以说是比较 “奇葩”的位序定义(正常逻辑来讲,要么都是高位先行,或都是低位先行),除非你定义的4位数据本身就是反过来的,否则我们无法将地址与数据直接合并进行发送(必须先将位序反过来)。

例如,现在需要点亮VD22(对应地址0x4),那么往HT1632C发送的串行数据应该为0x2844(0b101_0000100_0100),而不是0x2842(0b101_0000100_0010)。

发送命令的时序如下图所示:

往HT1632C写命令时发送的串行数据是:模式识别码“100”+9位具体的命令位,总计12位(比写DRAM数据时少2位)。例如,我们要打开LED驱动(LED ON),则需要发送的串行数据为0b100_0000_0011_x(x表示无效位,即0x8060x807)。

还有连续写数据/命令以及读/改写数据的时序,限于篇幅不再赘述,有兴趣的读者可参考数据手册。

咱们使用VisualCom软件平台来验证一下,调出“基于HT1632C的24X16 LED点阵模组”后执行预置数据,相应的仿真效果如下图所示:

该仿真器件的LED位置与电路图是一一对应的,我们来看看相应的预置数据,如下图所示:

预置数据的位序定义与时序完全一样,例如第四条数据“806”就是我们刚刚介绍过的“打开LED驱动输出(LED ON”指令。

前面四条是初始化HD1632C的指令。我们首先将COM引脚配置为16个PMOS输出结构,该配置的依据来源于前面的硬件电路,图中最下方的提示“Common are PMOS open drain output structures”。由于电路中HT1632C使用了16个COM,所以应该设置为16 PMOS结构,设置为NMOS结构是无法点亮LED点阵的,而如果设置为8 PMOS结构,下半部分的LED将不会被点亮(PMOS与NMOS输出结构的具体区别可参考数据手册,本文不再赘述)。

其次,我们把HT1632C配置为主模式,因为从模式主要用于多芯片级联应用时,我们的硬件电路只使用了一片HT1632C。

再次,我们打开了系统振荡器与LED驱动时序生成电路(默认处于关闭状态),因为动态扫描的时序都是基于振荡器产生的时钟,芯片没有了时钟就相当于人的心脏没有跳动,自然不可能驱动点阵模块显示任何信息。

最后,我们开启了LED驱动输出功能,这样芯片输出才能发出扫描LED点阵驱动时序(默认处于关闭状态)。实际上,我们还应该配置“使用片内RC振荡时钟源(RC)”,但是由于上电后这一项是默认的,所以这一项配置并不是必须的。

执行完前面四条预置数据后,RAM中的数据就可以显示了,接下来全部是写数据操作。为了显示16X16点阵字体的汉字 “电”,我们首先需要进行取模操作,如下图所示:

因为每个DRAM地址中的4位数据对应4个COM(行),所以我们得纵向取模,且每次只写入4位数据,方向为从左到右、由上至下(DRAM映射表中蓝色箭头方向)。DRAM地址0x0~0x3对应的字模数据都是0,所以我们首先写入了4个0x0(尽管VisualCom软件平台已经将HT1632C的RAM数据全部初始化为0x0,但实际应用时还是得重新写入,这样可以避免芯片上电后DRAM出现随机数据),然后往DRAM地址 0x4写入了0x8。这里再次提醒一下:字模的提取顺序是下高位,这与前述DRAM映射表是对应的,但是写入的串行数据中的4位DRAM数据是反过来的(低位先行),所以实际预置数据的低4位应该是0x1。(你可以观察“内存窗口”中的DRAM数据,与提取的字模数据是完全对应的),读者可自行分析剩下的预置数据,此处不再赘述。

有些人可能会叫道:这叫啥的VisualCom软件平台不是瞎编的嘛!我在上面的命令表中可没有看到什么寄存器!其实与HD44780一样,我们给HT1632C发送命令就相当于设置一些寄存器,只不过数据手册没有将它们像HD44780那样命名而已,VisualCom软件平台为了方便我们观察芯片的状态,做了一些额外的工作将这些寄存器提取出来了而已!

举个小例子,我们对比一下“SYS OFF”与“SYS ON”指令,就会发现只有一位是有差别的,VisualCom软件平台显示的寄存器“SYS”就是这个数据位的状态。(M/S表示Master/Slave,COM表示COMMON OPTIONS, DUTY表示PWM DUTY)

精通LED驱动芯片HT1632C指令与编程应用的更多相关文章

  1. TMS320C54x系列DSP指令和编程指南——第1章 汇编语言工具概述

    第1章 汇编语言工具概述 TMS320C54x DSP的汇编语言开发工具包括: ■  Assembler      ■  Archiver      ■  Linker      ■  Absolut ...

  2. TMS320C54x系列DSP指令和编程指南——第2章 通目标文件格式介绍

    第2章 通用目标文件格式介绍 汇编器和连接器可以产生在TMS320C54x器件上执行的目标文件,这些目标文件的格式称为通用目标文件格式(COFF).采用COFF格式有利于程序的模式化编程,因为它支持用 ...

  3. TM1668 Led 驱动芯片源程序

    #define P_1668DAT_In RA0 //数据输入端口 #define P_1668DAT LATA0 //数据输出端口 #define P_1668CLK LATA1 #define P ...

  4. Spark入门到精通--(第二节)Scala编程详解基础语法

    Scala是什么? Scala是以实现scaleable language为初衷设计出来的一门语言.官方中,称它是object-oriented language和functional languag ...

  5. 汇编实验一 查看CPU和内存,用机器指令和汇编语言指令编程

    在装完DosBox环境之后,就可以用debug模式进行汇编指令的编程了. 实验内容:      首先用a指令进行数据的储存,然后用t命令进行调试. 可以发现ax,bx在不同的命令下发生了改变,cs的地 ...

  6. 【repost】如何学好编程 (精挑细选编程教程,帮助现在在校学生学好编程,让你门找到编程的方向)四个方法总有一个学好编程的方法适合你

    方法(一)编了这么久的程序,一直想找机会总结下其中的心得和方法,但回想我这段编程道路,又很难说清楚,如果按照我走过的所有路来说,显然是不可能的!当我看完了云风的<游戏之旅--编程感悟>和梁 ...

  7. LED恒流驱动IC汇总

    LED恒流驱动IC汇总 2017年09月22日 11:29:01 阅读数:569 这几天在找LED恒流驱动芯片,无意间在LED网论坛上发现这个帖子,分享给大家! LED恒流IC芯片大盘点        ...

  8. Python 从入门到精通 全程最佳实现梳理

    零零星星的时间,持续完善中...... 1.一些基础的必要信息归纳 Python 官网 www.python.org 发明者 吉多·范罗苏姆 发行时间 1991年,​26年前 编程泛型 多泛型.面向对 ...

  9. 基于arduino UNO R3+ESP8266控制LED灯的开关(无USB转TTL工具实现)

    最近由于项目要求,需要开发物联网云平台,而本人对硬件和通信技术一窍不通,故而选择arduino这一简单单片机来实现学习掌握基础的硬件和通信技术. 下面就是本人通过查阅大佬资料做的一个整合版本的通过手机 ...

随机推荐

  1. leecode之Implement strStr()

    KMP算法的实现: #include <stdio.h> #include <string.h> #include <stdlib.h> int strStr(ch ...

  2. 【BUAA软工】Beta阶段设计与计划

    一.需求再分析 根据用户反馈,是否发现之前的需求分析有偏差?为什么会出现这种偏差?beta阶段你们是否能真的分析清楚用户需求?如何做到? 根据alpha阶段同学们以及课程组老师和助教的使用反馈,总结起 ...

  3. Aliyun SSL 证书签发&安装

    目录 HTTPS SSL证书 签发 和 应用 证书购买 证书申请 证书安装 参考文档 HTTPS SSL证书 签发 和 应用 - SSL证书服务(Alibaba Cloud SSL Certifica ...

  4. istio sidecar流量处理机制及配置

    sidecar 介绍 在istio的流量管理等功能,都需要通过下发的配置应用到应用运行环境执行后生效,负责执行配置规则的组件在service mesh中承载应用代理的实体被称为side-car Ist ...

  5. [DB] MapReduce 例题

    词频统计(word count) 一篇文章用哈希表统计即可 对互联网所有网页的词频进行统计(Google搜索引擎的需求),无法将所有网页读入内存 map:将单词提取出来,对每个单词输入一个<wo ...

  6. Mysql数据库-多实例主从复制-主从故障详解

    一.mysql结构 1.实例 1.什么是单实例 一个进程 + 多个线程 + 一个预分配的内存空间 2.多实例 多个进程 + 多个线程 + 多个预分配的内存空间 ](http://shelldon.51 ...

  7. nginx location标签的匹配规则

    location的匹配 匹配符 匹配规则 优先级 = 精确匹配 1 ^~ 以某个字符串开头 2 ~ 区分大小写的正则匹配 3 ~* 不区分大小写的正则匹配 4 !~ 区分大小写不匹配的正则 5 !~* ...

  8. web技术开发桌面应用

    三款前端工程师桌面应用开发神器! http://mini.eastday.com/a/160630023107669-2.html 如果我告诉你,以后你们可以用前端语言(html5+css3+js)开 ...

  9. kylin优化的思想

    kylin的核心优势在于使用额外的空间存储预计算的结果,以换取查询时间的缩减. 所以我们要对额外的空间进行优化,并且在空间优化之后,cuboid无法完全命中时,对查询时间进行优化. 空间优化的思路就是 ...

  10. 四:net core(.NET 6)使用Filter过滤器拦截webapi方法

    Filter的基本用法 代码在最下方 使用filter过滤器,来实现拦截接口信息.咱们先新建一个项目,在原有的webapi上面,选择添加项目,添加一个类库项目: 我起个名字,就叫 Wsk.Core.F ...