用stm32f103c8t6写一个3461BS1-7.3显示单独控制四个数字的代码
时间: 2023-09-04 17:12:49 浏览: 282
STM32F103C8T6开发板实验例程:按键操作实验程序源代码.rar
下面是使用STM32F103C8T6控制3461BS1-7.3显示单独控制四个数字的简单代码示例:
```c
#include "stm32f10x.h"
// 定义数码管控制端口
#define DIG_PORT GPIOB
#define DIG_PIN_1 GPIO_Pin_0
#define DIG_PIN_2 GPIO_Pin_1
#define DIG_PIN_3 GPIO_Pin_10
#define DIG_PIN_4 GPIO_Pin_11
// 定义数码管显示端口
#define SEG_PORT GPIOC
#define SEG_PIN_A GPIO_Pin_0
#define SEG_PIN_B GPIO_Pin_1
#define SEG_PIN_C GPIO_Pin_2
#define SEG_PIN_D GPIO_Pin_3
#define SEG_PIN_E GPIO_Pin_4
#define SEG_PIN_F GPIO_Pin_5
#define SEG_PIN_G GPIO_Pin_6
#define SEG_PIN_DP GPIO_Pin_7
// 数码管显示字形表
const uint8_t DIG_TABLE[] = {
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f, // 9
};
// 数码管显示缓存
uint8_t DIG_CACHE[] = {
0xff, // 数码管1
0xff, // 数码管2
0xff, // 数码管3
0xff, // 数码管4
};
// 数码管显示控制
uint8_t DIG_CTRL[] = {
0, // 数码管1
0, // 数码管2
0, // 数码管3
0, // 数码管4
};
// 数码管位选函数
void dig_select(uint8_t idx) {
switch (idx) {
case 0:
GPIO_WriteBit(DIG_PORT, DIG_PIN_1, Bit_RESET);
GPIO_WriteBit(DIG_PORT, DIG_PIN_2, Bit_SET);
GPIO_WriteBit(DIG_PORT, DIG_PIN_3, Bit_SET);
GPIO_WriteBit(DIG_PORT, DIG_PIN_4, Bit_SET);
break;
case 1:
GPIO_WriteBit(DIG_PORT, DIG_PIN_1, Bit_SET);
GPIO_WriteBit(DIG_PORT, DIG_PIN_2, Bit_RESET);
GPIO_WriteBit(DIG_PORT, DIG_PIN_3, Bit_SET);
GPIO_WriteBit(DIG_PORT, DIG_PIN_4, Bit_SET);
break;
case 2:
GPIO_WriteBit(DIG_PORT, DIG_PIN_1, Bit_SET);
GPIO_WriteBit(DIG_PORT, DIG_PIN_2, Bit_SET);
GPIO_WriteBit(DIG_PORT, DIG_PIN_3, Bit_RESET);
GPIO_WriteBit(DIG_PORT, DIG_PIN_4, Bit_SET);
break;
case 3:
GPIO_WriteBit(DIG_PORT, DIG_PIN_1, Bit_SET);
GPIO_WriteBit(DIG_PORT, DIG_PIN_2, Bit_SET);
GPIO_WriteBit(DIG_PORT, DIG_PIN_3, Bit_SET);
GPIO_WriteBit(DIG_PORT, DIG_PIN_4, Bit_RESET);
break;
default:
GPIO_WriteBit(DIG_PORT, DIG_PIN_1, Bit_SET);
GPIO_WriteBit(DIG_PORT, DIG_PIN_2, Bit_SET);
GPIO_WriteBit(DIG_PORT, DIG_PIN_3, Bit_SET);
GPIO_WriteBit(DIG_PORT, DIG_PIN_4, Bit_SET);
break;
}
}
// 数码管显示函数
void dig_display(uint8_t idx, uint8_t val) {
DIG_CTRL[idx] = val;
DIG_CACHE[idx] = DIG_TABLE[val];
}
// 数码管显示初始化函数
void dig_init() {
// 数码管控制端口初始化
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = DIG_PIN_1 | DIG_PIN_2 | DIG_PIN_3 | DIG_PIN_4;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DIG_PORT, &GPIO_InitStruct);
// 数码管显示端口初始化
GPIO_InitStruct.GPIO_Pin = SEG_PIN_A | SEG_PIN_B | SEG_PIN_C | SEG_PIN_D | SEG_PIN_E | SEG_PIN_F | SEG_PIN_G | SEG_PIN_DP;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SEG_PORT, &GPIO_InitStruct);
// 数码管显示缓存清零
for (int i = 0; i < 4; i++) {
DIG_CACHE[i] = 0xff;
}
}
int main(void) {
// 数码管显示初始化
dig_init();
// 数码管显示测试
uint8_t cnt = 0;
while (1) {
for (int i = 0; i < 4; i++) {
dig_select(i);
GPIO_Write(SEG_PORT, DIG_CACHE[i]);
DIG_CTRL[i] = (DIG_CTRL[i] + 1) % 10;
dig_display(i, DIG_CTRL[i]);
for (int j = 0; j < 1000; j++);
}
}
}
```
在这个代码示例中,我们使用了STM32F103C8T6的GPIO模块来控制四个3461BS1-7.3数码管的显示。我们首先定义了数码管控制端口和数码管显示端口,然后定义了数码管显示字形表和显示缓存。在初始化函数中,我们初始化了数码管控制端口和数码管显示端口,并将显示缓存清零。在主函数中,我们循环遍历四个数码管,依次将其选中并显示对应的数字。在每次循环中,我们还将对应数码管的数字加1,以便在下次循环中显示下一个数字。
需要注意的是,这个代码示例只是一个简单的数码管显示程序,如果需要实现更复杂的功能,比如显示实时时间、温度等,需要根据具体的需求进行修改。
阅读全文