stm32通过中断方式用两个按键分别控制流水灯方向和亮灭
的程序实现如下:
首先,需要初始化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
}
}
}
``
原文地址: http://www.cveoy.top/t/topic/eMm7 著作权归作者所有。请勿转载和采集!