基于keil编写STM32f103ze代码:当key1按下并抬起时,开始计时,再次按下抬起时计时结束,在TFTLCD上显示计时的时间
时间: 2024-05-13 14:19:20 浏览: 199
首先,需要初始化相关的硬件和计时器。假设TFTLCD显示采用SPI接口,计时器选择TIM2,按键key1接在GPIOA的第0引脚上。
```c
#include "stm32f10x.h" //包含了STM32F103ZE芯片的头文件
#include "delay.h" //包含了延时函数的头文件
#include "tftlcd.h" //包含了TFTLCD驱动的头文件
void TIM2_IRQHandler(void) //定时器2的中断服务函数
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //判断是否为更新中断
{
TIM_Cmd(TIM2, DISABLE); //关闭定时器2
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除中断标志
}
}
void EXTI0_IRQHandler(void) //外部中断0的中断服务函数
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET) //判断是否为外部中断0
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == RESET) //判断按键是否按下
{
TIM_Cmd(TIM2, ENABLE); //打开定时器2
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == RESET); //等待按键松开
}
else
{
TIM_Cmd(TIM2, DISABLE); //关闭定时器2
uint16_t time = TIM_GetCounter(TIM2); //读取定时器2的计数值
char str[6];
sprintf(str, "%5d", time); //将计数值转换成字符串
LCD_ShowString(0, 0, (u8*)"time: ms", RED); //在LCD上显示计时结果
LCD_ShowString(48, 0, (u8*)str, BLUE);
TIM_SetCounter(TIM2, 0); //重置定时器2的计数值
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) != RESET); //等待按键按下
}
EXTI_ClearITPendingBit(EXTI_Line0); //清除外部中断0的中断标志
}
}
int main(void)
{
SystemInit(); //系统时钟初始化
delay_init(); //延时函数初始化
LCD_Init(); //TFTLCD初始化
LCD_Clear(RED); //清屏
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器2时钟
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //设定自动重载值
TIM_TimeBaseStructure.TIM_Prescaler = 71; //设定预分频值,时钟频率为72MHz/(71+1)=1MHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //初始化定时器2
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //定时器2中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级为1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断通道
NVIC_Init(&NVIC_InitStructure); //初始化中断向量表
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除中断标志
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //使能更新中断
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //按键key1接在GPIOA的第0脚上
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO速度50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line0; //外部中断0
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //上升沿和下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中断线
EXTI_Init(&EXTI_InitStructure); //初始化外部中断
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //外部中断0中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断通道
NVIC_Init(&NVIC_InitStructure); //初始化中断向量表
while(1)
{
}
}
```
在代码中,我们使用了定时器2和外部中断0来实现计时功能。当按键key1按下时,定时器2开始计算时间;当按键key1再次按下时,定时器2停止计时,并将计时结果显示在TFTLCD上。
需要注意的是,在使用定时器2的过程中,我们需要在中断服务函数中关闭定时器2,并清除中断标志。这样才能保证下一次计时的准确性。
另外,我们还需要在外部中断0的中断服务函数中等待按键松开和按键按下。这样才能保证计时的准确性。
阅读全文
相关推荐
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![7z](https://img-home.csdnimg.cn/images/20241231044736.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)