1.什么是74HC4051
- 定义:74HC4051是一款8通道数字模拟多路复用器/多路分解器,能够在一个公共输入/输出端口(Z)和8个独立的输入/输出端口(Y0-Y7)之间切换。
- 功能:它允许你通过三个二进制控制信号(S0, S1, S2)选择其中一个通道进行连接。
2.原理图

3.代码
3.1初始化引脚
// 按钮对应的位掩码
#define BUTTON1 0x08
#define BUTTON2 0x04
#define BUTTON3 0x02
#define BUTTON4 0x01
#define BUTTON4 0x2000
#define BUTTON5 0x8000
#define BUTTON6 0x1000
#define BUTTON7 0x4000
struct button_mapping {
uint32_t mapped; /* GPIO pin */
uint32_t mask; /* 按钮位掩码 */
};
struct button_mapping selector_map[] = {
{(1 << 0), BUTTON1},
{(1 << 1), BUTTON2},
{(1 << 2), BUTTON3},
{(1 << 3), BUTTON4},
{(1 << 4), BUTTON5},
{(1 << 5), BUTTON6},
{(1 << 6), BUTTON7},
{(1 << 7), BUTTON8},
};
//初始化
void Button_Init(void) {
GPIO_DRV_Config_Dev(gpio_dev, SELECTOR_S0, (GPIO_DIR_OUT));
GPIO_DRV_Config_Dev(gpio_dev, SELECTOR_S1, (GPIO_DIR_OUT));
GPIO_DRV_Config_Dev(gpio_dev, SELECTOR_S2, (GPIO_DIR_OUT));
// 配置公共输入按钮
GPIO_DRV_Config_Dev(gpio_dev, BUTTON_COMMON_IN, (GPIO_DIR_IN | GPIO_PUD_PULL_UP));
}
bool Button_GetState(stuct Data* pButton ) {
int i =0;
bool result = false;
static uint32_t button_last_state = 0;
static uint32_t button_state = 0;
for (i = 0; i < 8; i++) {
GPIO_DRV_Write_Dev(gpio_dev, SELECTOR_S0, (i >> 0) & 0x01);
GPIO_DRV_Write_Dev(gpio_dev, SELECTOR_S1, (i >> 1) & 0x01);
GPIO_DRV_Write_Dev(gpio_dev, SELECTOR_S2, (i >> 2) & 0x01); //遍历每一个通道
k_busy_wait(10);
state = 0;
GPIO_DRV_Read_Dev(gpio_dev, BUTTON_COMMON_IN, &state);
if (!state) {
button_state |= selector_map[i].mask;
} else {
button_state &= ~selector_map[i].mask;
}
}
if (button_state != button_last_state) {
button_last_state = button_state;
*pButton = button_last_state;
printk("Button_GetState 0x%02x\n", button_last_state);
result = true;
}
return result;
}