stm32f103c8t6动态数码管显示矩阵按键键值实验
时间: 2024-12-12 16:14:09 浏览: 20
STM32F103C8T6配套程序源码-矩阵键盘.zip
5星 · 资源好评率100%
STM32F103C8T6是一款常用的32位微控制器,广泛应用于嵌入式系统中。动态数码管显示和矩阵按键是常见的输入输出设备。以下是关于STM32F103C8T6动态数码管显示矩阵按键键值实验的介绍:
### 实验目的
1. 掌握STM32F103C8T6的基本编程方法。
2. 理解动态数码管的显示原理和控制方法。
3. 掌握矩阵按键的扫描和键值获取方法。
### 实验器材
1. STM32F103C8T6开发板
2. 4位共阳或共阴数码管
3. 4x4矩阵按键
4. 若干电阻和杜邦线
### 实验原理
1. **动态数码管显示**:
- 数码管有共阳和共阴两种类型。共阳数码管的公共端接高电平,共阴数码管的公共端接低电平。
- 通过控制数码管的段选和位选引脚,可以显示不同的数字。
- 动态扫描:通过快速切换显示不同的位,利用人眼的视觉暂留现象,实现多位数码管的显示。
2. **矩阵按键扫描**:
- 矩阵按键由行和列组成,通过逐行扫描和检测列的状态,可以确定按键的位置。
- 按键按下时,相应的行和列会被短接。
### 实验步骤
1. **硬件连接**:
- 将数码管的段选引脚连接到STM32的GPIO口,位选引脚连接到另一个GPIO口。
- 将矩阵按键的行和列引脚分别连接到STM32的GPIO口。
2. **软件编程**:
- 初始化GPIO口,设置相应的引脚为输出或输入模式。
- 编写数码管显示函数,通过动态扫描实现多位数码管的显示。
- 编写矩阵按键扫描函数,通过逐行扫描和检测列的状态,获取按键键值。
3. **调试与测试**:
- 编译并下载程序到STM32F103C8T6开发板。
- 按下矩阵按键,观察数码管显示的键值是否正确。
### 代码示例
```c
#include "stm32f10x.h"
// 数码管段选码表
const uint8_t SEG_CODE[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
// 数码管位选引脚
const uint16_t DIGIT_PINS[4] = {GPIO_Pin_0, GPIO_Pin_1, GPIO_Pin_2, GPIO_Pin_3};
// 矩阵按键行和列引脚
const uint16_t ROW_PINS[4] = {GPIO_Pin_4, GPIO_Pin_5, GPIO_Pin_6, GPIO_Pin_7};
const uint16_t COL_PINS[4] = {GPIO_Pin_8, GPIO_Pin_9, GPIO_Pin_10, GPIO_Pin_11};
// 数码管显示函数
void Display(uint16_t num) {
for (int i = 0; i < 4; i++) {
GPIO_Write(GPIOB, DIGIT_PINS[i]);
GPIO_Write(GPIOA, SEG_CODE[num % 10]);
num /= 10;
Delay(1);
}
}
// 矩阵按键扫描函数
uint8_t KeyScan() {
for (int i = 0; i < 4; i++) {
GPIO_Write(GPIOC, ROW_PINS[i]);
for (int j = 0; j < 4; j++) {
if (GPIO_ReadInputDataBit(GPIOD, COL_PINS[j]) == 0) {
return i * 4 + j;
}
}
}
return 0;
}
// 主函数
int main() {
// 初始化GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOD, &GPIO_InitStructure);
while (1) {
uint8_t key = KeyScan();
if (key != 0) {
Display(key);
}
}
}
```
###
阅读全文