stm32f103r6多位数码管显示
时间: 2023-08-26 07:04:54 浏览: 155
要控制多位数码管,需要使用扫描显示的方法。具体步骤如下:
1. 定义数码管的引脚和段码值(如果使用共阳数码管,需要将段码值取反)。
```
#define DIG1_PIN PA0
#define DIG2_PIN PA1
#define SEG_A_PIN PB0
#define SEG_B_PIN PB1
#define SEG_C_PIN PB2
#define SEG_D_PIN PB3
#define SEG_E_PIN PB4
#define SEG_F_PIN PB5
#define SEG_G_PIN PB6
#define SEG_DP_PIN PB7
#define SEG_A_VAL 0x01
#define SEG_B_VAL 0x02
#define SEG_C_VAL 0x04
#define SEG_D_VAL 0x08
#define SEG_E_VAL 0x10
#define SEG_F_VAL 0x20
#define SEG_G_VAL 0x40
#define SEG_DP_VAL 0x80
```
2. 定义数码管显示的字符集(此处以显示0-9的数字为例)。
```
const uint8_t DIGIT_MAP[] = {
SEG_A_VAL | SEG_B_VAL | SEG_C_VAL | SEG_D_VAL | SEG_E_VAL | SEG_F_VAL, // 0
SEG_B_VAL | SEG_C_VAL, // 1
SEG_A_VAL | SEG_B_VAL | SEG_D_VAL | SEG_E_VAL | SEG_G_VAL, // 2
SEG_A_VAL | SEG_B_VAL | SEG_C_VAL | SEG_D_VAL | SEG_G_VAL, // 3
SEG_B_VAL | SEG_C_VAL | SEG_F_VAL | SEG_G_VAL, // 4
SEG_A_VAL | SEG_C_VAL | SEG_D_VAL | SEG_F_VAL | SEG_G_VAL, // 5
SEG_A_VAL | SEG_C_VAL | SEG_D_VAL | SEG_E_VAL | SEG_F_VAL | SEG_G_VAL, // 6
SEG_A_VAL | SEG_B_VAL | SEG_C_VAL, // 7
SEG_A_VAL | SEG_B_VAL | SEG_C_VAL | SEG_D_VAL | SEG_E_VAL | SEG_F_VAL | SEG_G_VAL, // 8
SEG_A_VAL | SEG_B_VAL | SEG_C_VAL | SEG_D_VAL | SEG_F_VAL | SEG_G_VAL // 9
};
```
3. 初始化GPIO引脚为输出模式,并设置数码管显示的初始值。
```
void init_display() {
pinMode(DIG1_PIN, OUTPUT);
pinMode(DIG2_PIN, OUTPUT);
pinMode(SEG_A_PIN, OUTPUT);
pinMode(SEG_B_PIN, OUTPUT);
pinMode(SEG_C_PIN, OUTPUT);
pinMode(SEG_D_PIN, OUTPUT);
pinMode(SEG_E_PIN, OUTPUT);
pinMode(SEG_F_PIN, OUTPUT);
pinMode(SEG_G_PIN, OUTPUT);
pinMode(SEG_DP_PIN, OUTPUT);
// 初始值为0
digitalWrite(DIG1_PIN, HIGH);
digitalWrite(DIG2_PIN, LOW);
digitalWrite(SEG_A_PIN, HIGH);
digitalWrite(SEG_B_PIN, HIGH);
digitalWrite(SEG_C_PIN, HIGH);
digitalWrite(SEG_D_PIN, HIGH);
digitalWrite(SEG_E_PIN, HIGH);
digitalWrite(SEG_F_PIN, HIGH);
digitalWrite(SEG_G_PIN, LOW);
digitalWrite(SEG_DP_PIN, HIGH);
}
```
4. 定义函数`display_digit`,用于显示一个数字。该函数接收两个参数:要显示的数字和要显示的数码管(1或2)。
```
void display_digit(uint8_t digit, uint8_t display) {
uint8_t pin_a, pin_b, pin_c, pin_d, pin_e, pin_f, pin_g, pin_dp;
// 获取数字对应的段码值
uint8_t digit_val = DIGIT_MAP[digit];
// 根据要显示的数码管选择引脚
if (display == 1) {
pin_a = SEG_A_PIN;
pin_b = SEG_B_PIN;
pin_c = SEG_C_PIN;
pin_d = SEG_D_PIN;
pin_e = SEG_E_PIN;
pin_f = SEG_F_PIN;
pin_g = SEG_G_PIN;
pin_dp = SEG_DP_PIN;
digitalWrite(DIG1_PIN, HIGH);
digitalWrite(DIG2_PIN, LOW);
} else {
pin_a = SEG_A_PIN;
pin_b = SEG_B_PIN;
pin_c = SEG_C_PIN;
pin_d = SEG_D_PIN;
pin_e = SEG_E_PIN;
pin_f = SEG_F_PIN;
pin_g = SEG_G_PIN;
pin_dp = SEG_DP_PIN;
digitalWrite(DIG1_PIN, LOW);
digitalWrite(DIG2_PIN, HIGH);
}
// 根据段码值设置引脚电平
digitalWrite(pin_a, (digit_val & SEG_A_VAL) != 0);
digitalWrite(pin_b, (digit_val & SEG_B_VAL) != 0);
digitalWrite(pin_c, (digit_val & SEG_C_VAL) != 0);
digitalWrite(pin_d, (digit_val & SEG_D_VAL) != 0);
digitalWrite(pin_e, (digit_val & SEG_E_VAL) != 0);
digitalWrite(pin_f, (digit_val & SEG_F_VAL) != 0);
digitalWrite(pin_g, (digit_val & SEG_G_VAL) != 0);
digitalWrite(pin_dp, (digit_val & SEG_DP_VAL) != 0);
}
```
5. 在主函数中循环显示多个数字。
```
void loop() {
uint8_t num1 = 3;
uint8_t num2 = 8;
for (int i = 0; i < 1000; i++) {
display_digit(num1, 1);
delay(5);
display_digit(num2, 2);
delay(5);
}
}
```
在上述代码中,循环显示数字3和8,每个数字显示5ms,总共显示1000次。在每次循环中,先显示第一个数字的第一位(数码管1),再显示第二个数字的第一位(数码管2),然后显示第一个数字的第二位(数码管1),最后显示第二个数字的第二位(数码管2)。通过不断循环显示不同的数字来实现多位数码管显示。
阅读全文