中断-按键控制LED灯

三个按键分别控制三个LED灯

完整项目请去我的资源下载页 xjp的资源
初始化函数:
/*
 * init.c: 进行一些初始化
 */ 

#include "s3c24xx.h"

/*
 * LED1,LED2,LED4对应GPF4、GPF5、GPF6
 */
#define	GPF4_out	(1<<(4*2))			//定义为01 输出
#define	GPF5_out	(1<<(5*2))
#define	GPF6_out	(1<<(6*2))

#define	GPF4_msk	(3<<(4*2))			//定义为11
#define	GPF5_msk	(3<<(5*2))
#define	GPF6_msk	(3<<(6*2))

/*
 * S2,S3,S4对应GPF0、GPF2、GPG3
 				EINT0    EINT2	EINT11
 */
#define GPF0_eint     (0x2<<(0*2))		//10
#define GPF2_eint     (0x2<<(2*2))
#define GPG3_eint     (0x2<<(3*2))		//3*2:    2 代表一个节点站两位

#define GPF0_msk    (3<<(0*2))		//11
#define GPF2_msk    (3<<(2*2))
#define GPG3_msk    (3<<(3*2))

/*
 * 关闭WATCHDOG,否则CPU会不断重启
 *操作WTCON寄存器
 */
void disable_watch_dog(void)
{
   WTCON = 0;  // 关闭WATCHDOG很简单,往这个寄存器写0即可
}

void init_led(void)
{
    // LED1,LED2,LED4对应的3根引脚设为输出
   GPFCON &= ~(GPF0_msk|GPF2_msk|GPG3_msk);//先清零
   GPFCON |=(GPF4_out|GPF5_out|GPF6_out);//后置位
}

/*
 * 初始化GPIO引脚为外部中断
 * GPIO引脚用作外部中断时,默认为低电平触发、IRQ方式(不用设置INTMOD)
 */ 
void init_irq( )
{
    // S2,S3对应的2根引脚设为中断引脚 EINT0,ENT2
 	GPFCON &= ~(GPF0_msk|GPF2_msk);//
 	GPFCON |=    (GPF0_eint|GPF2_eint);
	

    // S4对应的引脚设为中断引脚EINT11
       GPGCON &= ~GPG3_msk;
	GPGCON |=	GPG3_eint;
    
    // 对于EINT11,需要在EINTMASK寄存器中使能它
    	EINTMASK &= ~(1<<11);//【11】位清零
	EINTMASK |=    (0<<11);//【11】位写零
	
	//EINTMASK[11]中写零,等价于
	//EINTMASK &= ~(1<<11);
        
    /*
     * 设定优先级:
     * ARB_SEL0 = 00b, ARB_MODE0 = 0: REQ1 > REQ3,即EINT0 > EINT2
     * 仲裁器1、6无需设置
     * 最终:
     * EINT0 > EINT2 > EINT11即K2 > K3 > K4
     * 在PRIORITY中设置
     */


     //PRIORITY 复位值为0x7f          0111 1111      
     // ARB_SEL0 = 00b,[8:7]=00      ARB_MODE0 = 0  [0]=0
    PRIORITY &= ~((3<<7)|(1<<0));

    

    // EINT0、EINT2、EINT8_23使能,在INTMSK中设置
     INTMSK   &= (~(1<<0)) & (~(1<<2)) & (~(1<<5));
}



中断函数
#include "s3c24xx.h"

void EINT_Handle()
{
    unsigned long oft = INTOFFSET;//读取中断偏移量
    unsigned long val;
    
    switch( oft )
    {
        // S2被按下,LED1点亮,再次按下,LED1熄灭
          case 0: //EINT0
        {   
            GPFDAT |= (0x7<<4);   // 所有LED熄灭
            GPFDAT &= ~(1<<4);      // LED1点亮
            break;
        }
        // S3被按下,LED2点亮,再次按下,LED2熄灭
         case 2://EINT2
        {   
            GPFDAT |= (0x7<<4);   // 所有LED熄灭
            GPFDAT &= ~(1<<5);      // LED2点亮
            break;
        }
        // K4被按下,LED3点亮,再次按下,LED3熄灭
          case 5://EINT11
        {   
            GPFDAT |= (0x7<<4);   // 所有LED熄灭
            GPFDAT &= ~(1<<6);      // LED4点亮                
            break;
        }

        default:
            break;
    }

    //清中断
    if( oft == 5 ) 
        EINTPEND = (1<<11);   // EINT8_23合用IRQ5
    SRCPND = 1<<oft;
    INTPND = 1<<oft;
    
}



  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这是一个很常见的任务,我可以为您提供一些代码示例来实现这个功能。 首先,您需要连接一个按键和一个LED到您的STM32开发板上。假设您将按键连接到引脚PA0,将LED连接到引脚PB0。 接下来,您需要在代码中初始化这些引脚。这可以通过以下方式完成: ```c GPIO_InitTypeDef GPIO_InitStruct; // 初始化PA0引脚为输入模式 GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化PB0引脚为输出模式 GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); ``` 在这个例子中,我们将PA0引脚初始化为输入模式,并启用上拉电阻。这意味着当按键没有按下时,PA0引脚将被拉高。当按键按下时,PA0引脚将会被拉低。我们将PB0引脚初始化为输出模式,这意味着我们可以通过在代码中设置它的状态来控制LED的亮度。 接下来,您需要配置外部中断。外部中断是一种特殊的中断,可以在引脚状态发生变化时触发。在这个例子中,我们将使用外部中断来检测按键是否被按下。这可以通过以下方式完成: ```c EXTI_HandleTypeDef EXTI_InitStruct; // 配置外部中断 EXTI_InitStruct.Pin = GPIO_PIN_0; EXTI_InitStruct.Mode = EXTI_MODE_INTERRUPT; EXTI_InitStruct.Trigger = EXTI_TRIGGER_FALLING; HAL_EXTI_SetConfigLine(&EXTI_InitStruct, EXTI_LINE_0); ``` 在这个例子中,我们将外部中断配置为检测PA0引脚的下降沿。这意味着当按键被按下时,外部中断将会触发。 最后,您需要实现中断处理函数,以便在按键被按下时切换LED的状态。这可以通过以下方式完成: ```c void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == GPIO_PIN_0) { // 切换LED的状态 HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); } } ``` 在这个例子中,我们实现了一个名为`HAL_GPIO_EXTI_Callback`的中断处理函数。当外部中断被触发时,这个函数将被调用。在这个函数中,我们检查触发中断的引脚是否为PA0引脚。如果是,我们将使用`HAL_GPIO_TogglePin`函数来切换LED的状态。 以上就是使用stm32外部中断实现按键控制LED的示例代码。希望这能帮助到您!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值