当前位置: 首页 > news >正文

STM32F030软件SPI驱动74HC165实现多路按键扫描

1. 硬件连接与原理分析

74HC165是一款经典的8位并行输入/串行输出移位寄存器,特别适合用来扩展GPIO资源紧张的微控制器。我最近在一个智能家居控制面板项目中使用STM32F030驱动这款芯片,实测下来稳定性相当不错。先说说硬件连接要点:

74HC165的引脚功能需要特别注意:

  • PL(并行加载)引脚低电平时会将8个并行输入口的状态锁存到内部寄存器
  • CP(时钟)引脚每个上升沿会将数据从DS引脚移入,同时Q7引脚移出数据
  • QH(串行输出)引脚连接MCU的输入GPIO

实际接线时,我用杜邦线连接了STM32F030的以下引脚:

  • PA4连接PL(用作片选信号)
  • PB3连接CP(时钟信号)
  • PA6连接QH(数据输入)

这里有个小技巧:如果按键数量超过8个,可以通过级联多个74HC165来实现扩展。只需要将第一个芯片的QH输出接到第二个芯片的DS输入,共用PL和CP信号即可。我在测试时级联了3个芯片,成功实现了24路按键扫描。

2. 软件SPI时序实现

STM32F030虽然有硬件SPI外设,但在某些场景下使用软件模拟SPI反而更灵活。下面是我调试通过的驱动代码关键部分:

#define HC165_PL_PIN GPIO_PIN_4 #define HC165_PL_PORT GPIOA #define HC165_CP_PIN GPIO_PIN_3 #define HC165_CP_PORT GPIOB #define HC165_DS_PIN GPIO_PIN_6 #define HC165_DS_PORT GPIOA uint8_t HC165_ReadByte(void) { uint8_t value = 0; // 拉低PL引脚加载并行数据 HAL_GPIO_WritePin(HC165_PL_PORT, HC165_PL_PIN, GPIO_PIN_RESET); HAL_Delay(1); HAL_GPIO_WritePin(HC165_PL_PORT, HC165_PL_PIN, GPIO_PIN_SET); // 逐位读取串行数据 for(uint8_t i=0; i<8; i++) { value <<= 1; if(HAL_GPIO_ReadPin(HC165_DS_PORT, HC165_DS_PIN)) { value |= 0x01; } // 产生时钟上升沿 HAL_GPIO_WritePin(HC165_CP_PORT, HC165_CP_PIN, GPIO_PIN_RESET); HAL_Delay(1); HAL_GPIO_WritePin(HC165_CP_PORT, HC165_CP_PIN, GPIO_PIN_SET); } return ~value; // 按键按下时为低电平,所以取反 }

这段代码有几个关键点需要注意:

  1. PL信号需要保持至少25ns的低电平(实测1ms更可靠)
  2. 时钟信号要在读取数据位之后翻转
  3. 按键按下时输入为低电平,所以最后对读取值取反

3. 实际应用中的优化技巧

在真实项目中直接使用上面的基础代码可能会遇到一些问题。我分享几个踩坑后总结的经验:

3.1 消抖处理

机械按键通常需要10-20ms的消抖时间。我的做法是在主循环中这样处理:

#define DEBOUNCE_TIME 20 // 消抖时间20ms uint8_t currentKey, lastKey; uint32_t lastKeyTime = 0; while(1) { currentKey = HC165_ReadByte(); if(currentKey != lastKey) { lastKeyTime = HAL_GetTick(); } else if((HAL_GetTick() - lastKeyTime) > DEBOUNCE_TIME) { if(currentKey != 0) { // 处理有效按键 printf("Key pressed: 0x%02X\n", currentKey); } } lastKey = currentKey; HAL_Delay(5); // 适当延时减少CPU占用 }

3.2 多芯片级联处理

当级联多个74HC165时,读取顺序是从最后一个芯片开始。比如级联3个芯片时:

