041【GD32F470】4x4矩阵键盘移植成功案例

【1TB嵌入式学习资料免费领取:https://link3.cc/sgzy

=

2.41 4x4矩阵键盘

2.41.1 模块来源

采购链接:
44矩阵键盘 44矩阵薄膜开关/薄膜按键/控制面板/单片机扩展键盘

2.41.2 规格参数

在这里插入图片描述

2.41.3 移植过程

我们的目标是在梁山派GD32F470上能够判断键盘中是哪一个按键被按下的功能。首先要获取资料,查看数据手册应如何实现,再移植至我们的工程。

2.41.3.1 查看资料

2.41.3.2 引脚选择

在这里插入图片描述

2.41.3.3 移植至工程

移植步骤中的导入.c和.h文件与上一节相同,只是将.c和.h文件更改为bsp_matrixkey.c与bsp_matrixkey.h。见2.2.3.3 移植至工程。这里不再过多讲述。移植完成后面修改相关代码。
在文件bsp_matrixkey.c中,编写如下代码。

/********************************************************************************
  * 文 件 名: bsp_matrixkey.c
  * 版 本 号: 初版
  * 修改作者: LC
  * 修改日期: 2023年06月08日
  * 功能介绍:          
  ******************************************************************************
  * 注意事项:
*********************************************************************************/

#include "bsp_matrixkey.h"
#include "systick.h"
#include "bsp_usart.h"
#include "stdio.h"

//行
uint32_t port_row[4] = {PORT_IN1,PORT_IN2,PORT_IN3,PORT_IN4};
uint32_t gpio_row[4] = {GPIO_IN1,GPIO_IN2,GPIO_IN3,GPIO_IN4};

//列
uint32_t port_col[4] = {PORT_IN5,PORT_IN6,PORT_IN7,PORT_IN8};
uint32_t gpio_col[4] = {GPIO_IN5,GPIO_IN6,GPIO_IN7,GPIO_IN8};

/******************************************************************
 * 函 数 名 称:MatrixKey_GPIO_Init
 * 函 数 说 明:对矩阵按键的初始化
 * 函 数 形 参:无
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:必须上拉
******************************************************************/
void MatrixKey_GPIO_Init(void)
{
    /*  开启时钟  */
        rcu_periph_clock_enable(RCU_IN1);  
    rcu_periph_clock_enable(RCU_IN2);  
    rcu_periph_clock_enable(RCU_IN3);   
    rcu_periph_clock_enable(RCU_IN4); 
    rcu_periph_clock_enable(RCU_IN5); 
    rcu_periph_clock_enable(RCU_IN6); 
    rcu_periph_clock_enable(RCU_IN7); 
    rcu_periph_clock_enable(RCU_IN8);     
    
        /* 配置IN1 为输出上拉模式 */
        gpio_mode_set(PORT_IN1,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_IN1);
    gpio_output_options_set(PORT_IN1,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_IN1);
        /* 配置IN2 为输出上拉模式 */
        gpio_mode_set(PORT_IN2,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_IN2);
    gpio_output_options_set(PORT_IN2,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_IN2);    
        /* 配置IN3 为输出上拉模式 */
        gpio_mode_set(PORT_IN3,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_IN3);
    gpio_output_options_set(PORT_IN3,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_IN3);
        /* 配置IN4 为输出上拉模式 */
        gpio_mode_set(PORT_IN4,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_IN4);
    gpio_output_options_set(PORT_IN4,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_IN4);
    
        /* 配置IN5 为输入模式 上拉模式 */
        gpio_mode_set(PORT_IN5,GPIO_MODE_INPUT,GPIO_PUPD_PULLUP,GPIO_IN5);
    /* 配置IN6 为输入模式 上拉模式 */
    gpio_mode_set(PORT_IN6,GPIO_MODE_INPUT,GPIO_PUPD_PULLUP,GPIO_IN6);
    /* 配置IN7 为输入模式 上拉模式 */
        gpio_mode_set(PORT_IN7,GPIO_MODE_INPUT,GPIO_PUPD_PULLUP,GPIO_IN7);
    /* 配置IN8 为输入模式 上拉模式 */
        gpio_mode_set(PORT_IN8,GPIO_MODE_INPUT,GPIO_PUPD_PULLUP,GPIO_IN8); 
}

/******************************************************************
 * 函 数 名 称:key_scan
 * 函 数 说 明:矩阵按键扫描
 * 函 数 形 参:无
 * 函 数 返 回:0=没有按键按下     1~16=对应按键按下
 * 作       者:LC
 * 备       注:无
******************************************************************/
uint8_t key_scan(void)
{
    uint8_t i, j, key_val = 0;

    for (i = 0; i < 4; i++) 
    {
        // 选中第i行(低电平有效)
        gpio_bit_reset(port_row[i], gpio_row[i]);

        // 检测列的状态,确定按键是否被按下 
        for (j = 0; j < 4; j++) 
        {
            //如果该列被拉低
            if (!gpio_input_bit_get(port_col[j], gpio_col[j])) 
            {
                // 计算按键编号 
                key_val = i * 4 + j + 1; 
                break;
            }
        }

        // 恢复第i行的输出状态 
        gpio_bit_set(port_row[i], gpio_row[i]);

        // 如果按键被按下,则直接退出扫描 
        if (key_val) break; 
    }
    // 返回按键编号,0表示无按键被按下 
    return key_val; 
}



