给我一个stm32 设计具有以下要求的应用控制系统 利用该应用系统的4✖️4矩阵式键盘来控制八个数码管,1 板子上电后第一行键盘按下,数码管各自显示 1,3,5,7,第二行键盘按下数码管各自显示 2,4,6,8,第三行键盘按下数码换各自显示 12,34,56,78,第四行键盘按下,数码管各自显示 1234,5678,12345678,全部熄灭的简易代码
时间: 2023-12-27 13:03:42 浏览: 63
STM32控制矩阵按键,HAL库,cubemx配置,可控制4*4按键,使用扫描法,单片机STM32f103RCT6
5星 · 资源好评率100%
好的,根据您的需求,我可以给您提供一个基于STM32的应用控制系统的简易代码,如下所示:
```c
#include "stm32f10x.h"
// 定义数码管显示码表
const uint8_t LED_DISPLAY_TABLE[] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F // 9
};
// 定义键值表
const uint8_t KEY_VALUE_TABLE[] = {
1, 3, 5, 7, // 第一行键值
2, 4, 6, 8, // 第二行键值
12, 34, 56, 78, // 第三行键值
1234, 5678, 12345678 // 第四行键值
};
// 定义数码管显示缓存
uint8_t LED_DISPLAY_BUFFER[8];
// 初始化GPIO
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIOA、GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
// 配置PA0~3为输入模式,连接4x4矩阵键盘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置PB0~7为输出模式,连接数码管
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
// 扫描键盘
uint8_t ScanKey(void)
{
uint8_t row, col;
// 遍历行
for (row = 0; row < 4; row++) {
// 设置行为高电平
GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
GPIO_ResetBits(GPIOA, 1 << row);
// 检测列是否有按键按下
for (col = 0; col < 4; col++) {
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | (1 << col)) == 0) {
return row * 4 + col;
}
}
}
return 16; // 表示没有按键按下
}
// 更新数码管显示
void UpdateLED(void)
{
uint8_t i;
// 更新数码管显示缓存
for (i = 0; i < 8; i++) {
LED_DISPLAY_BUFFER[i] = LED_DISPLAY_TABLE[LED_DISPLAY_BUFFER[i]];
}
// 分别更新数码管
for (i = 0; i < 8; i++) {
// 设置位选为低电平
GPIO_ResetBits(GPIOB, 1 << i);
// 更新段选
GPIO_Write(GPIOB, LED_DISPLAY_BUFFER[i]);
// 稍作延时
Delay(1);
// 设置位选为高电平
GPIO_SetBits(GPIOB, 1 << i);
}
}
int main(void)
{
uint8_t key;
uint8_t i;
// 初始化GPIO
GPIO_Configuration();
// 初始化数码管显示缓存
for (i = 0; i < 8; i++) {
LED_DISPLAY_BUFFER[i] = 0;
}
while (1) {
// 扫描键盘
key = ScanKey();
// 根据键值更新数码管显示缓存
if (key < 12) {
for (i = 0; i < 4; i++) {
if (KEY_VALUE_TABLE[key] & (1 << i)) {
LED_DISPLAY_BUFFER[i] = i + 1;
}
else {
LED_DISPLAY_BUFFER[i] = 0;
}
}
for (i = 0; i < 4; i++) {
if (KEY_VALUE_TABLE[key] & (1 << (i + 4))) {
LED_DISPLAY_BUFFER[i + 4] = i + 1;
}
else {
LED_DISPLAY_BUFFER[i + 4] = 0;
}
}
}
else if (key == 12) {
for (i = 0; i < 4; i++) {
LED_DISPLAY_BUFFER[i] = (i % 2 == 0) ? 1 : 2;
LED_DISPLAY_BUFFER[i + 4] = (i % 2 == 0) ? 3 : 4;
}
}
else if (key == 13) {
for (i = 0; i < 4; i++) {
LED_DISPLAY_BUFFER[i] = (i % 2 == 0) ? 5 : 6;
LED_DISPLAY_BUFFER[i + 4] = (i % 2 == 0) ? 7 : 8;
}
}
else if (key == 14) {
for (i = 0; i < 4; i++) {
LED_DISPLAY_BUFFER[i] = (i % 2 == 0) ? 1 : 2;
LED_DISPLAY_BUFFER[i + 4] = (i % 2 == 0) ? 3 : 4;
}
for (i = 0; i < 4; i++) {
LED_DISPLAY_BUFFER[i + 2] = (i % 2 == 0) ? 5 : 6;
LED_DISPLAY_BUFFER[i + 6] = (i % 2 == 0) ? 7 : 8;
}
}
else {
for (i = 0; i < 8; i++) {
LED_DISPLAY_BUFFER[i] = 0;
}
}
// 更新数码管显示
UpdateLED();
}
}
```
这段代码实现了您的需求,包括使用4x4矩阵键盘控制八个数码管显示不同的数字。具体实现原理可以参考代码注释。
阅读全文