的程序实现如下:

首先,需要初始化GPIO口和NVIC中断向量表。

void GPIO_init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; // PA0和PA1
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 输入模式
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 上拉电阻
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void NVIC_init(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_1_IRQn; // EXTI0和EXTI1共用一个中断通道
    NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

然后,设置EXTI中断线和中断触发方式。

void EXTI_init(void)
{
    EXTI_InitTypeDef EXTI_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

    EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1; // EXTI0和EXTI1
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource1);
}

接下来,编写中断服务函数,根据按键状态控制流水灯方向和亮灭。

void EXTI0_1_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line0) != RESET) // PA0按键触发
    {
        EXTI_ClearITPendingBit(EXTI_Line0);

        if (direction == 1) // 正向
        {
            direction = 0; // 反向
        }
        else
        {
            direction = 1; // 正向
        }
    }

    if (EXTI_GetITStatus(EXTI_Line1) != RESET) // PA1按键触发
    {
        EXTI_ClearITPendingBit(EXTI_Line1);

        if (led_on == 1) // 亮灯
        {
            led_on = 0; // 灭灯
        }
        else
        {
            led_on = 1; // 亮灯
        }
    }
}

最后,编写主函数,控制流水灯的亮灭和方向。

int main(void)
{
    GPIO_init();
    NVIC_init();
    EXTI_init();

    while (1)
    {
        if (direction == 1) // 正向
        {
            GPIO_SetBits(GPIOC, GPIO_Pin_0 << led_index); // 点亮当前LED
            delay_ms(500); // 延时500ms
            GPIO_ResetBits(GPIOC, GPIO_Pin_0 << led_index); // 熄灭当前LED
            led_index = (led_index + 1) % 8; // 循环移位
        }
        else // 反向
        {
            GPIO_SetBits(GPIOC, GPIO_Pin_0 << (7 - led_index)); // 点亮当前LED
            delay_ms(500); // 延时500ms
            GPIO_ResetBits(GPIOC, GPIO_Pin_0 << (7 - led_index)); // 熄灭当前LED
            led_index = (led_index + 7) % 8; // 循环移位
        }

        if (led_on == 0) // 灭灯
        {
            GPIO_ResetBits(GPIOC, GPIO_Pin_All); // 熄灭所有LED
        }
    }
}
``
stm32通过中断方式用两个按键分别控制流水灯方向和亮灭

原文地址: http://www.cveoy.top/t/topic/eMm7 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录