在文件bsp_matrixkey.h中,编写如下代码。

/********************************************************************************
  * 文 件 名: bsp_matrixkey.h
  * 版 本 号: 初版
  * 修改作者: LC
  * 修改日期: 2023年06月08日
  * 功能介绍:          
  ******************************************************************************
  * 注意事项:
*********************************************************************************/

#ifndef _BSP_MATRIXKEY_H_
#define _BSP_MATRIXKEY_H_
 
#include "gd32f4xx.h"


#define RCU_IN1     RCU_GPIOD
#define PORT_IN1    GPIOD
#define GPIO_IN1    GPIO_PIN_5

#define RCU_IN2     RCU_GPIOD
#define PORT_IN2    GPIOD
#define GPIO_IN2    GPIO_PIN_1

#define RCU_IN3     RCU_GPIOC
#define PORT_IN3    GPIOC
#define GPIO_IN3    GPIO_PIN_6

#define RCU_IN4     RCU_GPIOG
#define PORT_IN4    GPIOG
#define GPIO_IN4    GPIO_PIN_6

#define RCU_IN5     RCU_GPIOB
#define PORT_IN5    GPIOB
#define GPIO_IN5    GPIO_PIN_14

#define RCU_IN6     RCU_GPIOB
#define PORT_IN6    GPIOB
#define GPIO_IN6    GPIO_PIN_12

#define RCU_IN7     RCU_GPIOB
#define PORT_IN7    GPIOB
#define GPIO_IN7    GPIO_PIN_10

#define RCU_IN8     RCU_GPIOB
#define PORT_IN8    GPIOB
#define GPIO_IN8    GPIO_PIN_1




void MatrixKey_GPIO_Init(void);
uint8_t key_scan(void);
#endif


2.41.4 移植验证
在自己工程中的main主函数中,编写如下。

/********************************************************************************
  * 文 件 名: main.c
  * 版 本 号: 初版
  * 修改作者: LC
  * 修改日期: 2023年06月08日
  * 功能介绍:          
  ******************************************************************************
  * 注意事项:
*********************************************************************************/


#include "gd32f4xx.h"
#include "systick.h"
#include "bsp_usart.h"
#include "stdio.h"
#include "bsp_matrixkey.h"

int main(void)
{
    uint8_t key_value = 0;
    nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);  // 优先级分组
        systick_config();                //滴答定时器初始化 1ms

    usart_gpio_config(115200U);
    printf("start\r\n");
    MatrixKey_GPIO_Init();
    while(1)
    {
       key_value = key_scan();
       if( key_value != 0 )//如果有按键按下
       {
            printf("key_value = %d\r\n",key_value);
       }  
       delay_1ms(500);
    }
}

移植现象:连续按下16个按键,都输出对应键值。

在这里插入图片描述
移植成功示例,见文件2.41.4-1

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gd32f470是一款高性能的微控制器,而emwin是一个功能强大的嵌入式图形界面软件。要在gd32f470移植emwin,首先需要了解gd32f470的硬件特性和emwin的软件要求。 gd32f470具有丰富的硬件资源,包括高性能的ARM Cortex-M4内核、大容量的Flash存储器和SRAM、多个通信接口等。emwin则需要至少16位的处理器和足够的存储空间来运行。 首先,我们需要下载emwin软件包,并按照官方提供的移植指南进行相应的设置。在移植过程中,需要根据gd32f470的硬件资源和emwin的软件要求进行适配。例如,配置gd32f470的时钟源和时钟频率,为emwin提供足够的运行速度。 然后,根据gd32f470外设资源和emwin的功能需求,进行相关的引脚配置和中断配置。如需使用触摸屏功能,需要配置相应的引脚和中断。同时,根据实际需求,可能还需要对外设进行初始化和设置。 接下来,在项目中包含emwin的源代码文件,并根据gd32f470的编译器和开发环境进行相关的编译和链接设置。确保编译器正确地识别emwin的源代码,并生成适合gd32f470的可执行文件。 最后,在应用程序中调用emwin的相关函数,来实现图形界面的绘制和控制。可以根据需要,编写应用程序来显示图像、文本、按钮等元素,并对其进行交互。 移植过程中,需要注意解决可能出现的硬件兼容性和软件冲突问题。通过逐步调试和测试,可以确保gd32f470上的emwin移植成功,并实现相应的图形界面功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值