YL1650 LED驱动芯片详解:从原理到实战应用(附51单片机驱动代码)

在嵌入式开发和家电产品设计中,LED数码管显示和按键扫描是最常见的人机交互需求之一。传统的方案往往需要占用大量MCU IO口,而且软件实现起来比较繁琐。今天给大家介绍一款集成度非常高的LED驱动控制专用芯片------YL1650,它不仅能驱动8段4位共阴极LED数码管,还内置了7×4按键扫描功能,只需要两根线就能和MCU通信,非常适合小家电、工业控制面板等场景。

本文将从芯片特性、引脚定义、通信协议到实际编程应用,全方位带你玩转YL1650。


一、YL1650 芯片概述

YL1650是远乐科技推出的一款带键盘扫描电路接口的LED驱动控制专用电路。内部集成了MCU数字接口、数据锁存器、LED驱动、键盘扫描、辉度调节等电路,性能稳定,抗干扰能力强,可适应24小时长期连续工作的应用场合。

1.1 主要特性

特性项 参数说明
显示模式 8段 × 4位(共阴极)
段驱动电流 ≥ 25mA
位驱动电流 ≥ 150mA
亮度控制 8级亮度可调
键盘扫描 7×4bit,支持4个组合按键
通信接口 高速两线式串行接口(类I2C)
内置电路 时钟振荡电路、上电复位电路
电源电压 2.5V ~ 5.5V(宽电压支持)
工作温度 -40℃ ~ +85℃
封装形式 DIP16 / SOP16

1.2 典型应用领域

  • 微波炉、电磁炉、热水器等家电产品显示面板
  • 小型工业控制仪表
  • 数字温度计、计时器
  • 智能插座、开关面板
  • 各种需要LED显示+按键输入的嵌入式项目

二、引脚排列与功能说明

YL1650采用16引脚封装,下面我们来逐一了解每个引脚的功能。

2.1 引脚排列图

复制代码
          ┌─────────────┐
   DIG1  ─┤ 1        16 ├─ DP/KP
    CLK  ─┤ 2        15 ├─ G/KI7
    DIO  ─┤ 3        14 ├─ F/KI6
    GND  ─┤ 4        13 ├─ E/KI5
   DIG2  ─┤ 5        12 ├─ D/KI4
   DIG3  ─┤ 6        11 ├─ C/KI3
   DIG4  ─┤ 7        10 ├─ VDD
  A/KI1  ─┤ 8         9 ├─ B/KI2
          └─────────────┘

2.2 引脚功能详解

引脚号 符号 名称 功能说明
1 DIG1 位/键扫描输出 LED位驱动输出(低电平有效),键盘扫描输出(高电平有效)
2 CLK 时钟输入 两线串行接口时钟输入,内置上拉电阻
3 DIO 数据输入/输出 两线串行接口数据输入输出,内置上拉电阻
4 GND 接地端 电源地
5 DIG2 位/键扫描输出 同DIG1
6 DIG3 位/键扫描输出 同DIG1
7 DIG4 位/键扫描输出 同DIG1
8 A/KI1 段驱动/键扫输入 LED段A驱动输出(高电平有效),键扫输入KI1
9 B/KI2 段驱动/键扫输入 LED段B驱动输出,键扫输入KI2
10 VDD 电源端 正电源,建议就近接滤波电容
11 C/KI3 段驱动/键扫输入 LED段C驱动输出,键扫输入KI3
12 D/KI4 段驱动/键扫输入 LED段D驱动输出,键扫输入KI4
13 E/KI5 段驱动/键扫输入 LED段E驱动输出,键扫输入KI5
14 F/KI6 段驱动/键扫输入 LED段F驱动输出,键扫输入KI6
15 G/KI7 段驱动/键扫输入 LED段G驱动输出,键扫输入KI7
16 DP/KP 段/位输出 LED小数点DP段输出,键盘标志输出

