4x4矩阵键盘
模块来源
采购链接:
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.4b5a2e8dp3kXe9&id=16901479794&_u=82t4uge5d0d3
规格参数
移植过程
引脚选择
移植至工程
我们的目标是将例程移植至ESP32-S3开发板上。已经为大家提供了完整的驱动代码,按照以下步骤,即可完成移植。
具体新建文件夹和新建c和h文件在 【DHT11温湿度传感器】章节中的1.4.2小节中有详细的教学,这里就不再多说了。
只不过这里我们将文件名 bsp_dht11.c 和 bsp_dht11.h 换成 bsp_matrixkey.c 和 bsp_matrixkey.h,文件夹名字改为Matrixkey
代码写入
在文件bsp_matrixkey.c中,编写如下代码。
c
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
* Change Logs:
* Date Author Notes
* 2024-01-09 LCKFB-lp first version
*/
#include "bsp_matrixkey.h"
#include "stdio.h"
//行
uint32_t gpio_row[4] = {GPIO_IN1,GPIO_IN2,GPIO_IN3,GPIO_IN4};
//列
uint32_t gpio_col[4] = {GPIO_IN5,GPIO_IN6,GPIO_IN7,GPIO_IN8};
void delay_ms(unsigned int ms)
{
vTaskDelay(ms / portTICK_PERIOD_MS);
}
void delay_us(unsigned int us)
{
ets_delay_us(us);
}
void delay_1ms(unsigned int ms)
{
vTaskDelay(ms / portTICK_PERIOD_MS);
}
void delay_1us(unsigned int us)
{
ets_delay_us(us);
}
/******************************************************************
* 函 数 名 称:MatrixKey_GPIO_Init
* 函 数 说 明:对矩阵按键的初始化
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LC
* 备 注:必须上拉
******************************************************************/
void MatrixKey_GPIO_Init(void)
{
gpio_config_t GG1_config = {
.pin_bit_mask = (1ULL<<GPIO_IN1)|(1ULL<<GPIO_IN2)|(1ULL<<GPIO_IN3)|(1ULL<<GPIO_IN4), //配置引脚
.mode =GPIO_MODE_OUTPUT,
.pull_up_en = GPIO_PULLUP_ENABLE, //使能上拉
.pull_down_en = GPIO_PULLDOWN_DISABLE, //不使能下拉
.intr_type = GPIO_INTR_DISABLE //不使能引脚中断
};
gpio_config(&GG1_config);
gpio_config_t GG2_config = {
.pin_bit_mask = (1ULL<<GPIO_IN5)|(1ULL<<GPIO_IN6)|(1ULL<<GPIO_IN7)|(1ULL<<GPIO_IN8), //配置引脚
.mode =GPIO_MODE_INPUT,
.pull_up_en = GPIO_PULLUP_ENABLE, //使能上拉
.pull_down_en = GPIO_PULLDOWN_DISABLE, //不使能下拉
.intr_type = GPIO_INTR_DISABLE //不使能引脚中断
};
gpio_config(&GG2_config);
}
/******************************************************************
* 函 数 名 称: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_set_level(gpio_row[i], 0);
// 检测列的状态,确定按键是否被按下
for (j = 0; j < 4; j++)
{
//如果该列被拉低
if (!gpio_get_level(gpio_col[j]))
{
// 计算按键编号
key_val = i * 4 + j + 1;
break;
}
}
// 恢复第i行的输出状态
gpio_set_level(gpio_row[i], 1);
// 如果按键被按下,则直接退出扫描
if (key_val) break;
}
// 返回按键编号,0表示无按键被按下
return key_val;
}
/******************************************************************
* 函 数 名 称:Get_Key
* 函 数 说 明:得到按键的具体字符
* 函 数 形 参:无
* 函 数 返 回:按键的具体值
* 作 者:LC
* 备 注:无
******************************************************************/
uint8_t Get_Key(void)
{
uint8_t value = key_scan();
switch (value)
{
case 1: value = '1'; break;
case 2: value = '2'; break;
case 3: value = '3'; break;
case 4: value = 'A'; break;
case 5: value = '4'; break;
case 6: value = '5'; break;
case 7: value = '6'; break;
case 8: value = 'B'; break;
case 9: value = '7'; break;
case 10: value = '8'; break;
case 11: value = '9'; break;
case 12: value = 'C'; break;
case 13: value = '*'; break;
case 14: value = '0'; break;
case 15: value = '#'; break;
case 16: value = 'D'; break;
default: value = 'n'; break;
}
return value;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
在文件bsp_matrixkey.h中,编写如下代码。
c
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
* Change Logs:
* Date Author Notes
* 2024-01-09 LCKFB-lp first version
*/
#ifndef _BSP_MATRIXKEY_H_
#define _BSP_MATRIXKEY_H_
#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_rom_sys.h"
#include "esp_timer.h"
#include "driver/uart.h"
#include "rom/ets_sys.h"
#include "esp_system.h"
#include "driver/gptimer.h"
#include "esp_log.h"
#include "freertos/queue.h"
#include "driver/spi_master.h"
#include "nvs_flash.h"
#define GPIO_IN1 18
#define GPIO_IN2 17
#define GPIO_IN3 16
#define GPIO_IN4 15
#define GPIO_IN5 41
#define GPIO_IN6 42
#define GPIO_IN7 45
#define GPIO_IN8 46
uint8_t Get_Key(void);
void MatrixKey_GPIO_Init(void);
uint8_t key_scan(void);
void delay_us(unsigned int us);
void delay_ms(unsigned int ms);
void delay_1us(unsigned int us);
void delay_1ms(unsigned int ms);
#endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
移植验证
在自己工程中的main主函数中,编写如下。
c
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
* Change Logs:
* Date Author Notes
* 2024-01-09 LCKFB-lp first version
*/
#include <stdio.h>
#include "bsp_matrixkey.h"
void app_main(void)
{
uint8_t key_value = 0;
printf("start\r\n");
MatrixKey_GPIO_Init();
while(1)
{
key_value = Get_Key();
if( key_value != 'n' )//如果有按键按下
{
printf("KEY = %c\r\n",key_value);
}
key_value = 0;
delay_1ms(500);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
上电效果(依次点击):
驱动代码: