按键中断控制LED灯亮灭

2023-10-22 17:29
文章标签 led 中断 控制 按键 灯亮

本文主要是介绍按键中断控制LED灯亮灭,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

EXTI—外部中断/事件控制器

EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 20 个中断/事 件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的 检测。EXTI可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触 发事件的属性

 

EXTI 功能框

 

中断/事件线

硬件设计:

软件设计:

创建两个文件Key.c和Key.h,用来存放按键驱动程序即相关宏定义。

编程要点:

(1)初始化用来产生中断的GPIO。
(2)初始化EXTI。
(3)配置NVIC。
(4)编写中断服务函数。

Key.c文件

#include "Key.h"
#include "Led.h"void Key_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);  //开启GPIOE时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);    //开启AFIO时钟GPIO_InitTypeDef  GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;   //上拉输入GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;    //引脚4GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOE,&GPIO_InitStruct);GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);   //选择外部中断线 AFIOEXTI_InitTypeDef  EXIT_InitStruct;   //定义外部中断结构体EXIT_InitStruct.EXTI_Line = EXTI_Line4;  //选择外部中断线EXIT_InitStruct.EXTI_LineCmd = ENABLE;    //使能外部中断EXIT_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;   //中断模式EXIT_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;   //上升沿触发EXTI_Init(&EXIT_InitStruct);  //初始化外部中断/*配置NVIC为优先级组*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   //配置NVICNVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel = EXTI4_IRQn; /*配置中断源:按键0*/NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;  /*配置抢占优先级:1*/NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;			/*配置子优先级:1*/NVIC_Init(&NVIC_InitStruct);
}void Key1_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);   //开启AFIO时钟GPIO_InitTypeDef  GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;   //上拉输入GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOE,&GPIO_InitStruct);GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);	   ///*选择EXTI的信号源*/EXTI_InitTypeDef  EXIT_InitStruct;   //定义外部中断结构体EXIT_InitStruct.EXTI_Line = EXTI_Line3;  //选择外部中断线EXIT_InitStruct.EXTI_LineCmd = ENABLE;    //使能外部中断EXIT_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;   //中断模式EXIT_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;   //上升沿触发EXTI_Init(&EXIT_InitStruct);  //初始化外部中断/*配置NVIC为优先级组*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   //配置NVICNVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel = EXTI3_IRQn;  /*配置中断源:按键1*/NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;  /*配置抢占优先级:1*/NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;    	/*配置子优先级:2*/NVIC_Init(&NVIC_InitStruct);}void  EXTI4_IRQHandler(void)
{/*确认是否产生了EXTI Line中断*/if(EXTI_GetITStatus(EXTI_Line4) != RESET)  {LED_ON();   //按键按下灯亮//清除中断标志位EXTI_ClearITPendingBit(EXTI_Line4);}}void  EXTI3_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line3) != RESET)   //不等于0条件为真{LED_OFF();   //按键按下灯灭EXTI_ClearITPendingBit(EXTI_Line3);}

Key.h文件

#ifndef __KEY_H
#define __KEY_H#include "stm32f10x.h"                  // Device headervoid Key_Init(void);
void Key1_Init(void);#endif 

Led.c文件

#include "Led.h"void LED_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOE, &GPIO_InitStructure);GPIO_SetBits(GPIOE, GPIO_Pin_5);}void LED_ON()   //灯亮
{GPIO_ResetBits(GPIOE, GPIO_Pin_5);}void LED_OFF()   //灯灭
{GPIO_SetBits(GPIOE, GPIO_Pin_5);}

Led.h文件

#ifndef __LED_H
#define __LED_H#include "stm32f10x.h"                  // Device headervoid LED_Init(void);
void LED_ON(void);
void LED_OFF(void);#define LED1_TOGGLE		{GPIOE->ODR ^=GPIO_Pin_5;} //绿灯状态翻转    异或操作#endif

main.c文件

#include "stm32f10x.h"                  // Device header
#include "Led.h"
#include "Key.h"int main(void)
{LED_Init();Key_Init();Key1_Init();while(1){}}

这篇关于按键中断控制LED灯亮灭的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/262677

相关文章

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹

Spring Security注解方式权限控制过程

《SpringSecurity注解方式权限控制过程》:本文主要介绍SpringSecurity注解方式权限控制过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、摘要二、实现步骤2.1 在配置类中添加权限注解的支持2.2 创建Controller类2.3 Us

Python中如何控制小数点精度与对齐方式

《Python中如何控制小数点精度与对齐方式》在Python编程中,数据输出格式化是一个常见的需求,尤其是在涉及到小数点精度和对齐方式时,下面小编就来为大家介绍一下如何在Python中实现这些功能吧... 目录一、控制小数点精度1. 使用 round() 函数2. 使用字符串格式化二、控制对齐方式1. 使用