STM32f4数码管倒计时显示
时间: 2023-12-31 10:05:18 浏览: 123
在STM32上连接显示屏,屏幕上显示60s倒计时-源码
5星 · 资源好评率100%
对于STM32f4数码管倒计时显示,你可以使用定时器和GPIO来实现。下面是一个简单的示例代码:
```c
#include "stm32f4xx.h"
// 定义数码管的引脚
#define SEG_A_PIN GPIO_Pin_0
#define SEG_B_PIN GPIO_Pin_1
#define SEG_C_PIN GPIO_Pin_2
#define SEG_D_PIN GPIO_Pin_3
#define SEG_E_PIN GPIO_Pin_4
#define SEG_F_PIN GPIO_Pin_5
#define SEG_G_PIN GPIO_Pin_6
#define SEG_DP_PIN GPIO_Pin_7
// 定义数码管的共阳极连接方式
#define SEG_A_PORT GPIOA
#define SEG_B_PORT GPIOA
#define SEG_C_PORT GPIOA
#define SEG_D_PORT GPIOA
#define SEG_E_PORT GPIOA
#define SEG_F_PORT GPIOA
#define SEG_G_PORT GPIOA
#define SEG_DP_PORT GPIOA
// 定义数码管的位选引脚
#define DIGIT1_PIN GPIO_Pin_8
#define DIGIT2_PIN GPIO_Pin_9
#define DIGIT3_PIN GPIO_Pin_10
#define DIGIT4_PIN GPIO_Pin_11
// 定义数码管的位选端口
#define DIGIT1_PORT GPIOB
#define DIGIT2_PORT GPIOB
#define DIGIT3_PORT GPIOB
#define DIGIT4_PORT GPIOB
// 定义倒计时的时间
#define COUNTDOWN_TIME 60
// 定义全局变量
volatile uint32_t countdown = COUNTDOWN_TIME;
// 初始化定时器
void TIM_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// 使能定时器时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 配置定时器参数
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 定时器周期为1ms
TIM_TimeBaseStructure.TIM_Prescaler = 8400 - 1; // 定时器预分频为8400,即定时器时钟为10kHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 使能定时器更新中断
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
// 配置中断优先级
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 启动定时器
TIM_Cmd(TIM2, ENABLE);
}
// 初始化GPIO
void GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIO时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB, ENABLE);
// 配置数码管引脚为推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin = SEG_A_PIN | SEG_B_PIN | SEG_C_PIN | SEG_D_PIN | SEG_E_PIN | SEG_F_PIN | SEG_G_PIN | SEG_DP_PIN;
GPIO_Init(SEG_A_PORT, &GPIO_InitStructure);
// 配置位选引脚为推挽输出
GPIO_InitStructure.GPIO_Pin = DIGIT1_PIN | DIGIT2_PIN | DIGIT3_PIN | DIGIT4_PIN;
GPIO_Init(DIGIT1_PORT, &GPIO_InitStructure);
}
// 更新数码管显示
void UpdateDisplay(uint32_t value)
{
// 数码管显示的数字和对应的引脚状态
uint8_t digit[4] = {value / 1000, (value / 100) % 10, (value / 10) % 10, value % 10};
uint16_t segment[8] = {SEG_A_PIN, SEG_B_PIN, SEG_C_PIN, SEG_D_PIN, SEG_E_PIN, SEG_F_PIN, SEG_G_PIN, SEG_DP_PIN};
// 关闭所有位选
GPIO_SetBits(DIGIT1_PORT, DIGIT1_PIN);
GPIO_SetBits(DIGIT2_PORT, DIGIT2_PIN);
GPIO_SetBits(DIGIT3_PORT, DIGIT3_PIN);
GPIO_SetBits(DIGIT4_PORT, DIGIT4_PIN);
// 设置数码管引脚状态
for (int i = 0; i < 4; i++)
{
// 设置位选引脚
switch (i)
{
case 0:
GPIO_ResetBits(DIGIT1_PORT, DIGIT1_PIN);
break;
case 1:
GPIO_ResetBits(DIGIT2_PORT, DIGIT2_PIN);
break;
case 2:
GPIO_ResetBits(DIGIT3_PORT, DIGIT3_PIN);
break;
case 3:
GPIO_ResetBits(DIGIT4_PORT, DIGIT4_PIN);
break;
}
// 设置数码管引脚
for (int j = 0; j < 8; j++)
{
if ((digit[i] >> j) & 0x01)
{
GPIO_SetBits(SEG_A_PORT, segment[j]);
}
else
{
GPIO_ResetBits(SEG_A_PORT, segment[j]);
}
}
// 延时一段时间,控制数码管刷新频率
for (volatile int k = 0; k < 1000; k++)
;
}
}
// 定时器中断处理函数
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
if (countdown > 0)
{
countdown--;
}
}
}
int main(void)
{
// 初始化定时器和GPIO
TIM_Init();
GPIO_Init();
while (1)
{
// 更新数码管显示
UpdateDisplay(countdown);
}
}
```
这段代码使用定时器TIM2来实现倒计时功能,每隔1ms触发一次定时器中断,在中断处理函数中更新倒计时的值。然后通过GPIO控制数码管的引脚状态来显示倒计时的时间。
阅读全文