驱动74HC4051

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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值