用stm32实现共阴数码管显示
时间: 2023-11-12 12:07:40 浏览: 253
共阴数码管显示和共阳数码管显示的原理是相反的,共阴数码管的数字显示是通过将数码管的阴极接地,然后通过给对应的阳极接通电流来实现的。
下面是一个使用STM32实现共阴数码管显示的简单示例代码,以4位共阴数码管为例:
```C
#include "stm32f10x.h"
#define LED_PORT GPIOB // 数码管控制端口
#define LED_PIN_0 GPIO_Pin_0 // 数码管第0位控制引脚
#define LED_PIN_1 GPIO_Pin_1 // 数码管第1位控制引脚
#define LED_PIN_2 GPIO_Pin_2 // 数码管第2位控制引脚
#define LED_PIN_3 GPIO_Pin_3 // 数码管第3位控制引脚
void delay_us(uint32_t us) {
// 微秒级延时函数
uint32_t i;
for (i = 0; i < us * 8; i++);
}
void led_init() {
// 数码管控制端口初始化
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = LED_PIN_0 | LED_PIN_1 | LED_PIN_2 | LED_PIN_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_PORT, &GPIO_InitStructure);
}
void led_display(uint8_t digit) {
// 数码管显示函数
static uint8_t digit_cnt = 0;
GPIO_Write(LED_PORT, 0x0f); // 关闭所有数码管
switch (digit_cnt) {
case 0:
GPIO_ResetBits(LED_PORT, LED_PIN_0); // 选中第0位数码管
break;
case 1:
GPIO_ResetBits(LED_PORT, LED_PIN_1); // 选中第1位数码管
break;
case 2:
GPIO_ResetBits(LED_PORT, LED_PIN_2); // 选中第2位数码管
break;
case 3:
GPIO_ResetBits(LED_PORT, LED_PIN_3); // 选中第3位数码管
break;
}
GPIO_Write(LED_PORT, ~(1 << digit)); // 显示数字
digit_cnt = (digit_cnt + 1) % 4; // 更新计数器
}
int main(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOB时钟
led_init(); // 数码管控制端口初始化
while (1) {
for (uint8_t i = 0; i < 10; i++) {
led_display(i); // 显示数字0~9
delay_us(1000); // 延时1ms
}
}
}
```
这个示例代码使用了STM32的GPIO模块来控制4位共阴数码管的显示。在led_init函数中,通过设置GPIO模块的工作模式和输出模式来初始化数码管控制端口。在led_display函数中,先通过GPIO_Write函数将数码管的所有阴极都设置为高电平,然后根据当前计数器的值选中需要显示的数码管,最后通过GPIO_Write函数将对应的数字显示出来。
需要注意的是,在共阴数码管显示中,数字显示的时候需要将对应的阴极设置为低电平,其余阴极保持高电平。同时,在使用延时函数时需要根据实际情况进行调整,以保证数字显示稳定。
阅读全文