uint8_t HC165_ReadMultiple(uint8_t chipCount) { uint8_t value = 0; // 加载所有芯片的并行数据 HAL_GPIO_WritePin(HC165_PL_PORT, HC165_PL_PIN, GPIO_PIN_RESET); HAL_Delay(1); HAL_GPIO_WritePin(HC165_PL_PORT, HC165_PL_PIN, GPIO_PIN_SET); // 读取所有芯片的数据 for(uint8_t i=0; i<chipCount*8; i++) { value <<= 1; if(HAL_GPIO_ReadPin(HC165_DS_PORT, HC165_DS_PIN)) { value |= 0x01; } // 产生时钟上升沿 HAL_GPIO_WritePin(HC165_CP_PORT, HC165_CP_PIN, GPIO_PIN_RESET); HAL_Delay(1); HAL_GPIO_WritePin(HC165_CP_PORT, HC165_CP_PIN, GPIO_PIN_SET); } return ~value; }

4. 性能测试与优化

在实际测试中,我发现软件SPI的读取速度完全能满足按键扫描的需求。使用72MHz主频的STM32F030,读取一个8位74HC165大约需要50μs,即使级联3个芯片也只需要150μs左右。

如果需要进一步提高速度,可以考虑以下优化:

  1. 使用寄存器直接操作替代HAL库函数
  2. 减少时钟延时间隔
  3. 使用中断方式代替轮询

这里给出一个优化后的快速读取实现:

#define HC165_PL_BSRR (GPIOA->BSRR = GPIO_BSRR_BR_4) #define HC165_PL_SET (GPIOA->BSRR = GPIO_BSRR_BS_4) #define HC165_CP_CLR (GPIOB->BSRR = GPIO_BSRR_BR_3) #define HC165_CP_SET (GPIOB->BSRR = GPIO_BSRR_BS_3) #define HC165_DS_READ (GPIOA->IDR & GPIO_IDR_6) uint8_t HC165_FastRead(void) { uint8_t value = 0; HC165_PL_BSRR; __NOP(); __NOP(); // 约25ns延时 HC165_PL_SET; for(uint8_t i=0; i<8; i++) { value <<= 1; if(HC165_DS_READ) value |= 0x01; HC165_CP_CLR; __NOP(); __NOP(); HC165_CP_SET; } return ~value; }

这种实现方式将读取时间缩短到了约5μs,适合对实时性要求更高的应用场景。不过要注意,直接操作寄存器会降低代码的可移植性,建议在关键路径上使用。

http://www.jsqmd.com/news/1094532/

相关文章:

  • 昂德高RS0条码防重防错防漏打印检测软件系统:全功能赋能标签精准质检
  • 广东激光模具焊哪个公司专业
  • 智莱特获新一轮融资 牵手智元机器人达成关节模组长期供货合作
  • LitCAD:终极免费开源CAD工具,5分钟学会专业二维绘图
  • IEEE 1394接口“晚接地”EOS防护:原理、诊断与三级电路防御实战
  • 如何构建一个机器学习项目来找到工作?
  • OpenAI官方不告诉你的3个API冷知识:stream=false时的隐藏token消耗陷阱、system角色在v1.0+中的权重衰减机制、以及模型降级自动fallback配置秘钥
  • 当Python遇见全球气象数据:CDS API如何改变气候研究者的工作流
  • 从零到一:华为iMaster NCE-Campus实战部署避坑指南
  • Multisim(MS)工具-放置元器件
  • 40W DC-DC 国产工业隔离模块电源硬件选型指南|URB2412LD-40WR3 和钡特电源 VB40-24S12LD 靠谱好评推荐
  • ChatGPT API调用成本失控?精准测算每千token真实开销,Python自动化账单分析脚本限时开源
  • Apache Commons FileUpload 2.0:企业级文件上传解决方案深度解析 [特殊字符]
  • 降AIGC软件红黑榜:实测3款热门工具,剖析实用程度与常见陷阱,文末附技巧
  • Cursor免费试用限制解除方案:从问题分析到一键重置的完整指南
  • MSP430BT5190超低功耗蓝牙MCU开发实战:架构解析与功耗优化
  • 线上办公避坑指南:从参数、定价看懂会议软件怎么选
  • 大厂罕见“会师”:自变量机器人两月融四轮,估值破200亿
  • 【MySQL全套SQL语句完整归纳】DDL/DML/DCL/TCL语法规范、实战案例、易错点全整理】
  • 金融监管总局AI安全新规解读:证券金融AI软件行业如何落地合规
  • GPU内存稳定性终极检测指南:如何用memtest_vulkan快速排查显卡硬件故障
  • GPT-5.5 到底值不值得升级?从实际开发角度分析
  • Burjeel Holdings为自2018年以来MENA首只医疗保健伊斯兰债券定价,超额认购3.2倍
  • GLM 5.2 深度技术解析:开源模型在网络安全基准测试中击败 Claude,每次漏洞发现仅 $0.17
  • 2026年AI写作辅助网站核心能力速览
  • 【资深架构师亲授】ChatGPT机器人生产环境避坑手册:5类致命错误+4种监控指标+实时告警配置
  • 前端这边不做过多赘述,页面图给出来,大概是一个h5页面配合vant组件先把页面实现即可
  • OpenAI高级推理模型的推理轨迹深度解析与工程实践
  • 专业的福州设计考研机构哪家靠谱
  • 【CTF 备赛干货】2026 最新 CTF 比赛全方位指南,剖析竞赛新风向、整理值得参加的赛事,系统化备考路线助力轻松冲奖