使用stm32f10x.h 使用定时器tim4控制数码管依次显示0-f key_up键开启和关门和关闭
时间: 2023-12-06 20:44:17 浏览: 71
好的,下面是使用定时器TIM4控制数码管依次显示0-f以及按键控制开关门和关闭的代码示例:
```c
#include "stm32f10x.h"
#include "delay.h" // 延时函数库
// 数码管位选引脚和段选引脚控制的GPIO口和引脚号
#define DIGIT_GPIO GPIOB
#define SEG_GPIO GPIOA
#define DIGIT_BIT0 GPIO_Pin_0
#define DIGIT_BIT1 GPIO_Pin_1
#define DIGIT_BIT2 GPIO_Pin_2
#define DIGIT_BIT3 GPIO_Pin_3
#define SEG_A GPIO_Pin_0
#define SEG_B GPIO_Pin_1
#define SEG_C GPIO_Pin_2
#define SEG_D GPIO_Pin_3
#define SEG_E GPIO_Pin_4
#define SEG_F GPIO_Pin_5
#define SEG_G GPIO_Pin_6
#define SEG_DP GPIO_Pin_7
// 按键引脚控制的GPIO口和引脚号
#define KEY_GPIO GPIOC
#define KEY_UP GPIO_Pin_13
// 开门和关门引脚控制的GPIO口和引脚号
#define DOOR_GPIO GPIOC
#define OPEN_DOOR GPIO_Pin_14
#define CLOSE_DOOR GPIO_Pin_15
// 数码管显示的字符数组,依次为0-f
const uint8_t digit[16] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
// 定义计数器和当前显示的数码管位
volatile uint8_t count = 0;
volatile uint8_t digit_pos = 0;
// 定时器TIM4中断服务函数
void TIM4_IRQHandler(void)
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) // 判断是否为更新中断
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update); // 清除中断标志位
digit_pos++; // 显示下一个数码管位
if (digit_pos >= 4)
{
digit_pos = 0;
}
// 依次使能对应的数码管位选引脚,显示对应的数字
switch (digit_pos)
{
case 0:
DIGIT_GPIO->BSRR = DIGIT_BIT0 << 16; // 数码管位选引脚0拉低,使能第一个数码管位
SEG_GPIO->ODR = digit[count % 16]; // 显示计数器count的个位
break;
case 1:
DIGIT_GPIO->BSRR = DIGIT_BIT1 << 16; // 数码管位选引脚1拉低,使能第二个数码管位
SEG_GPIO->ODR = digit[(count / 16) % 16]; // 显示计数器count的十位
break;
case 2:
DIGIT_GPIO->BSRR = DIGIT_BIT2 << 16; // 数码管位选引脚2拉低,使能第三个数码管位
SEG_GPIO->ODR = digit[(count / 256) % 16]; // 显示计数器count的百位
break;
case 3:
DIGIT_GPIO->BSRR = DIGIT_BIT3 << 16; // 数码管位选引脚3拉低,使能第四个数码管位
SEG_GPIO->ODR = digit[(count / 4096) % 16]; // 显示计数器count的千位
break;
default:
break;
}
}
}
// 初始化GPIO口
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 数码管位选引脚和段选引脚控制的GPIO口配置为推挽输出
GPIO_InitStructure.GPIO_Pin = DIGIT_BIT0 | DIGIT_BIT1 | DIGIT_BIT2 | DIGIT_BIT3 | SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G | SEG_DP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = DIGIT_BIT0 | DIGIT_BIT1 | DIGIT_BIT2 | DIGIT_BIT3;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 按键引脚控制的GPIO口配置为上拉输入
GPIO_InitStructure.GPIO_Pin = KEY_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(KEY_GPIO, &GPIO_InitStructure);
// 开门和关门引脚控制的GPIO口配置为推挽输出
GPIO_InitStructure.GPIO_Pin = OPEN_DOOR | CLOSE_DOOR;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(DOOR_GPIO, &GPIO_InitStructure);
}
// 初始化定时器TIM4
void TIM4_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); // 使能TIM4时钟
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 定时器周期1ms
TIM_TimeBaseStructure.TIM_Prescaler = 7200 - 1; // 定时器预分频7200
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); // 初始化定时器
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); // 使能定时器更新中断
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); // 初始化定时器中断向量表
TIM_Cmd(TIM4, ENABLE); // 使能定时器
}
int main(void)
{
GPIO_Configuration(); // 初始化GPIO口
TIM4_Configuration(); // 初始化定时器TIM4
delay_init(); // 初始化延时函数库
while (1)
{
if (GPIO_ReadInputDataBit(KEY_GPIO, KEY_UP) == RESET) // 检测按键是否按下
{
// 按键按下,开门
DOOR_GPIO->BSRR = OPEN_DOOR; // 开门引脚拉低
delay_ms(3000); // 等待3秒
DOOR_GPIO->BRR = OPEN_DOOR; // 开门引脚拉高
}
else
{
// 按键未按下,关门
DOOR_GPIO->BSRR = CLOSE_DOOR; // 关门引脚拉低
delay_ms(3000); // 等待3秒
DOOR_GPIO->BRR = CLOSE_DOOR; // 关门引脚拉高
}
count++; // 计数器加1
delay_ms(100); // 延时100ms
}
}
```
上述代码利用定时器TIM4的更新中断来控制数码管的显示,每隔1ms切换到下一个数码管位,并显示计数器count对应位的数字。同时检测按键是否按下,按下时开门,未按下时关门,开门和关门的时间均为3秒。需要注意的是,该代码只是一个示例,具体实现还需要根据自己的硬件电路和需求进行修改。
阅读全文