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. 推荐一些学习MySQL的资源

    前言: 在日常工作与学习中,无论是开发.运维.还是测试,对于数据库的学习是不可避免的,同时也是日常工作的必备技术之一.在互联网公司,开源数据库用得比较多的当属MySQL了,相信各位小伙伴关注我的原因也 ...

  2. copy函数与ostream_iterator、reverse_iterator

    #include <iostream> #include <iterator> #include <vector> int main() { using names ...

  3. 发布声明$\beta$

    一.新功能 \(\beta\)阶段集中开发了3大核心功能:支持模块的嵌套.模型市场.模型推理,这三项基本上都是从零开始.徒手开发的功能,没有轮子可以参照,因此也不具有可以对比的先前版本. 除此之外,开 ...

  4. Docker Swarm(三)Service(服务)分配策略

    Service的分配原則 預設分散至多個nodes上 使用率較低的node優先配置 使用者可自行定義此分配模式 Service分配的3種方式 Service Constraints (服务约束) 参考 ...

  5. Linux是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的性能稳定的操作系统,可免费使用并自由传播。

    Linux是一个基于POSIX和Unix的多用户.多任务.支持多线程和多CPU的性能稳定的操作系统,可免费使用并自由传播. Linux是众多操作系统之一 , 目前流行的服务器和 PC 端操作系统有 L ...

  6. dstat命令

    dstat命令 dstat命令是一个用来替换vmstat.iostat.netstat.nfsstat和ifstat这些命令的工具,是一个全能系统信息统计工具.与sysstat相比,dstat拥有一个 ...

  7. 说明位图,矢量图,像素,分辨率,PPI,DPI?

    说明位图,矢量图,像素,分辨率,PPI,DPI? 显示全部 关注者 28 被浏览 7,031 关注问题写回答 ​邀请回答 ​添加评论 ​分享 ​     2 个回答 默认排序 刘凯   21 人赞同了 ...

  8. RabbitMQ 集群原理

    RabbitMQ默认集群原理 rabbitmq 本身是基于erlang编写,erlang语言天生具备分布式的特性(通过同步Erlang集群各节点的erlang cookie实现),RabbiteMQ天 ...

  9. NLP文本分类

    引言 其实最近挺纠结的,有一点点焦虑,因为自己一直都期望往自然语言处理的方向发展,梦想成为一名NLP算法工程师,也正是我喜欢的事,而不是为了生存而工作.我觉得这也是我这辈子为数不多的剩下的可以自己去追 ...

  10. Pycharm搜索导航之文件名、符号名搜索

    1.准备一个工程 向你的工程中添加一个Python文件,并输入一些源码,例如: 2.转到对应文件.类.符号 Pycharm提供的一个很强力的功能就是能够根据名称跳转到任何文件.类.符号所在定义位置. ...