014-STM32单片机实现矩阵薄膜键盘设计

1.功能说明

        本设计主要是利用STM32驱动矩阵薄膜键盘,当按下按键后OLED显示屏上会对应显示当前的按键键值,可以将此设计扩展做成电子秤、超市收银机、计算器等需要多个按键操作的单片机应用。

2.硬件接线

模块管脚STM32单片机管脚
矩阵键盘行1PA0
矩阵键盘行2PA1
矩阵键盘行3PA2
矩阵键盘行4PA3
矩阵键盘列1PA4
矩阵键盘列2PA5
矩阵键盘列3PA6
矩阵键盘列4PA7
0.96寸OLED显示屏SCLPB6
0.96寸OLED显示屏SSDAPB7

3.软件代码

 

// 定义字符型的4x4矩阵薄膜键盘映射表
char key_map[4][4] = {
    {'1', '2', '3', 'A'},
    {'4', '5', '6', 'B'},
    {'7', '8', '9', 'C'},
    {'*', '0', '#', 'D'}
};

// IO端口结构体定义,用于描述GPIO端口和针脚
struct IO_PORT
{                                            
        GPIO_TypeDef *GPIO_x; // GPIO端口地址                 
        unsigned short GPIO_pin; // GPIO端口的针脚
};

// 定义行输出的GPIO端口和针脚数组
static struct IO_PORT KEY_OUT[4] = {
        {BUTTON_ROW1_GPIO_PORT, BUTTON_ROW1_GPIO_PIN},
        {BUTTON_ROW2_GPIO_PORT, BUTTON_ROW2_GPIO_PIN},
        {BUTTON_ROW3_GPIO_PORT, BUTTON_ROW3_GPIO_PIN}, 
        {BUTTON_ROW4_GPIO_PORT, BUTTON_ROW4_GPIO_PIN}
};

// 定义列输入的GPIO端口和针脚数组
static struct IO_PORT KEY_IN[4] = {
        {BUTTON_COL1_GPIO_PORT, BUTTON_COL1_GPIO_PIN}, 
        {BUTTON_COL2_GPIO_PORT, BUTTON_COL2_GPIO_PIN},
        {BUTTON_COL3_GPIO_PORT, BUTTON_COL3_GPIO_PIN}, 
        {BUTTON_COL4_GPIO_PORT, BUTTON_COL4_GPIO_PIN}
};

// 定义键盘扫描状态数组
unsigned char key[4][4];

// 初始化4x4键盘的函数
void Button4_4_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    unsigned char i;
    RCC_APB2PeriphClockCmd(BUTTON_GPIO_CLK, ENABLE); // 使能GPIO时钟

    // 初始化行输出端口
    for(i=0;i<4;i++)
    {
        GPIO_InitStructure.GPIO_Pin = KEY_OUT[i].GPIO_pin;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 设置为推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        
        GPIO_Init(KEY_OUT[i].GPIO_x, &GPIO_InitStructure);
    }
    
    // 初始化列输入端口
    for(i=0;i<4;i++)
    {
        GPIO_InitStructure.GPIO_Pin = KEY_IN[i].GPIO_pin;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 设置为输入上拉
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        
        GPIO_Init(KEY_IN[i].GPIO_x, &GPIO_InitStructure);
    }
    
    // 设置行输出高电平,准备扫描
    for(i = 0; i < 4; i++)
    {
        GPIO_SetBits(KEY_OUT[i].GPIO_x, KEY_OUT[i].GPIO_pin);
    }
}

// 扫描4x4键盘的函数
char Button4_4_Scan(void)
{
    unsigned char i, j;
    for(i = 0; i < 4; i++)
    {
        delay_ms(5); // 延时以稳定信号
        GPIO_ResetBits(KEY_OUT[i].GPIO_x, KEY_OUT[i].GPIO_pin); // 将当前行置低,检测按键
        for(j = 0; j < 4; j++)
        {
            delay_ms(5); // 再次延时
            if(GPIO_ReadInputDataBit(KEY_IN[j].GPIO_x, KEY_IN[j].GPIO_pin) == 0) // 读取列状态,如果为低,则按键被按下
            {
                key[i][j] = 1; // 记录按键状态
                GPIO_SetBits(KEY_OUT[i].GPIO_x, KEY_OUT[i].GPIO_pin); // 恢复当前行高电平
                return key_map[i][j]; // 返回按键对应的字符
            }
            else
            {
                key[i][j] = 0;
            }
        }
        GPIO_SetBits(KEY_OUT[i].GPIO_x, KEY_OUT[i].GPIO_pin); // 恢复当前行高电平
    }
    return 0; // 如果没有按键被按下,返回0或可以选择返回一个特定的字符表示无输入
}