💡 注意:AG和DP这8个引脚是复用的,既作为LED段驱动输出,也作为键盘扫描的输入线(KI1KI7 + KP)。DIG1~DIG4同样复用,既是位选驱动,也是键扫行输出。


三、电气特性参数

3.1 极限参数

参数 符号 额定值 单位
电源电压 VDD -0.5 ~ +5.5 V
段驱动输出电流 IO1 0 ~ 30 mA
位驱动输出电流 IO2 0 ~ 150 mA
工作环境温度 Tamb -40 ~ +105
储存温度 Tstg -55 ~ +125
ESD静电(HBM) --- ±7.5K V

3.2 关键电气特性

  • 静态电流:典型值 300μA,最大 600μA
  • 睡眠电流:典型值 12μA,最大 40μA(低功耗模式非常省电)
  • 上电复位门限:典型值 2.2V
  • 显示扫描周期:典型值 4ms
  • 按键响应时间:典型值 13ms
  • 数据传输速率:最高 4Mbps

四、通信协议详解

YL1650采用类I2C的两线串行接口,但和标准I2C有一些区别,使用时需要特别注意。

4.1 通信基本规则

  1. CLK上升沿锁存数据:当CLK为高电平时,DIO信号必须保持稳定,不能变化
  2. DIO在CLK低电平时变化:只有CLK为低电平时,才能改变DIO上的数据
  3. 起始条件:CLK为高电平时,DIO由高变低
  4. 停止条件:CLK为高电平时,DIO由低变高
  5. 高位先传:数据和命令传输时,先传高位,再传低位
  6. ACK应答:每传输完8位数据后,第9个时钟芯片会拉低DIO作为应答信号

4.2 数据传输格式

指令传输为16位格式:

复制代码
起始条件 → 命令字节(8bit) → ACK → 数据字节(8bit) → ACK → 停止条件

4.3 时序图示意

复制代码
     ┌───┐   ┌───┐   ┌───┐
CLK  │   │   │   │   │   │
     ┘   └───┘   └───┘   └──
         ┌───────┐
DIO  ────┘       └───────
         ↑           ↑
       起始        停止

五、显示控制编程

5.1 显示寄存器地址映射

YL1650的显示RAM有4个地址,分别对应4位数码管:

地址 对应位 段数据位(B0~B7)
68H DIG1(第1位) B0=A, B1=B, B2=C, B3=D, B4=E, B5=F, B6=G, B7=DP
6AH DIG2(第2位) 同上
6CH DIG3(第3位) 同上
6EH DIG4(第4位) 同上

⚠️ 重要提示:上电之后,必须先往RAM写入数据,然后再打开显示,否则可能出现乱码或闪烁。

5.2 控制指令

YL1650的控制指令分为系统指令显示指令两部分,发送显示指令前必须先发送系统指令。

5.2.1 系统指令
复制代码
字节格式:0100 1000B = 0x48

这是固定的系统参数设置指令,每次设置显示参数前都要先发这个字节。

5.2.2 显示指令

显示指令是一个字节,各个位的含义如下:

符号 功能 说明
B0 D 显示开关 1=显示开,0=显示关
B1 --- 保留 ---
B2 W 工作/睡眠 1=睡眠模式,0=工作模式
B3 --- 保留 ---
B4 S 段显示设置 1=7段显示,0=8段显示
B5~B7 BR2:0 亮度设置 000=8级(最暗)~ 111=1级(最亮)
亮度设置对照表
BR2:0 亮度等级
000 第8级(最暗)
001 第1级
010 第2级
011 第3级
100 第4级
101 第5级
110 第6级
111 第7级(最亮)

注意:这里的亮度等级编号有点反直觉,000对应最暗的第8级,111对应最亮的第7级,编程时别搞反了。


六、键盘扫描功能

6.1 键扫矩阵

