使用stm32f10x.h 使用定时器tim4控制数码管依次显示0-f key_up键开启和关门和关闭

时间: 2023-12-06 15:44:17 浏览: 27
好的,下面是使用定时器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秒。需要注意的是,该代码只是一个示例,具体实现还需要根据自己的硬件电路和需求进行修改。

相关推荐

最新推荐

recommend-type

STM32F4开发指南-库函数版本_V1.1.pdf

本手册将由浅入深,带领大家学习STM32F407F407的各个功能,为您开启全新STM32之旅 。 本手册总共分为三篇(共64章,961页): 1,硬件篇,主要介绍本手册平台;2,软件篇 ,主要介绍STM32F4常用开发软件的使用以及...
recommend-type

STM32F10X系例 NVIC及寄存器记录.docx

重新加深STM32F103系列NVIC中断向量控制器,结合“正点原子”相关教材和《STM32中文参考手册》,写了这篇关于NVIC的总结文档,防止自己忘记后有迹可查。
recommend-type

使用STM32的单个普通定时器产生4路不同频率的方波

STM32的普通定时器有四路输出:TIMx_CH1、TIMx_CH2、TIMx_CH3和TIMx_CH4,可以使用输出比较的方法产生不同频率的方波输出,下面介绍简单的方法
recommend-type

STM32F10xxx_Library_库函数(中文版).pdf

了32 位基于 ARM 微控制器 STM32F101xx 与 STM32F103xx 的固件函数库。该函数库是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括每一个外设的驱动描述和应用实例。...
recommend-type

STM32定时器TIM3程序

STM32定时器TIM3程序:设置NVIC中断分组2:2位抢占优先级,2位响应优先级 TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

2. 通过python绘制y=e-xsin(2πx)图像

可以使用matplotlib库来绘制这个函数的图像。以下是一段示例代码: ```python import numpy as np import matplotlib.pyplot as plt def func(x): return np.exp(-x) * np.sin(2 * np.pi * x) x = np.linspace(0, 5, 500) y = func(x) plt.plot(x, y) plt.xlabel('x') plt.ylabel('y') plt.title('y = e^{-x} sin(2πx)') plt.show() ``` 运行这段
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。