4.获取源码方式

https://download.youkuaiyun.com/download/weixin_41011452/90338338

### STM32微控制器与薄膜键盘模块连接及使用 #### 关于STM32微控制器和薄膜键盘模块的介绍 STM32系列微控制器基于ARM Cortex-M架构,广泛应用于各种嵌入式系统中。薄膜键盘是一种常见的输入设备,在工业控制、家用电器等领域有着广泛应用。由于NAND Flash存储器不适合用于代码执行[^1],通常情况下,STM32会采用内部Flash或其他类型的外部存储来保存程序。 对于薄膜键盘而言,其工作原理主要是通过检测按键闭合状态的变化来进行信号传输。当按下某个键时,对应的行列线会产生电平变化,MCU可以通过扫描这些线路的状态判断哪个按钮被触发。 #### 连接方法 为了实现STM32薄膜键盘之间的通信,可以按照如下方式建立硬件连接: -薄膜键盘矩阵中的行线接到STM32 GPIO端口的不同引脚上; - 同样地,列线也需要分别接入其他可用的GPIO引脚; - 确保电源供应稳定,并根据实际需求设置合适的上下拉电阻。 这种连线方案允许CPU周期性地查询各个节点电压水平从而识别出当前是否有按键动作发生以及具体位置信息。 #### 示例代码 下面给出一段简单的C语言源码片段用来演示如何初始化并读取来自4x4规格薄膜键盘的数据流: ```c #include "stm32f1xx_hal.h" #define ROWS 4 #define COLS 4 // 定义行/列管脚定义 uint8_t rowPins[] = {GPIO_PIN_0, GPIO_PIN_1, GPIO_PIN_2, GPIO_PIN_3}; uint8_t colPins[] = {GPIO_PIN_4, GPIO_PIN_5, GPIO_PIN_6, GPIO_PIN_7}; void setupKeyboard(GPIO_TypeDef* port){ __HAL_RCC_GPIOA_CLK_ENABLE(); // 开启相应外设时钟 GPIO_InitTypeDef initStruct; // 行作为输出 initStruct.Pin = (rowPins[0]|rowPins[1]|rowPins[2]|rowPins[3]); initStruct.Mode = GPIO_MODE_OUTPUT_PP; HAL_GPIO_Init(port,&initStruct); // 列作为输入带下拉 initStruct.Pull=GPIO_NOPULL; initStruct.Pin=(colPins[0]|colPins[1]|colPins[2]|colPins[3]); initStruct.Mode = GPIO_MODE_INPUT; HAL_GPIO_Init(port,&initStruct); } char getKey(){ char keyMap[ROWS][COLS]={ {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; uint8_t i,j; for(i=0;i<ROWS;i++){ // 设置某一行高电平其余低电平 for(j=0;j<ROWS;j++) HAL_GPIO_WritePin(GPIOA,rowPins[j],(i==j)?GPIO_PIN_SET:GPIO_PIN_RESET); // 扫描每一列看有没有按下的情况 for(j=0;j<COLS;j++) if(HAL_GPIO_ReadPin(GPIOA,colPins[j])==GPIO_PIN_SET) return keyMap[i][j]; HAL_Delay(10); // 延迟消抖动时间 } return '\0'; // 如果没有按键返回空字符 } ``` 此段代码实现了基本的功能框架,包括初始化I/O接口配置以及循环监测有无有效按键事件的发生过程。需要注意的是这里假设使用的单片机型号为STM32F1系列并且所有IO都位于同一个PORT之上,实际情况可能有所不同需做适当调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值