YL1650支持7×4的按键矩阵,即7条列线(KI1KI7)和4条行线(DIG1DIG4),最多可以接28个按键,另外还支持4个组合按键(KI1+KI2)。

复制代码
        DIG1  DIG2  DIG3  DIG4
  KI1    ●     ●     ●     ●
  KI2    ●     ●     ●     ●
  KI3    ●     ●     ●     ●
  KI4    ●     ●     ●     ●
  KI5    ●     ●     ●     ●
  KI6    ●     ●     ●     ●
  KI7    ●     ●     ●     ●

6.2 读按键指令

读取按键数据的指令格式:

复制代码
0100 1XX1B

其中XX位可以忽略。

6.3 按键数据格式

读按键时,先发送读命令(9位时钟,第9位ACK=0),然后读取一个字节的按键数据(9位时钟,第9位ACK=1)。

按键按下时的输出值格式:01_SSS_DDD

  • SSS:KI编号(000=KI1, 001=KI2, ..., 110=KI7, 111=组合键KI1+KI2)
  • DDD:DIG编号(100=DIG1, 101=DIG2, 110=DIG3, 111=DIG4)

按键松开时的输出值格式:00_SSS_DDD

无按键时的默认值:00_101_110 = 0x2E

6.4 组合键说明

YL1650支持KI1和KI2针对同一个DIGx的组合按键功能。组合键的优先级最高,如果多个键同时按下,按键代码较小的优先。

💡 硬件设计提示:在使用组合键时,需要对KI1和KI2相互之间进行阻隔处理(比如串接二极管),避免串键。


七、典型应用电路

7.1 参考电路图

复制代码
         VDD
          │
         ┌┴┐ 47uF
         └┬┘
          ├───────────┐
         ┌┴┐ 104     │
         └┬┘         │
          │          │
    ┌─────┴─────┐    │
    │  YL1650   │    │
    │           │    │
CLK─┤2         10├────┘
    │           │
DIO─┤3         4 ├─ GND
    │           │
    │ 1   5 6 7 │
    └─┬───┬─┬─┬─┘
      │   │ │ │
     DIG1~DIG4  →  数码管位选(共阴极)
     
    ┌─┬─┬─┬─┬─┬─┬─┐
    │8 9 11 12 13 14 15 16│
    └─┴─┴──┴──┴──┴──┴──┴──┘
     A B C  D  E  F  G  DP
     │ │ │  │  │  │  │  │
     └─┴─┴──┴──┴──┴──┴──┴──→ 数码管段选

7.2 硬件设计注意事项

  1. 电源滤波:VDD与GND之间的滤波电容(104和47uF电解)应尽量靠近YL1650芯片
  2. 通信端口:建议CLK和DIO各串接220Ω电阻,提高抗干扰能力
  3. 按键矩阵:DIG1~DIG4之间建议串接2K电阻,防止按键扫描时电流过大
  4. 上拉电阻:CLK和DIO内部已带上拉,一般不需要外部上拉,但在干扰大的场合可以额外加

八、51单片机驱动代码示例

下面给大家提供一份基于51单片机的YL1650驱动代码,包含显示和按键扫描功能。

8.1 引脚定义

复制代码
#include <reg52.h>

sbit CLK = P2^0;   // 时钟线
sbit DIO = P2^1;   // 数据线

8.2 底层通信函数

复制代码
// 起始信号
void I2C_Start(void)
{
    CLK = 1;
    DIO = 1;
    DIO = 0;    // CLK高电平时,DIO由高变低
    CLK = 0;
}

// 停止信号
void I2C_Stop(void)
{
    CLK = 0;
    DIO = 0;
    CLK = 1;
    DIO = 1;    // CLK高电平时,DIO由低变高
}

