二位秒表倒计时显示器stm32代码
时间: 2023-07-09 16:30:18 浏览: 66
以下是一个基于STM32的二位秒表倒计时显示器的代码示例,代码中使用了STM32的定时器模块和GPIO模块,实现了秒表倒计时和数码管显示功能。
```
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#define TIMER_PRESCALER 72 // 定时器分频系数
#define TIMER_PERIOD 1000 // 定时器周期,单位为毫秒
// 数码管控制引脚定义
#define DIGIT_PIN1 GPIO_Pin_0 // 数码管第一位控制引脚
#define DIGIT_PIN2 GPIO_Pin_1 // 数码管第二位控制引脚
#define SEGMENT_PORT GPIOA // 数码管段选IO口
#define SEGMENT_PIN1 GPIO_Pin_2 // 数码管第一位段选引脚
#define SEGMENT_PIN2 GPIO_Pin_3 // 数码管第二位段选引脚
// 数码管数字显示数据定义
const uint8_t DIGIT_DATA[] = {
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f, // 9
};
volatile uint32_t g_tick_counter = 0; // 计时器计数器,单位为毫秒
volatile uint8_t g_second_counter = 0; // 秒表计时器计数器,单位为秒
volatile uint8_t g_is_running = 0; // 秒表是否正在运行标志,0表示未运行,1表示正在运行
/**
* @brief 定时器中断处理函数
*/
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
g_tick_counter++; // 计时器计数器加1,单位为毫秒
if (g_is_running) {
if (g_tick_counter % 1000 == 0) {
// 每秒钟更新一次秒表计时器计数器
g_second_counter--;
}
if (g_second_counter == 0) {
// 秒表计时器计数器为0时,停止秒表
g_is_running = 0;
}
}
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
/**
* @brief 数码管显示函数
* @param value 显示的数值,取值范围为0~99
*/
void display(uint8_t value)
{
GPIO_ResetBits(SEGMENT_PORT, SEGMENT_PIN1 | SEGMENT_PIN2);
GPIO_SetBits(SEGMENT_PORT, g_second_counter == 0 ? SEGMENT_PIN1 : SEGMENT_PIN2); // 根据数值选择要显示的数码管
uint8_t digit1 = value / 10;
uint8_t digit2 = value % 10;
GPIO_Write(SEGMENT_PORT, DIGIT_DATA[digit1] << 8 | DIGIT_DATA[digit2]); // 输出段选和数值
GPIO_SetBits(SEGMENT_PORT, g_second_counter == 0 ? DIGIT_PIN1 : DIGIT_PIN2); // 点亮数码管
}
int main(void)
{
// 初始化时钟及GPIO模块
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
GPIO_InitTypeDef gpio_init;
// 配置定时器
TIM_TimeBaseInitTypeDef tim_init;
tim_init.TIM_Prescaler = TIMER_PRESCALER - 1;
tim_init.TIM_CounterMode = TIM_CounterMode_Up;
tim_init.TIM_Period = TIMER_PERIOD - 1;
tim_init.TIM_ClockDivision = 0;
TIM_TimeBaseInit(TIM2, &tim_init);
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE);
// 配置GPIO
gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
gpio_init.GPIO_Speed = GPIO_Speed_2MHz;
gpio_init.GPIO_Pin = DIGIT_PIN1 | DIGIT_PIN2 | SEGMENT_PIN1 | SEGMENT_PIN2;
GPIO_Init(SEGMENT_PORT, &gpio_init);
// 初始化按键
key_init();
// 启动定时器
while (1) {
if (key_scan() == KEY_DOWN) {
// 按下按键,启动/停止秒表
g_is_running = !g_is_running;
if (g_is_running) {
// 重新开始计时
g_second_counter = 60;
g_tick_counter = 0;
}
}
if (g_is_running) {
// 秒表正在运行,更新计时器显示
display(g_second_counter);
} else {
// 秒表停止运行,显示00
display(0);
}
delay_ms(1);
}
}
```
需要注意的是,以上代码仅供参考,具体实现细节可能会根据具体的硬件和需求而有所不同,需要根据实际情况进行调整。