stm32标准库定义两个按键控制数码管
时间: 2023-06-18 13:08:28 浏览: 100
可以使用STM32标准库中的GPIO和TIM库来实现两个按键控制数码管的功能。
首先需要初始化GPIO和TIM,以及定时器中断。
```c
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
// 初始化GPIO
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; // PA0 和 PA1 作为按键输入
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; // 设置为输入模式
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // 上拉输入
GPIO_Init(GPIOA, &GPIO_InitStruct);
// 初始化TIM
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitStruct.TIM_Prescaler = 8399; // 时钟预分频为8400,使得计数器每1ms加1
TIM_TimeBaseInitStruct.TIM_Period = 999; // 计数器上限为1000,计数器每计满1000次即1s
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
// 定时器中断
NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 允许更新中断
TIM_Cmd(TIM2, ENABLE); // 启动计数器
```
然后在TIM中断函数中读取按键状态,根据按键状态更新数码管的显示。
```c
void TIM2_IRQHandler(void)
{
static uint32_t last_time = 0;
static uint8_t last_key1 = 1, last_key2 = 1;
uint8_t cur_key1, cur_key2;
uint32_t cur_time;
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
cur_time = TIM_GetCounter(TIM2);
cur_key1 = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
cur_key2 = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1);
if (cur_key1 == 0 && last_key1 == 1) // KEY1 按下
{
// 更新数码管的显示
}
if (cur_key2 == 0 && last_key2 == 1) // KEY2 按下
{
// 更新数码管的显示
}
last_time = cur_time;
last_key1 = cur_key1;
last_key2 = cur_key2;
}
}
```
这里使用TIM2作为定时器,时钟频率为84MHz,预分频为8399,计数器每1ms加1,计数器上限为1000,即计数器每计满1000次即1s,产生一次TIM2更新中断。在TIM2中断函数中,先获取当前时间和按键状态,然后判断按键是否按下,如果按下则更新数码管的显示。最后更新上一次时间和按键状态。
阅读全文