别再手动焊矩阵键盘了!用STM32F103C8T6驱动74HC165扩展16个按键(附完整CubeMX配置)
2026/6/4 2:09:54 网站建设 项目流程

用STM32CubeMX快速实现74HC165按键扩展方案

在嵌入式开发中,经常会遇到需要扩展多个按键的场景。传统矩阵键盘虽然节省IO口,但存在"鬼影"问题且需要复杂的扫描逻辑。而直接使用GPIO驱动独立按键,又受限于芯片引脚数量。本文将介绍如何利用STM32F103C8T6和74HC165移位寄存器,通过CubeMX图形化配置工具快速搭建16键输入系统。

1. 硬件设计基础

1.1 74HC165工作原理

74HC165是一款8位并行输入/串行输出移位寄存器,主要特性包括:

  • 并行加载:当PL(Parallel Load)引脚为低电平时,8位并行输入数据被锁存到内部寄存器
  • 时钟控制:在CP(Clock Pulse)上升沿时,数据从Q7引脚串行输出
  • 级联能力:通过Q7'引脚可连接多片74HC165实现更多位扩展

关键参数对比

参数74HC165备注
工作电压2V-6V与3.3V STM32完美兼容
时钟频率最高36MHz远超过手动按键需求
输入电流±1μA低功耗特性
传输延迟13ns(典型值)响应速度极快

1.2 典型电路连接

两片74HC165级联实现16位输入的典型接法:

[按键矩阵] → [74HC165(1)] → [74HC165(2)] → [STM32] PL(并联) CP(并联) Q7'→DS

具体引脚连接:

  • PL:连接到STM32任意GPIO(如PC0),控制数据加载
  • CP:连接到STM32任意GPIO(如PB6),提供时钟信号
  • Q7:连接到STM32输入GPIO(如PB5),读取串行数据
  • DS:第二片的串行输入连接第一片的Q7'

注意:实际布线时应确保时钟线远离高频干扰源,并在长距离传输时考虑加入适当终端电阻。

2. CubeMX工程配置

2.1 时钟与GPIO初始化

  1. 打开STM32CubeMX,选择STM32F103C8T6芯片

  2. Pinout & Configuration选项卡中:

    • 配置系统时钟为72MHz(HSE晶振模式)
    • 设置PB5为输入模式(上拉)
    • 设置PB6和PC0为输出模式(推挽)
  3. Project Manager中:

    • 选择生成HAL库代码
    • 启用"Generate peripheral initialization as a pair of .c/.h files"

关键配置代码片段(自动生成):

/* GPIO Ports Clock Enable */ __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); /*Configure GPIO pins : PB6 PC0 */ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*Configure GPIO pin : PB5 */ GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

2.2 定时器配置(可选)

为按键消抖可配置一个基本定时器:

  1. 选择TIM2,配置为:
    • Prescaler: 7199 (100Hz @72MHz)
    • Counter Mode: Up
    • Period: 9 (10ms中断)
  2. 生成中断并启用NVIC

3. 驱动程序实现

3.1 基本读写函数

#define HC165_PL_PIN GPIO_PIN_0 #define HC165_PL_PORT GPIOC #define HC165_CLK_PIN GPIO_PIN_6 #define HC165_CLK_PORT GPIOB #define HC165_DATA_PIN GPIO_PIN_5 #define HC165_DATA_PORT GPIOB uint16_t HC165_ReadData(void) { uint16_t data = 0; // 加载并行数据 HAL_GPIO_WritePin(HC165_PL_PORT, HC165_PL_PIN, GPIO_PIN_RESET); HAL_Delay(1); // 保持PL低电平至少20ns HAL_GPIO_WritePin(HC165_PL_PORT, HC165_PL_PIN, GPIO_PIN_SET); // 读取第一位(MSB) if(HAL_GPIO_ReadPin(HC165_DATA_PORT, HC165_DATA_PIN)) data |= 0x8000; // 移位读取剩余15位 for(uint8_t i=0; i<15; i++) { data >>= 1; HAL_GPIO_WritePin(HC165_CLK_PORT, HC165_CLK_PIN, GPIO_PIN_RESET); HAL_Delay(1); HAL_GPIO_WritePin(HC165_CLK_PORT, HC165_CLK_PIN, GPIO_PIN_SET); if(HAL_GPIO_ReadPin(HC165_DATA_PORT, HC165_DATA_PIN)) data |= 0x8000; } return data; }

3.2 按键消抖处理

利用定时器中断实现硬件消抖:

volatile uint16_t rawKeys = 0; volatile uint16_t stableKeys = 0; volatile uint8_t debounceCnt[16] = {0}; void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM2) { rawKeys = ~HC165_ReadData(); // 取反使按下为1 for(uint8_t i=0; i<16; i++) { if(rawKeys & (1<<i)) { if(debounceCnt[i] < 10) debounceCnt[i]++; if(debounceCnt[i] == 5) stableKeys |= (1<<i); } else { if(debounceCnt[i] > 0) debounceCnt[i]--; if(debounceCnt[i] == 0) stableKeys &= ~(1<<i); } } } }

4. 应用层实现技巧

4.1 按键事件检测

uint16_t prevKeys = 0; void CheckKeyEvents(void) { uint16_t keyChanges = stableKeys ^ prevKeys; uint16_t keyPress = keyChanges & stableKeys; uint16_t keyRelease = keyChanges & (~stableKeys); for(uint8_t i=0; i<16; i++) { if(keyPress & (1<<i)) { // 处理按键按下事件 printf("Key %d pressed\n", i); } if(keyRelease & (1<<i)) { // 处理按键释放事件 printf("Key %d released\n", i); } } prevKeys = stableKeys; }

4.2 多键组合功能实现

#define KEY_COMBO_MASK ( (1<<0) | (1<<1) ) // 按键0和1组合 void HandleKeyCombinations(void) { static uint32_t comboStartTime = 0; if((stableKeys & KEY_COMBO_MASK) == KEY_COMBO_MASK) { if(comboStartTime == 0) { comboStartTime = HAL_GetTick(); } else if(HAL_GetTick() - comboStartTime > 1000) { printf("Combo key held for 1s\n"); comboStartTime = 0; // 防止重复触发 } } else { comboStartTime = 0; } }

在实际项目中,这种方案相比传统矩阵键盘有以下优势:

  • 无鬼影问题,支持全键无冲
  • 软件实现简单,无需复杂扫描算法
  • 扩展性强,可轻松级联更多按键
  • 抗干扰能力强,适合工业环境

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询