数码管显示不用delay
时间: 2025-06-23 12:26:43 浏览: 3
### 不使用 `delay` 函数实现数码管显示
为了实现在数码管显示中避免使用 `delay` 函数,可以采用定时器中断的方式来进行动态扫描。这种方法不仅提高了系统的实时性和响应能力,还解决了因长时间占用 CPU 导致的闪烁问题。
#### 定时器中断方式
通过配置定时器,在每次定时器溢出中断发生时更新数码管的显示内容。这种方式使得主程序能够继续处理其他任务而不被阻塞。具体来说:
- **初始化设置**:配置定时器的工作模式、预分频系数和自动重装载值,使定时器按照设定的时间间隔触发中断。
- **中断服务程序 (ISR)**:在定时器中断服务程序中完成数码管的位选通控制和段码数据发送操作。每当中断到来时,切换到下一个要显示的位置并刷新相应的段码。
```c
// 初始化定时器TIM2, 设置为向上计数模式,频率设为1KHz
void TIM2_Init(void){
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = 7999; // 自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler = 7199; // 预分频系数
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
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 = 0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2, ENABLE);
}
// 定义全局变量用于存储当前秒数和毫秒数
extern unsigned char sec;
extern unsigned int mms;
// 定时器2中断服务程序
interrupt void TIM2_IRQHandler(void) {
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
mms++;
if(mms >= 1000) {
mms = 0;
sec++;
if(sec >= 60) {
sec = 0;
}
}
// 更新数码管显示
SECWatch_Display(sec, mms);
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
```
上述代码展示了如何利用STM32中的定时器TIM2来代替传统的`delay()`函数进行延时,并且实现了每隔一定周期刷新一次数码管的功能[^4]。
阅读全文
相关推荐



















