您可以在按键按下时设置一个标志位,表示蜂鸣器正在鸣叫。然后在下一次按键按下时,检查这个标志位,如果为真,则停止蜂鸣器鸣叫,并清除标志位;如果为假,则开始蜂鸣器鸣叫,并设置标志位。

以下是一个示例代码:

#include "stm32f4xx.h"

#define BEEP_PIN GPIO_Pin_0
#define BEEP_PORT GPIOD

volatile uint8_t beep_flag = 0;

void BEEP_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

    GPIO_InitStructure.GPIO_Pin = BEEP_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(BEEP_PORT, &GPIO_InitStructure);
}

void BEEP_On(void)
{
    GPIO_SetBits(BEEP_PORT, BEEP_PIN);
}

void BEEP_Off(void)
{
    GPIO_ResetBits(BEEP_PORT, BEEP_PIN);
}

void EXTI0_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line0) != RESET)
    {
        EXTI_ClearITPendingBit(EXTI_Line0);

        if (beep_flag)
        {
            BEEP_Off();
            beep_flag = 0;
        }
        else
        {
            BEEP_On();
            beep_flag = 1;
        }
    }
}

int main(void)
{
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    BEEP_Init();

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, EXTI_PinSource0);

    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    while (1)
    {
        // 空闲循环
    }
}
STM32 蜂鸣器按键控制:实现长鸣和停止

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

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