按键中断控制按键的使能来实现灯的状态改变

										**按键中断控制按键实现灯的状态改变**
备注:此处我们将利用SW1(P0-4)来控制led1(P1-0),led2(P1-1),led3(P1-4)的状态改变,利用SW2(P0-5)以按键中断的方式来控制SW1的控制能力的使能。

一.对开关和灯初始化:
1.对灯的初始化
void led(void)
{
P1SEL&=~0X13;//设置为通用io端口
P1DIR|=0X13;//设置为输出模式
P1INP&=~0X03;//设置三灯端口为上拉或下拉
P2INP&=~0X40;//设置led1与led2的端口为上拉
P2INP|=0X40;设置led3的端口为下拉
led1=0;
led2=0;
led3=1;//将三灯的初始状态都设置为亮
}

2.对按键进行初始化
void key(void)
{
P0SEL&=~0X30;//设置二开关的端口为通用io口
P0DIR&=~0X30;//设置二开关的端口为输入端
P0INP&=~0X30;//设置二开关的端口的输入模式为上拉或下拉
P2INP&=~0X20;//社会二开关的端口的输入模式为上拉
}

3.中断服务函数初始化
void key_vector (void)
{
INE1|=0X20;//P0端口中断使能
PICTL|=0X01;//中断触发方式为下降沿触发
P0IEN|=0X20;//P0_5号端口中断使能
EA&#

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现外部中断按键控制LED,需要以下步骤: 1. 首先需要初始化LED按键的GPIO口,设置为输出和输入模式。 2. 然后需要初始化外部中断,配置中断触发方式和优先级。 3. 在中断处理函数中,判断是哪个按键触发了中断,并根据需要改变LED状态。 下面是一个简单的代码示例,假设按键连接在PC13口,LED连接在PA5口,中断使用EXTI15_10_IRQn: ``` #include "stm32f10x.h" void EXTI15_10_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line13) != RESET) { // 判断是否是PC13口触发的中断 GPIO_WriteBit(GPIOA, GPIO_Pin_5, !GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5)); // 反转LED状态 EXTI_ClearITPendingBit(EXTI_Line13); // 清除中断标志位 } } void init_gpio() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); } void init_exti() { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13); EXTI_InitStructure.EXTI_Line = EXTI_Line13; 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 = EXTI15_10_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } int main(void) { init_gpio(); init_exti(); while (1) { // do something } } ``` 在这个示例中,按下PC13口的按键会触发中断中断处理函数会将PA5口的LED状态取反。需要注意的是,在中断处理函数中修改GPIO口的状态时,需要使用特定的函数(如GPIO_WriteBit)来保证操作的原子性,避免出现竞争条件。另外,在中断处理函数中需要及时清除中断标志位,否则会一直触发中断

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值