
1. FZH1643到底解决什么问题显示驱动与按键扫描的合体方案1.1 传统方案为什么让人头大做过带LCD显示和按键输入产品的工程师应该都有过这种经历一颗单片机又要驱动LCD段码屏又要轮询按键矩阵最后IO口不够用要么换大封装主控要么上两颗芯片。LCD段码屏本身不复杂但它是持续性的外设公共端要轮流导通段码要按帧刷新。用MCU的IO直接驱动时主控几乎被显示刷新占满稍微加点别的功能刷新率就掉下来屏上出现闪烁。按键扫描同样烦矩阵键盘需要定时翻转电平、读取状态、滤波消抖和显示刷新挤在一起时时序冲突是家常便饭。如果不巧选的MCU型号不支持LCD驱动模块还得用HC164、74HC595之类的移位寄存器扩展电路板面积和BOM成本双双上涨。FZH1643这类芯片的思路很简单把显示驱动和键盘扫描这两件周期性、繁琐的事情从MCU手里接管过来主控只通过I2C接口做“一次性配置按需读写”。显示刷新和按键扫描的实时性负担全部由专用芯片承担。1.2 FZH1643的定位与核心特性FZH1643名字里的“1643”从规格逻辑上看属于中等规模的多功能LCD驱动控制类芯片。和纯LCD驱动器比如HT1621、TM1621这类相比它多了一个键盘扫描引擎和单纯的键盘编码芯片相比它又把LCD驱动集成进来了。一颗芯片同时管显示和按键这种组合在段码屏方案里是挺实用的升级。核心特性梳理下来主要集中在三块第一内置LCD偏压产生电路和公共端/段码驱动输出可以直接带段码液晶屏不需要外部负压电路第二内置键盘扫描逻辑支持一定数量的按键矩阵检测按下状态通过寄存器反映MCU直接读就行第三支持双模式切换可以在不同工作模式之间调整功耗和刷新行为。再加上I2C接口整个模块对外就4根线VCC、GND、SCL、SDA连接非常简单。我最早接触这类芯片是在一个温控器项目上。原来的方案是STM8S003 HT1621 独立按键扫描三颗芯片板子空间紧张得要命。换成带键盘扫描的LCD驱动芯片后按键矩阵并到驱动芯片上MCU瞬间解放出来BOM也精简了不少。这种“一颗芯片管两件事”的思路在做小家电、仪表盘、控制面板这类产品时优势非常明显。2. 双模式切换的设计逻辑选对模式功耗和显示效果才能兼顾2.1 两种工作模式到底差在哪里FZH1643的双模式通俗讲就是芯片内部工作节奏的不同。一种模式以较低的占空比运行显示刷新和键盘扫描不是每时每刻都在全力工作适合不需要频繁更新内容的静态显示场景另一种模式让内部时钟全速运行显示刷新率和键盘扫描频率都更高适合显示内容需要动态切换、或者按键响应需要更快的场景。以常见的段码LCD驱动逻辑来理解LCD的公共端COM是按顺序循环导通的一个扫描周期内每个公共端被点亮一次。如果内部RC振荡器频率固定扫描周期就取决于公共端数量和分频系数。模式切换本质上就是切换内部分频比或振荡器工作状态从而改变扫描频率和电流消耗。这里要注意一个容易被忽略的点LCD屏本身有个工作频率范围。公共端扫描频率太低屏会出现闪烁也就是人眼能感知的“刷屏感”扫描频率太高对比度反而下降显示会变淡。所以“双模式”不是简单的快慢两档而是针对不同面板和应用场景给出两种经过权衡的配置。实际选型时模式的选择要结合液晶屏的规格参数来看不是随便切。2.2 双模式对功耗和显示效果的直接影响在电池供电的产品里功耗是硬指标。比如一个手持式仪表大部分时间屏幕显示的是静止的数值几秒钟才更新一次这种情况完全没必要让LCD以最高频率刷新。低功耗模式降低扫描频率后显示保持稳定但驱动电流和内部逻辑功耗明显下降续航能拉长不少。工业控制面板这类插电设备功耗压力小但对显示响应速度和按键灵敏度要求高这时候切到全速模式更合适。我实测过类似芯片的功耗差异低功耗模式和正常模式之间整机电流差距可能达到几十微安到几百微安这个量级。对于用CR2032纽扣电池供电的产品来说这个差距直接决定电池能撑三个月还是一年。所以双模式切换不是花架子它是在功耗和性能之间给工程师提供了一个可以动态权衡的旋钮。当然模式切换也不是没有代价。低功耗模式下键盘扫描频率跟着降低按键按下到被识别的时间会变长。如果产品对按键响应速度很敏感比如需要快速连击的设备就得评估这个延迟是否可接受。很多时候合理的做法是默认低功耗模式MCU检测到外部中断或定时唤醒后再临时切到全速模式处理完再切回来。2.3 模式选择的实战建议应用场景推荐模式原因电池供电的温湿度计、电表低功耗模式显示内容基本静态重点考虑续航多功能手环、小型手持设备低功耗模式 按键触发切高速平时省电按键唤醒后快速响应家电控制面板、空气净化器全速模式插电供电显示刷新和按键响应优先工业仪表、车载设备全速模式或根据刷新率要求配置环境稳定对响应速度和可靠性要求高需要特别提醒的是模式切换后一定要重新检查LCD的偏压配置。因为扫描频率变了液晶的等效阻抗特性也会发生变化如果偏压还是按原来的配置可能出现对比度异常。我见过有同事切换模式后发现字迹变淡排查了半天最后发现是偏压设置没跟着调整。3. 硬件电路设计要点I2C外围、显示偏压与键盘扫描布局3.1 I2C接口电路设计的关键细节最近在很多方案交流里看到“对外I2C接口电路设计”这个说法的讨论放在FZH1643这种芯片上核心问题就是主控和驱动芯片之间的连接可靠性。I2C是开漏结构SCL和SDA两根线必须接上拉电阻到VCC这点大多数人都知道但阻值的选取经常被随意对待。上拉电阻太小总线灌电流大低电平电压可能超过芯片VIH/VIL阈值导致通信不稳定上拉电阻太大信号上升沿变缓高速通信时波形畸形。对于FZH1643这种通信速率在几百kHz级别的芯片常用的上拉阻值在4.7kΩ到10kΩ之间。如果I2C总线上还挂了其他设备需要把所有设备的输入电容和走线寄生电容都算进去总线上拉电阻要适当减小。我一般先用10kΩ做原型验证量产时根据示波器实测波形再优化。除了上拉电阻I2C地址的选择也要注意。FZH1643通常通过地址引脚的电平组合来配置I2C设备地址这样同一总线上可以挂多颗芯片分别驱动不同屏或不同键盘区域。设计时地址引脚不要直接悬空要明确接高或接低避免上电瞬间电平不确定导致地址漂移。另外强烈建议在SCL和SDA线上各串联一个几十欧姆的小电阻放在主控端或者芯片端都行。这个电阻能抑制总线上的振铃和过冲尤其在排线连接、线缆较长的场景下效果明显。调试中发现I2C偶发通信异常时这个串阻往往是救命稻草。3.2 显示部分的外围电路与偏压配置LCD驱动芯片的输出级一般分为公共端COM和段码端SEG。FZH1643会提供若干个COM和SEG引脚通过它们的组合驱动一定数量的LCD段位。比如4个COM配合多个SEG可以驱动几十个段位足够显示时间、温度、电量、状态图标等信息。液晶屏工作需要交流驱动信号公共端和段码端之间的电压差需要周期性换向防止液晶材料极化损坏。芯片内部通过偏压电路产生多级电压比如1/2偏压或1/3偏压具体选哪种取决于LCD屏的驱动 duty 和液晶阈值电压。这个参数一般在液晶屏规格书里有明确标注比如“1/4 duty1/3 bias”意思就是4个公共端采用1/3偏压。实际电路上芯片的偏压引脚VLC、C1、C2这类需要接电容到地用来稳定内部电荷泵或分压网络的电压。电容容值不一定要很大0.1μF到1μF的陶瓷电容通常够用但要放得离芯片引脚尽量近走线要短而粗否则显示会出现水波纹或者亮度不均。公共端和段码端的走线还有一个容易踩坑的地方COM线是逐个轮流通电的电流变化比SEG线更剧烈如果COM走线过长且没有参考地平面辐射噪声可能干扰附近的模拟电路。我做过一个产品LCD排线从驱动芯片到屏体要走大概5厘米结果天线效应明显干扰了旁边的NTC温度采样。后来把COM线和SEG线交错排布并在LCD驱动芯片电源引脚加了磁珠才算压下去。3.3 键盘扫描电路的连接要点FZH1643的键盘扫描部分典型接法是矩阵式排布。芯片提供若干扫描行和扫描列按键接在行列交叉点上。扫描时芯片按顺序给行线送扫描信号列线读取输入状态行列同时导通的交叉点就是按下按键的位置。矩阵键盘的硬件设计有几个要点。第一按键引脚建议并一个小电容比如100pF到1nF到地做硬件级别的防抖和抗静电。尤其是应用在家庭环境里人体静电通过按键进入芯片虽然芯片有ESD保护但外围多一道防护总归更稳妥。第二行线和列线上不需要串联电阻但如果是薄膜按键或者长走线可以加一个几kΩ的限流电阻防止按键老化后接触电阻变大导致误判。第三按键布局要避免跨接在强干扰源附近比如变压器、继电器这些会产生火花或电磁脉冲的器件否则扫描结果会神鬼莫测。还有一个很多新手会忽略的问题未使用的键盘扫描引脚不能悬空不管。有些芯片在扫描模式下会把未用引脚配置为输入悬空引脚会收到随机噪声可能被误判为按键事件。设计时要么把未用引脚接固定的高或低电平要么通过寄存器配置为禁用。这一点在FZH1643这类芯片上同样适用我在项目评审时经常提醒硬件工程师检查。4. 软件驱动与调试从寄存器配置到键盘数据读取4.1 驱动框架与I2C读写流程FZH1643对外提供的是标准的I2C从设备接口主控作为主机发起通信。芯片内部寄存器按功能划分包括系统配置寄存器、LCD显示寄存器、键盘扫描结果寄存器等。驱动软件要做的事情非常明确先复位芯片然后按需配置工作模式、偏压和占空比再往显示寄存器写段码数据最后周期性地读取键盘寄存器。I2C读写流程上这类芯片通常是“设备地址 寄存器地址 数据”的结构。写操作时主机发送设备地址写方向然后发送寄存器地址再连续写入数据字节读操作时主机先发设备地址写方向和寄存器地址然后重新发送设备地址读方向再从总线上读取数据。这里有个实操细节很多LCD驱动芯片支持“自动地址递增”模式也就是写入时寄存器地址会自动加一方便连续写入一整块显示缓冲区。比如显示缓冲区有十几个字节代表屏幕上不同位置的段码状态开启自动递增后一次I2C写操作就能全部更新效率高很多。FZH1643这类芯片也延续了这个习惯用法实际配置时记得先查清楚寄存器组的地址映射和递增行为。4.2 初始化配置流程代码示例以下以伪C代码为例展示FZH1643的典型初始化流程。实际寄存器地址和位定义以芯片手册为准但流程逻辑可以照搬。// 伪代码FZH1643初始化 #define FZH1643_ADDR_W 0xA0 // 设备地址写方向实际值以手册为准 #define FZH1643_ADDR_R 0xA1 void fzh1643_init(void) { // 1. 芯片软复位 i2c_write_reg(FZH1643_ADDR_W, REG_SYS_CTRL, 0x01); // 进入正常模式 // 2. 配置显示参数 // 假设系统配置寄存器低3位控制偏压和占空比 // 0x03 1/4 duty, 1/3 bias以LCD屏规格书为准 i2c_write_reg(FZH1643_ADDR_W, REG_DISPLAY_CTRL, 0x03); // 3. 配置工作模式双模式切换 // 假设模式寄存器高两位00低功耗模式01全速模式 i2c_write_reg(FZH1643_ADDR_W, REG_MODE_CTRL, 0x40); // 切到全速模式 // 4. 打开显示输出 i2c_write_reg(FZH1643_ADDR_W, REG_DISPLAY_ON, 0x01); } void fzh1643_display_update(const uint8_t *buf, uint8_t len) { // 自动地址递增模式从显示缓冲区起始地址连续写入 i2c_write_burst(FZH1643_ADDR_W, REG_DISPLAY_RAM_START, buf, len); } uint8_t fzh1643_get_key(void) { // 读取键盘扫描结果寄存器 uint8_t key_data i2c_read_reg(FZH1643_ADDR_R, REG_KEY_STATUS); return key_data; }初始化流程的核心是顺序先复位和使能芯片再配置显示参数然后设置工作模式最后打开显示输出。这个顺序不要乱。如果先开显示再配参数屏上可能闪一下乱码。特别是在低功耗模式下复位到显示稳定需要一定时间要在主控侧加适当的延时。4.3 键盘数据的读取与消抖处理键盘扫描的数据从芯片寄存器读出来后并不是直接就能当按键值用。首先机械按键存在抖动问题按键按下的一瞬间触点会快速通断几次延续几毫秒到十几毫秒不等如果每次都当作有效按键处理会出现一次按下却触发两次、三次的情况。常用的软件消抖方法是“延迟确认法”读到一个按键信号变化后先记录当前状态等10到20毫秒再读一次如果状态和之前一致才认为按键状态稳定再执行对应的按键逻辑。这个延时可以用MCU的定时器实现也可以在主循环里用非阻塞延时轮询。其次读到的键盘寄存器通常是位映射每个bit对应一个按键位置。比如低四位可能对应第一行的四个列高四位对应第二行。代码里要按实际硬件连接做位映射把寄存器值翻译成逻辑上的按键编号。这一步做错了效果就是“按A键出来B键的响应”我调试时踩过这样的坑后来总结了一个小工具函数把读到的原始值和按键映射表做个查找直接输出逻辑键值方便多了。另外FZH1643这类带键盘扫描的芯片有些还支持“按键中断”功能也就是检测到按键事件时通过某个引脚输出一个脉冲信号或者置位状态寄存器里的标志位。利用这个特性可以让MCU在按键事件发生时才去读I2C总线平时不轮询进一步降低功耗。如果你的MCU支持外部中断建议把按键事件引脚接到外部中断输入上实现“按需读取”。5. 常见问题与排查技巧实际项目里踩过的坑5.1 首帧花屏和显示噪点问题花屏是最容易在原型阶段遇到的现象。上电后屏幕显示乱码或随机段位亮起原因通常有几个方向芯片初始化时序不对、显示缓冲区初始值不是全零、偏压电容充电未完成。排查思路很直接先检查上电后MCU发出第一条配置命令之前芯片的复位引脚是否已经稳定释放VCC是否已经达到工作电压。如果电源上升速度很慢芯片可能在一个不稳定的电压下开始工作状态机错乱显示自然乱。解决方法是增大电源电容或用一个复位IC。另外程序里初始化时最好先向显示缓冲区全部写入0x00确保所有段位处于熄灭状态再慢慢点亮需要的段位这样至少不会出现随机亮段。我遇到过一种隐蔽情况花屏只在低温环境出现。原因是偏压电容在低温下等效阻抗增加内部偏压建立变慢芯片还没准备好就开始驱动LCD。排查时用示波器抓偏压引脚的电压上升波形发现确实比常温慢了一倍多。后来把偏压电容从0.1μF换成1μF并加长了初始化后的延时问题解决。5.2 按键误触发和漏键问题按键误触发最常见的原因是I2C读到的是脏数据。键盘扫描寄存器在硬件层面是持续更新的MCU读取的瞬间如果发生寄存器更新理论上可能读到不一致的组合值。解决方法是连续读两次对比一致后才采用或者在芯片支持的情况下读取后清除状态标志确保读到的是一帧完整数据。漏键问题往往出在键盘扫描频率偏低的时候。低功耗模式下扫描周期变长如果按键按下的时间很短比如快速连击可能正好落在两次扫描之间扫描逻辑根本没检测到这次按键。这种情况要么短期通过提高扫描频率解决要么在应用层接受一定的最小按键时间限制向用户说明。还有一种很经典的问题按键按下后状态寄存器一直保持“按下”即使松手也清除不掉。这通常不是芯片问题而是硬件上按键到芯片引脚的走线太长产生了寄生电容导致信号低电平维持时间被拉长。按键引脚上并的电容过大也有类似效果。检查一下原理图上的滤波电容是不是选得太大如果从100pF换到1nF后出现这种问题那就减小它。5.3 功耗异常和时钟配置问题双模式切换后如果发现整机功耗没降下来先别怀疑芯片有问题大概率是模式切换没真正生效或者MCU侧外围器件还在全速跑。我用万用表串在电源回路里测过电流切换模式后电流只下降了一点点查代码发现模式寄存器写入的值被后续初始化又覆盖回去了。这种“配置被覆盖”的问题在代码里非常隐蔽排查时最好在模式切换函数的入口和出口各打一个断点看看寄存器值是否被中间的其他调用改动。如果低功耗模式下电流确实降了但LCD显示变得闪烁那大概率是扫描频率降到了人眼可感知的范围。这时不要一味调高频率先确认LCD屏的规格书里最低刷新率要求。有些低端液晶屏在低刷新率下会出现“交叉效应”就是相邻段位互相干扰看起来像鬼影。遇到这种情况适当提高偏压或者调整扫描频率到一个折中值一般能缓解。以下是用一张速查表整理我在调试这类芯片时遇到的高频问题现象可能原因排查方式上电后花屏初始化时序不正确显示缓冲区未清零检查VCC和复位时序先写全0再配置I2C通信失败上拉电阻过大或过小地址引脚悬空示波器抓波形检查地址引脚电平显示对比度低偏压配置和LCD屏不匹配核对LCD规格书调整偏压寄存器按键无响应键盘扫描引脚配置错误未用引脚悬空检查引脚复用配置拉高或拉低未用引脚功耗居高不下双模式切换未生效外部器件持续耗电分模块测量整机电流检查配置写入顺序按键偶发误触发读取到脏数据走线干扰连续读两次取稳定值优化布局FZH1643这类带键盘扫描的LCD驱动芯片最大的价值在于把“显示刷新”和“按键扫描”这两个外设负担从MCU身上分解掉让主控专注在业务逻辑上。用对它你的系统会清爽很多。我个人在实际项目里的体会是这类芯片的上手难度不在于I2C通讯本身而在于你是否愿意花时间理解LCD驱动时序和键盘扫描背后的硬件逻辑。先把示波器接上把SCL、SDA、COM端的波形都看明白了再动手写软件基本能少走一半弯路。希望这篇内容对准备上手FZH1643的朋友有帮助。