//通过外部中断源INT1实现按键控制LED灯的亮灭 //通过低电平触发外部中断源INT1,实现按键控制LED灯的亮灭
时间: 2023-06-17 12:07:04 浏览: 55
好的,这是一个基于外部中断的按键控制LED灯的程序,你可以参考一下:
```c
#include <reg52.h> //头文件
sbit LED = P1^0; //定义LED接口
sbit KEY = P3^3; //定义按键接口
void delay(unsigned int xms) //延时函数
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void key_isr() interrupt 2 //中断服务函数
{
delay(10); //消抖
if(KEY == 0) //按键按下
{
LED = ~LED; //LED取反
while(!KEY); //等待按键释放
}
}
void main()
{
EA = 1; //开总中断
IT1 = 1; //设置INT1为下降沿触发
EX1 = 1; //使能INT1中断
while(1); //循环等待
}
```
程序的大致思路是:当按键按下时,触发外部中断INT1,中断服务函数中判断按键是否按下,如果按下则LED状态取反,最后等待按键释放。在主函数中,使能外部中断INT1并进入循环等待状态。当按键被按下时,中断服务函数会被执行,LED状态会改变。
相关问题
stm32外部中断按键实现一个按键控制一个LED灯的亮灭
好的,这是一个基于STM32的外部中断和GPIO口实现按键控制LED灯亮灭的简单例程。
首先需要配置GPIO口和外部中断。以下是初始化代码:
```c
GPIO_InitTypeDef GPIO_InitStruct = {0};
EXTI_InitTypeDef EXTI_InitStruct = {0};
NVIC_InitTypeDef NVIC_InitStruct = {0};
// 使能GPIO时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置按键引脚为输入
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 使能外部中断时钟
__HAL_RCC_SYSCFG_CLK_ENABLE();
// 配置外部中断线路
EXTI_InitStruct.Line = EXTI_LINE_0;
EXTI_InitStruct.Mode = EXTI_MODE_INTERRUPT;
EXTI_InitStruct.Trigger = EXTI_TRIGGER_FALLING;
EXTI_InitStruct.Pull = EXTI_PULLUP;
HAL_EXTI_SetConfigLine(&EXTI_InitStruct, EXTI_CONFIG_PORT_A);
// 配置中断优先级
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
HAL_NVIC_Init(&NVIC_InitStruct);
```
以上配置将PA0引脚配置为输入模式,并且使用上拉电阻使其默认为高电平。然后配置外部中断触发条件为下降沿触发,并且使能该中断的优先级。
接下来是中断处理函数的实现:
```c
void EXTI0_IRQHandler(void)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // 切换LED灯的状态
HAL_Delay(100); // 延时一段时间,消除按键抖动
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); // 清除中断标志
}
```
中断处理函数中,首先使用`HAL_GPIO_TogglePin()`函数切换LED灯的状态,然后使用`HAL_Delay()`函数延时一段时间,消除按键的抖动。最后使用`HAL_GPIO_EXTI_IRQHandler()`函数清除中断标志位。
最后,在`main()`函数中使用以下代码启动程序:
```c
int main(void)
{
HAL_Init();
SystemClock_Config();
GPIO_Init();
while (1)
{
}
}
```
`GPIO_Init()`函数中可以初始化LED灯的输出口:
```c
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 使能GPIO时钟
__HAL_RCC_GPIOC_CLK_ENABLE();
// 配置LED引脚为输出
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// 初始状态关闭LED灯
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
```
以上就是按键控制LED灯亮灭的简单例程。当按下按键时,LED灯会切换亮灭状态。
按键PA5外部中断控制LED灯PA5的亮灭,LED是低电平点亮方式
首先需要配置PA5引脚为输入模式,并开启外部中断。然后在中断处理函数中控制PA5引脚输出低电平即可点亮LED灯。
以下是示例代码:
```c
#include "stm32f10x.h"
void EXTI9_5_IRQHandler(void) // 定义外部中断处理函数
{
if(EXTI_GetITStatus(EXTI_Line5) != RESET) // 判断是否为PA5引脚发生中断
{
GPIO_ResetBits(GPIOA, GPIO_Pin_5); // 控制PA5引脚输出低电平
EXTI_ClearITPendingBit(EXTI_Line5); // 清除中断标志位
}
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 使能AFIO时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // 配置PA5引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 配置为输入模式,并开启上拉
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // 配置PA5引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置输出速度
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 配置为推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA, GPIO_Pin_5); // 初始化PA5引脚输出低电平
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5); // 配置中断线路
EXTI_InitStructure.EXTI_Line = EXTI_Line5; // 配置中断线路为PA5引脚
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 配置为中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 配置下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能中断线路
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; // 配置中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; // 配置抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; // 配置子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能中断通道
NVIC_Init(&NVIC_InitStructure);
while(1)
{
// 主循环中可以添加其他代码
}
}
```
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![pptx](https://img-home.csdnimg.cn/images/20210720083543.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)