用STM32F1写一个三位一体数码管的计数器显示函数
时间: 2024-06-10 13:05:25 浏览: 174
您好!感谢您的提问,以下是用STM32F1写一个三位一体数码管的计数器显示函数的代码:
```c
#include "stm32f10x.h"
// 数码管使用的IO口
#define DIG_1_GPIO_Port GPIOC
#define DIG_1_Pin GPIO_Pin_0
#define DIG_2_GPIO_Port GPIOC
#define DIG_2_Pin GPIO_Pin_1
#define DIG_3_GPIO_Port GPIOC
#define DIG_3_Pin GPIO_Pin_2
// 数码管位选,共阴极
#define DIG_1_ON() GPIO_ResetBits(DIG_1_GPIO_Port, DIG_1_Pin)
#define DIG_1_OFF() GPIO_SetBits(DIG_1_GPIO_Port, DIG_1_Pin)
#define DIG_2_ON() GPIO_ResetBits(DIG_2_GPIO_Port, DIG_2_Pin)
#define DIG_2_OFF() GPIO_SetBits(DIG_2_GPIO_Port, DIG_2_Pin)
#define DIG_3_ON() GPIO_ResetBits(DIG_3_GPIO_Port, DIG_3_Pin)
#define DIG_3_OFF() GPIO_SetBits(DIG_3_GPIO_Port, DIG_3_Pin)
// 数码管显示的数值和对应的IO口
uint8_t digits[10] = {
0xFC, // 0
0x60, // 1
0xDA, // 2
0xF2, // 3
0x66, // 4
0xB6, // 5
0xBE, // 6
0xE0, // 7
0xFE, // 8
0xF6 // 9
};
#define SEG_A_GPIO_Port GPIOB
#define SEG_A_Pin GPIO_Pin_12
#define SEG_B_GPIO_Port GPIOB
#define SEG_B_Pin GPIO_Pin_13
#define SEG_C_GPIO_Port GPIOB
#define SEG_C_Pin GPIO_Pin_14
#define SEG_D_GPIO_Port GPIOB
#define SEG_D_Pin GPIO_Pin_15
#define SEG_E_GPIO_Port GPIOA
#define SEG_E_Pin GPIO_Pin_8
#define SEG_F_GPIO_Port GPIOA
#define SEG_F_Pin GPIO_Pin_9
#define SEG_G_GPIO_Port GPIOA
#define SEG_G_Pin GPIO_Pin_10
// 显示数码管上的数字
void display_number(uint32_t number) {
uint8_t digit_1 = number % 10;
uint8_t digit_2 = (number / 10) % 10;
uint8_t digit_3 = (number / 100) % 10;
// 数码位1, 低位在前,高位在后
DIG_1_OFF();
// A
GPIO_WriteBit(SEG_A_GPIO_Port, SEG_A_Pin, (digits[digit_1] & 0x01) ? Bit_RESET : Bit_SET);
// B
GPIO_WriteBit(SEG_B_GPIO_Port, SEG_B_Pin, (digits[digit_1] & 0x02) ? Bit_RESET : Bit_SET);
// C
GPIO_WriteBit(SEG_C_GPIO_Port, SEG_C_Pin, (digits[digit_1] & 0x04) ? Bit_RESET : Bit_SET);
// D
GPIO_WriteBit(SEG_D_GPIO_Port, SEG_D_Pin, (digits[digit_1] & 0x08) ? Bit_RESET : Bit_SET);
// E
GPIO_WriteBit(SEG_E_GPIO_Port, SEG_E_Pin, (digits[digit_1] & 0x10) ? Bit_RESET : Bit_SET);
// F
GPIO_WriteBit(SEG_F_GPIO_Port, SEG_F_Pin, (digits[digit_1] & 0x20) ? Bit_RESET : Bit_SET);
// G
GPIO_WriteBit(SEG_G_GPIO_Port, SEG_G_Pin, (digits[digit_1] & 0x40) ? Bit_RESET : Bit_SET);
// 数码管1亮
DIG_1_ON();
delay();
// 数码位2
DIG_2_OFF();
// A
GPIO_WriteBit(SEG_A_GPIO_Port, SEG_A_Pin, (digits[digit_2] & 0x01) ? Bit_RESET : Bit_SET);
// B
GPIO_WriteBit(SEG_B_GPIO_Port, SEG_B_Pin, (digits[digit_2] & 0x02) ? Bit_RESET : Bit_SET);
// C
GPIO_WriteBit(SEG_C_GPIO_Port, SEG_C_Pin, (digits[digit_2] & 0x04) ? Bit_RESET : Bit_SET);
// D
GPIO_WriteBit(SEG_D_GPIO_Port, SEG_D_Pin, (digits[digit_2] & 0x08) ? Bit_RESET : Bit_SET);
// E
GPIO_WriteBit(SEG_E_GPIO_Port, SEG_E_Pin, (digits[digit_2] & 0x10) ? Bit_RESET : Bit_SET);
// F
GPIO_WriteBit(SEG_F_GPIO_Port, SEG_F_Pin, (digits[digit_2] & 0x20) ? Bit_RESET : Bit_SET);
// G
GPIO_WriteBit(SEG_G_GPIO_Port, SEG_G_Pin, (digits[digit_2] & 0x40) ? Bit_RESET : Bit_SET);
// 数码管2亮
DIG_2_ON();
delay();
// 数码位3
DIG_3_OFF();
// A
GPIO_WriteBit(SEG_A_GPIO_Port, SEG_A_Pin, (digits[digit_3] & 0x01) ? Bit_RESET : Bit_SET);
// B
GPIO_WriteBit(SEG_B_GPIO_Port, SEG_B_Pin, (digits[digit_3] & 0x02) ? Bit_RESET : Bit_SET);
// C
GPIO_WriteBit(SEG_C_GPIO_Port, SEG_C_Pin, (digits[digit_3] & 0x04) ? Bit_RESET : Bit_SET);
// D
GPIO_WriteBit(SEG_D_GPIO_Port, SEG_D_Pin, (digits[digit_3] & 0x08) ? Bit_RESET : Bit_SET);
// E
GPIO_WriteBit(SEG_E_GPIO_Port, SEG_E_Pin, (digits[digit_3] & 0x10) ? Bit_RESET : Bit_SET);
// F
GPIO_WriteBit(SEG_F_GPIO_Port, SEG_F_Pin, (digits[digit_3] & 0x20) ? Bit_RESET : Bit_SET);
// G
GPIO_WriteBit(SEG_G_GPIO_Port, SEG_G_Pin, (digits[digit_3] & 0x40) ? Bit_RESET : Bit_SET);
// 数码管3亮
DIG_3_ON();
delay();
}
// 延时函数
void delay() {
uint32_t delay = 200000;
while (delay > 0) {
delay--;
}
}
```
在这个函数中,我们使用了STM32F1的GPIO和定时器功能来显示一个三位数的计数器。首先我们定义了每个数码管使用的IO口和位选函数,然后定义了每个数字对应的段选编码。在将数字显示到数码管上时,我们首先取出个位、十位和百位数字,然后针对每个数码位,循环设置对应的段选值和位选值。为了让数码管显示更加稳定,我们还加入了一个简单的延时函数。
希望这个代码能够解决您的问题,如果您有任何其他问题,请随时提出。
阅读全文