// 发送一个字节,返回ACK状态
bit I2C_SendByte(unsigned char dat)
{
    unsigned char i;
    bit ack;
    
    for(i = 0; i < 8; i++)
    {
        CLK = 0;
        if(dat & 0x80)    // 高位先传
            DIO = 1;
        else
            DIO = 0;
        dat <<= 1;
        CLK = 1;          // 上升沿锁存数据
    }
    
    // 第9个时钟,读取ACK
    CLK = 0;
    DIO = 1;              // 释放总线
    CLK = 1;
    ack = DIO;            // 读取ACK状态(0=应答)
    CLK = 0;
    
    return ack;
}

// 读取一个字节
unsigned char I2C_ReadByte(void)
{
    unsigned char i, dat = 0;
    
    DIO = 1;              // 释放总线,准备读取
    
    for(i = 0; i < 8; i++)
    {
        dat <<= 1;
        CLK = 0;
        CLK = 1;
        if(DIO)
            dat |= 0x01;
    }
    
    // 第9个时钟,发送ACK(主机这边不需要处理,芯片会自动发ACK)
    CLK = 0;
    CLK = 1;
    CLK = 0;
    
    return dat;
}

8.3 显示控制函数

复制代码
// 共阴极数码管段码表(0~9, A~F, 全灭)
unsigned char code SEG_TABLE[] = {
    0x3F, 0x06, 0x5B, 0x4F, 0x66,  // 0 1 2 3 4
    0x6D, 0x7D, 0x07, 0x7F, 0x6F,  // 5 6 7 8 9
    0x77, 0x7C, 0x39, 0x5E, 0x79,  // A b C d E
    0x79, 0x00                      // F 灭
};

// 写显示数据到指定地址
void YL1650_WriteData(unsigned char addr, unsigned char data)
{
    I2C_Start();
    I2C_SendByte(addr);
    I2C_SendByte(data);
    I2C_Stop();
}

// 设置显示命令(亮度、开关、模式等)
void YL1650_SetDisplay(unsigned char cmd)
{
    I2C_Start();
    I2C_SendByte(0x48);   // 系统指令
    I2C_SendByte(cmd);    // 显示指令
    I2C_Stop();
}

// 初始化YL1650
void YL1650_Init(void)
{
    // 先清屏
    YL1650_WriteData(0x68, 0x00);
    YL1650_WriteData(0x6A, 0x00);
    YL1650_WriteData(0x6C, 0x00);
    YL1650_WriteData(0x6E, 0x00);
    
    // 开显示,8段模式,第4级亮度
    YL1650_SetDisplay(0x81);  // 1000 0001B
}

// 显示一个4位数字
void YL1650_DisplayNum(unsigned int num)
{
    unsigned char buf[4];
    
    buf[0] = SEG_TABLE[num / 1000 % 10];       // 千位
    buf[1] = SEG_TABLE[num / 100 % 10];        // 百位
    buf[2] = SEG_TABLE[num / 10 % 10];         // 十位
    buf[3] = SEG_TABLE[num % 10];              // 个位
    
    YL1650_WriteData(0x68, buf[0]);
    YL1650_WriteData(0x6A, buf[1]);
    YL1650_WriteData(0x6C, buf[2]);
    YL1650_WriteData(0x6E, buf[3]);
}

8.4 按键扫描函数

复制代码
// 读取按键值
unsigned char YL1650_ReadKey(void)
{
    unsigned char key_val;
    
    I2C_Start();
    I2C_SendByte(0x49);   // 读按键指令 0100 1001B
    key_val = I2C_ReadByte();
    I2C_Stop();
    
    return key_val;
}

// 解析按键值,返回按键编号(1~28,0表示无按键)
unsigned char YL1650_GetKey(void)
{
    unsigned char val, ki, dig;
    
    val = YL1650_ReadKey();
    
    // 判断是否有按键按下(bit6=1表示按下)
    if(!(val & 0x40))
        return 0;   // 无按键
    
    // 解析KI和DIG
    ki = (val >> 3) & 0x07;    // KI编号 0~6
    dig = val & 0x07;          // DIG编号 4~7
    
    // 转换为按键编号 1~28
    if(dig >= 4 && dig <= 7 && ki <= 6)
    {
        return ki * 4 + (dig - 3);
    }
    
    return 0;
}

