stm32f103写一个在Lcd1602上显示的计时器程序
时间: 2023-12-05 15:02:59 浏览: 32
下面是一个简单的计时器程序,使用STM32F103和LCD1602显示器。程序使用定时器2和外部中断0来计时,按下按钮时,计时器开始计时,再次按下按钮时,计时器停止计时并将时间显示在LCD上。
```c
#include "stm32f10x.h"
#include "lcd1602.h"
volatile uint32_t tick = 0;
volatile uint32_t start_time = 0;
volatile uint32_t end_time = 0;
volatile uint8_t running = 0;
void TIM2_IRQHandler(void)
{
if (TIM2->SR & TIM_SR_UIF)
{
tick++;
TIM2->SR &= ~TIM_SR_UIF;
}
}
void EXTI0_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line0) != RESET)
{
if (running)
{
end_time = tick;
running = 0;
}
else
{
start_time = tick;
running = 1;
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
void delay_ms(uint32_t ms)
{
uint32_t start_tick = tick;
while (tick - start_tick < ms) {}
}
int main(void)
{
SysTick_Config(SystemCoreClock / 1000);
LCD_Init();
LCD_Clear();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM2->PSC = SystemCoreClock / 10000 - 1;
TIM2->ARR = 999;
TIM2->DIER |= TIM_DIER_UIE;
TIM2->CR1 |= TIM_CR1_CEN;
NVIC_EnableIRQ(TIM2_IRQn);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_EnableIRQ(EXTI0_IRQn);
while (1)
{
uint32_t elapsed_time;
if (running)
{
elapsed_time = tick - start_time;
}
else
{
elapsed_time = end_time - start_time;
}
uint32_t sec = elapsed_time / 100;
uint32_t msec = elapsed_time % 100;
char str[17];
sprintf(str, "Time: %2d.%02d s", sec, msec);
LCD_SetCursor(0, 0);
LCD_Print(str);
delay_ms(100);
}
}
```
在这个程序中,我们使用SysTick定时器来增加tick变量的值,tick变量用于计算经过的时间。我们使用定时器2来实现100Hz的计时器,当定时器溢出时,我们递增tick变量。当按下按钮时,我们记录开始时间(start_time),再次按下按钮时,我们记录结束时间(end_time),然后计算经过的时间。在主循环中,我们使用LCD1602显示器显示经过的时间。