在嵌入式开发和家电产品设计中,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 通信基本规则
- CLK上升沿锁存数据:当CLK为高电平时,DIO信号必须保持稳定,不能变化
- DIO在CLK低电平时变化:只有CLK为低电平时,才能改变DIO上的数据
- 起始条件:CLK为高电平时,DIO由高变低
- 停止条件:CLK为高电平时,DIO由低变高
- 高位先传:数据和命令传输时,先传高位,再传低位
- 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 硬件设计注意事项
- 电源滤波:VDD与GND之间的滤波电容(104和47uF电解)应尽量靠近YL1650芯片
- 通信端口:建议CLK和DIO各串接220Ω电阻,提高抗干扰能力
- 按键矩阵:DIG1~DIG4之间建议串接2K电阻,防止按键扫描时电流过大
- 上拉电阻: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 显示乱码或不亮
- 检查上电顺序:必须先写显示数据,再开显示
- 检查共阴共阳:YL1650是共阴极驱动,不要接反了
- 检查电源电压:确保VDD在2.5V~5.5V范围内
- 检查通信时序:用逻辑分析仪看CLK和DIO波形是否正确
9.2 按键不灵敏或误触发
- 按键消抖:YL1650内部有硬件消抖,但软件层面建议再加一层判断
- 检查硬件连接:按键矩阵的行列不要接反
- 串接电阻:DIG线上串2K电阻,减少干扰
9.3 亮度调节无效
- 检查显示指令的BR位是否正确设置
- 注意亮度等级编号:000最暗,111最亮(第7级)
- 确保先发送系统指令0x48,再发送显示指令
十、总结
YL1650是一款性价比非常高的LED驱动+按键扫描二合一芯片,主要优势在于:
✅ 节省IO口 :只需要2根线就能驱动4位数码管+28个按键 ✅ 集成度高 :内置振荡、复位、驱动,外围电路极其简单 ✅ 低功耗 :睡眠模式仅12μA,非常适合电池供电产品 ✅ 宽电压 :2.5V~5.5V,兼容3.3V和5V系统 ✅ 抗干扰强:工业级温度范围,适合各种恶劣环境
对于小家电、控制面板、仪表显示等应用场景,YL1650能大大简化硬件设计,降低BOM成本,是一款非常值得推荐的芯片。
如果你正在做相关的项目,不妨试试这款芯片,相信会给你带来惊喜。有任何问题欢迎在评论区交流讨论!