stm32f103c8t6配置三位动态数码管的代码
时间: 2023-08-01 16:06:55 浏览: 122
stm32驱动三位多位数码管程序
以下是一个简单的示例代码,使用STM32F103C8T6控制一个三位动态数码管:
```c
#include "stm32f10x.h"
#define DIGIT1 GPIO_Pin_0
#define DIGIT2 GPIO_Pin_1
#define DIGIT3 GPIO_Pin_2
#define SEG_A GPIO_Pin_3
#define SEG_B GPIO_Pin_4
#define SEG_C GPIO_Pin_5
#define SEG_D GPIO_Pin_6
#define SEG_E GPIO_Pin_7
#define SEG_F GPIO_Pin_8
#define SEG_G GPIO_Pin_9
#define SEG_DP GPIO_Pin_10
uint8_t digit[3] = {DIGIT1, DIGIT2, DIGIT3};
uint8_t segment[7] = {SEG_A, SEG_B, SEG_C, SEG_D, SEG_E, SEG_F, SEG_G};
uint8_t digit_values[10][7] = { // 数码管数字对应的段的开关状态
{1, 1, 1, 1, 1, 1, 0}, // 0
{0, 1, 1, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1}, // 2
{1, 1, 1, 1, 0, 0, 1}, // 3
{0, 1, 1, 0, 0, 1, 1}, // 4
{1, 0, 1, 1, 0, 1, 1}, // 5
{1, 0, 1, 1, 1, 1, 1}, // 6
{1, 1, 1, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1}, // 8
{1, 1, 1, 1, 0, 1, 1}, // 9
};
void delay_ms(uint32_t ms) {
uint32_t i;
for(i = 0; i < ms * 24000; i++);
}
void digit_on(uint8_t digit_num) {
GPIO_ResetBits(GPIOB, digit[digit_num]);
}
void digit_off(uint8_t digit_num) {
GPIO_SetBits(GPIOB, digit[digit_num]);
}
void segment_on(uint8_t segment_num) {
GPIO_SetBits(GPIOA, segment[segment_num]);
}
void segment_off(uint8_t segment_num) {
GPIO_ResetBits(GPIOA, segment[segment_num]);
}
void display_digit(uint8_t digit_num, uint8_t value) {
uint8_t i;
for (i = 0; i < 7; i++) {
if (digit_values[value][i]) {
segment_on(i);
} else {
segment_off(i);
}
}
digit_on(digit_num);
delay_ms(10); // 数码管刷新延迟
digit_off(digit_num);
}
int main(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G | SEG_DP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = DIGIT1 | DIGIT2 | DIGIT3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
while (1) {
display_digit(0, 1);
display_digit(1, 2);
display_digit(2, 3);
}
}
```
在这个例子中,我们使用了STM32F103C8T6的GPIO模块来控制三个数字管和七个显示段。在`digit_values`数组中,我们定义了每个数字对应的段的开关状态。`display_digit`函数接收一个数字和一个数字管编号,并将该数字在该数字管上显示出来。
阅读全文