8.5 主函数示例

复制代码
void main(void)
{
    unsigned int count = 0;
    unsigned char key;
    
    YL1650_Init();
    
    while(1)
    {
        // 显示计数器
        YL1650_DisplayNum(count);
        
        // 扫描按键
        key = YL1650_GetKey();
        if(key == 1)       // 按键1:加
        {
            count++;
            if(count > 9999) count = 0;
        }
        else if(key == 2)  // 按键2:减
        {
            if(count > 0) count--;
        }
        
        // 简单延时
        delay_ms(10);
    }
}

九、常见问题与调试技巧

9.1 显示乱码或不亮

  1. 检查上电顺序:必须先写显示数据,再开显示
  2. 检查共阴共阳:YL1650是共阴极驱动,不要接反了
  3. 检查电源电压:确保VDD在2.5V~5.5V范围内
  4. 检查通信时序:用逻辑分析仪看CLK和DIO波形是否正确

9.2 按键不灵敏或误触发

  1. 按键消抖:YL1650内部有硬件消抖,但软件层面建议再加一层判断
  2. 检查硬件连接:按键矩阵的行列不要接反
  3. 串接电阻:DIG线上串2K电阻,减少干扰

9.3 亮度调节无效

  1. 检查显示指令的BR位是否正确设置
  2. 注意亮度等级编号:000最暗,111最亮(第7级)
  3. 确保先发送系统指令0x48,再发送显示指令

十、总结

YL1650是一款性价比非常高的LED驱动+按键扫描二合一芯片,主要优势在于:

节省IO口 :只需要2根线就能驱动4位数码管+28个按键 ✅ 集成度高 :内置振荡、复位、驱动,外围电路极其简单 ✅ 低功耗 :睡眠模式仅12μA,非常适合电池供电产品 ✅ 宽电压 :2.5V~5.5V,兼容3.3V和5V系统 ✅ 抗干扰强:工业级温度范围,适合各种恶劣环境

对于小家电、控制面板、仪表显示等应用场景,YL1650能大大简化硬件设计,降低BOM成本,是一款非常值得推荐的芯片。

如果你正在做相关的项目,不妨试试这款芯片,相信会给你带来惊喜。有任何问题欢迎在评论区交流讨论!

相关推荐
神电测控4 小时前
新品发布:32通道50MS/s同步并行14位采集模块PG-FMC9249(支持任意FPGA/ZYNQ,兼容LabVIEW FPGA软件开发)
fpga开发·labview·ni·神电测控·王电令·ad9249·32通道
Freak嵌入式5 小时前
版本混乱 / 依赖缺失?uPyPi:MicroPython 版 PyPI,彻底解决库管理混乱
linux·服务器·数据库·单片机·嵌入式硬件·性能优化·依赖倒置原则
wuyk5555 小时前
77.嵌入式 C 语言中 enum 枚举的工程化实践:告别魔法数字,提升代码可维护性
c语言·开发语言·stm32·单片机·嵌入式硬件
义嘉泰5 小时前
XT25F128F-W Flash芯片全面解析
人工智能·嵌入式硬件·芯片
QH139292318805 小时前
Keysight N9917B N9918B手持式综合微波分析仪
网络·科技·嵌入式硬件·集成测试·信息与通信
Drgfd5 小时前
半导体国产替代进入“深水区”:决战设备、材料、IP三大高地
网络·fpga开发
longxingiot6 小时前
轻量化单片机数传终端降低物联网开发门槛
单片机·嵌入式硬件·物联网
亿道电子Emdoor7 小时前
【Arm】MSP和PSP的区别简介
c语言·arm开发·单片机·mcu