尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
一个串口一个芯片搞定48键带灯键盘,每个灯可控制单独闪烁,还支持组合和长按键,代码很短
这里分享一个使用BC7595的带灯矩阵键盘设计每个灯可独立控制有闪烁功能且电路非常简洁只需要1只芯片和几个电阻。亮点每个按键指示灯可单独控制且可闪烁接口为UART串口直接输出键值可以支持任意组合键或检测长按键整个键盘电路图如下为了看得更清楚这里是一个局部放大图最简应用使用起来超级简单电路图中的按键编号即对应其键值按键按下时会在串口直接输出其键值另外芯片还可检测按键释放输出的键值为按下的键值128最高位置1).比如1号键按下串口即输出 0x01而1号键释放时则输出0x81。LED的控制也很简单这个编号同时也是LED的地址点亮指令为0XC1, 熄灭指令为0XC0串口发送(0XC1, 0X01)就将1号键的灯点亮发送(0XC0, 0x01)则将其熄灭。闪烁功能稍微麻烦一点闪烁由0x3n和0x2n指令控制n的取值范围为0-5,对应控制DIG0到DIG5线上的LED指令由2个字节组成第二个字节的每位对应一个LEDbit0对应连接A线的LEDbit1对应连接B线的LED, 以此类推。比如让S9闪烁S9在DIG1和B线的交叉点上则串口发送(0x31, 0x02)就能让S9的LED开始闪烁。关闭闪烁则发送(0x21, 0x02)。需要说明的是要想看到闪烁必须先将该LED点亮才行。如果该LED只有闪烁和熄灭两种状态不需要常亮则设置闪烁属性后只需控制ON/OFF就行了闪烁属性即便LED关了也会保留再此点亮时就会自动开始闪烁。这里是一个最简单应用的例子串口设置等部分代码省略该程序完成以下功能S1键按下时该键的LED点亮执行该键任务按键释放则LED熄灭任务停止S16键按一下则该键LED点亮执行该键任务再按一下则LED熄灭任务停止S47键按一下该键LED开始闪烁执行该键任务再按一下则LED熄灭任务停止void send_bc7595_cmd(uint8_t cmd, uint8_t data) { uart_send_byte(cmd); uart_send_byte(data); } void main(void) { config_uart(); send_bc7595_cmd(0x35, 0x80); // 设置S47键LED的闪烁属性为开DIG5线与bit7) while (1) { // 主循环 if (UART_RX_DATA_AVAILABLE) { // 查询串口缓冲区是否接收到数据 switch (UART_RX_DATA) { // 根据串口接收数据执行不同操作 case 1: // 如果是S1按下 send_bc7595_cmd(0xC1, 1); // 点亮S1的LED s1_task_on(); // 执行S1键任务 break; case 0x81: // 如果是S1释放 send_bc7595_cmd(0xC0, 1); // 关闭S1的LED s1_task_off(); // 停止S1键任务 break; case 16: // 如果是S16按下 if (s16_task_is_on()) { // 检查S16任务是否已经开启如果已经开启则停止 s16_task_off(); send_bc7595_cmd(0xC0, 16); // 关闭S16的LED } else { // 如果S16任务状态是关 s16_task_on(); // 开始S16的任务 send_bc7595_cmd(0xC1, 16); // 点亮S16的LED } break; case 47: // 如果是S47按下 if (s47_task_is_on()) { // 检查S47任务是否已经开启如果已经开启则停止 s47_task_off(); send_bc7595_cmd(0xC0, 47); // 关闭S47的LED } else { // 如果S47任务状态是关 s47_task_on(); // 开始S47的任务 send_bc7595_cmd(0xC1, 47); // 点亮S47的LED即S47的LED开始闪烁 } break; default: break; } } delay_ms(50); // 查询间隔50ms,也可执行其他功能 } // 主循环 }进阶应用长按键和组合键长按键和组合键的使用稍微复杂一点需要使用与之配套的串口键盘驱动库(开源库GitCode上可下载 单线UART矩阵键盘驱动:基于 C 语言的 UART 单线矩阵键盘驱动库 - AtomGit)。这个库的功能就是允许你给需要的长按键和组合键自己定义一个键值然后其他的使用和基础的S0到S47一样也是按下时收到普通键值释放时收到128的键值。就是说使用长按键和组合键只需要在程序开始时定义一下在主程序中处理逻辑和普通按键是完全一样的。下面这个程序完成这个功能S3键只有在和S0键同时按下时才起作用组合键按一次任务开S3的LED点亮再按一次关闭单独按S3不做任何操作。S4键短按一下LED亮再短按一下LED灭如果长按3s则LED闪烁再长按3s则退出闪烁LED熄灭#include “key_scan.h” // 包含头文件以使用键盘驱动库 const unsigned char lp1[] {4, 120}; // 将S4键配置为长按键lp1赋予自定义键值120 const unsigned char* LPDef[] {lp1}; // 汇总长按键定义如果有多个长按键一起放在这里 const unsigned char cb1[] {2, 121, 0, 3}; // 将S0、S3 2个键配置为组合键cb1赋予自定义键值121 const unsigned char* CBDef[] {cb1}; // 汇总组合键定义如果有多个组合键一起放在这里 unsigned char CBMap[1]; // 定义用于检测组合键的映射数组其空间应不小于定义的组合键总数 void uart_rx_isr(void) { // UART 接收中断处理函数 update_key_status(RX_DATA); // 使用驱动库要求在UART接收中断中用收到的数据呼叫 update_key_status() 函数 } void send_bc7595_cmd(uint8_t cmd, uint8_t data) { // 发送BC7595指令函数 uart_send_byte(cmd); uart_send_byte(data); } int main(void) { config_uart(); set_longpress_count(60); // 设置长按键时间为 3 秒(50ms*60) def_longpress_key(LPDef, 1); // 定义 1 个长按键 def_combined_key(CBDef, CBMap, 1); // 定义1个组合键 while (1) { // 主循环 if (is_key_changed()) { // 使用驱动库时用此函数查询是否有按键变化 switch (get_key_value()) { // 使用此函数读取键值根据键值执行不同操作 case 121: // 如果是S0-S3组合键 if (s3_task_is_on()) { // 检查S3任务是否已经开启如果已经开启则停止 s3_task_off(); send_bc7595_cmd(0xC0, 3); // 关闭S3的LED } else { // 如果S3任务状态是关 s3_task_on(); // 开始S3的任务 send_bc7595_cmd(0xC1, 3); // 点亮S3的LED } break; case 120: // 如果是S4长按3s if (s4_blink_on()) { // 检查S4是否已经闪烁如果已经闪烁则停止 send_bc7595_cmd(0xC0, 4); // 关闭S4的LED send_bc7595_cmd(0x20, 0x10); // 关闭S4的闪烁 DIG0线bit4 } else { // 如果S47任务状态是关 send_bc7595_cmd(0xC1, 4); // 点亮S4的LED send_bc7595_cmd(0x30, 0x10); // 开启S4的闪烁 DIG0线bit4 } break; case 4: // 如果是S4短按 if (!s4_blink_on()) { // 如果S4没有在闪烁状态 if (s4_LED_is_on()) { // 检查S4 LED是否已经点亮如果已经点亮则关闭 send_bc7595_cmd(0xC0, 4); // 关闭S4的LED } else { // 如果S4 LED状态是关 send_bc7595_cmd(0xC1, 4); // 点亮S4的LED } } break; default: break; } } delay_ms(50); // 查询间隔50ms,也可执行其他功能 long_press_tick(); // 使用长按键功能时需要定期呼叫此函数 } // 主循环 }
RELATED

相关推荐

修复 Software 3.0 时代 LLM 幻觉与状态丢失:知芽 Notebook Skill 底层受治理机制解析

修复 Software 3.0 时代 LLM 幻觉与状态丢失:知芽 Notebook Skill 底层受治理机制解析

作为开发者和知识工作者,我们都曾遭遇过向大语言模型(LLM)输入 Prompt 后,得到一本正经的胡说八道和无法追溯的“死”数据的报错级体验。业内常引用 Karpathy 对软件世代的拆解:1.0 时代是手写代码,2.0 时代…

📅 2026/10/10 5:06:09
相位噪声测试实战指南:从原理到精准测量的关键技术与避坑要点

相位噪声测试实战指南:从原理到精准测量的关键技术与避坑要点

1. 从“测不准”到“测得准”:相位噪声测试的挑战与价值在射频和数字系统设计里,相位噪声是个让人又爱又恨的指标。爱它,是因为它直接决定了通信系统的信噪比、雷达的距离分辨率、高速数字系统的时钟抖动;恨它,是因为它…

📅 2026/11/10 17:55:38
终于搞懂 XSS、CSRF

终于搞懂 XSS、CSRF

学习前端的过程中,我以前对安全知识一直停留在死记硬背的阶段,只知道 XSS、CSRF 是攻击方式,却始终不懂底层逻辑、不知道开发中该如何规避。直到把前端安全纳入整体知识体系后,我才真正明白:前端安全不是晦涩的理论&am…

📅 2026/11/10 15:16:40
MORE NEWS

更多资讯

📰

深圳市建筑电工证办理怎么报名 外省证能转过来吗

深圳市建筑电工证办理怎么报名 外省证能转过来吗 之前考的证在外省能不能转过来?这是很多建筑电工在考虑来深圳发展前最关心的问题。尤其是那些已经在其他城市工作多年、持证上岗的电工,他们更担心的是证书能不能顺利转过来,能不能在深圳继续执业。别急,…

📰

石家庄哪里找电工证良心建议 以前的证能转过来吗

石家庄哪里找电工证良心建议 以前的证能转过来吗 之前考的证在外省能不能转过来?这几乎是所有特种作业人员心里最怕的一件事。如果你在石家庄工作,手里拿着外地的电工证, 良心建议…

📰

南沙特种工操作证复审网上查询怕考不过白交培训费?这5个真实问题全解答

南沙特种工操作证复审网上查询怕考不过白交培训费?这5个真实问题全解答 怕考不过白交培训费?这事儿谁没经历过?南沙特种工操作证复审网上查询成了不少人的痛点,尤其是对那些在工地、工厂一线打拼的老手来说,证没过,钱就打了水漂。今天咱们就围绕【南沙…

📰

考试电工证有什么技巧 郑州报考避坑指南:转岗电工别再走弯路

考试电工证有什么技巧 郑州报考避坑指南:转岗电工别再走弯路 不知道去哪报名怕被中介坑?在郑州,很多想转岗做电工的人,第一步就卡在了报名这道门槛上。一不小心掉进中介的套路,不仅多花冤枉钱,还耽误了考试进度。今天就来聊一聊【考试电工证有什么技巧…

📰

低压电工证考了就能查,官方报名入口怎么找?手把手教你上岸

低压电工证考了就能查,官方报名入口怎么找?手把手教你上岸 你是不是也这样?手里攥着电工经验,却因为没有低压电工证,被工地、工厂、建筑单位拒之门外? 急需特种作业证才能上岗找工作…

📰

电工证考试手套怎么准备?学历不高也能考电子证书

电工证考试手套怎么准备?学历不高也能考电子证书 你是不是也担心学历不够高,连电工证都报不上名?别慌,现在大多数地方都支持 电子证书 办理,而且只要你能通过考试,学历不是限制条件。今天我就从 漯河应届工程类毕业生 的角度,一步步教你如何用…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