奇数次按下SW1,LED1和LED2亮偶数次按下SW1,LED3和LED4闪烁重复23步*/ 1.使用子程序--子程序1(LED1,2常亮);子程序2(led3,4闪烁) 2.按键中断标志位与按键按下标志位共同判断按键按下的次数(改变按键按下标志位的数值)
时间: 2024-02-25 21:57:06 浏览: 106
好的,以下是基于STM32的代码实现,功能是在奇数次按下SW1时点亮LED1和LED2,偶数次按下SW1时LED3和LED4闪烁,循环23次:
```c
#include "stm32f10x.h"
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
int count = 0;
uint8_t button_pressed = 0;
uint8_t button_interrupt_flag = 0;
// 配置LED1和LED2的GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置LED3和LED4的GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 配置按键的GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// 配置按键的中断线路
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);
EXTI_InitStruct.EXTI_Line = EXTI_Line13;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
// 配置按键的中断向量
NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
while (count < 23) {
if (button_interrupt_flag) {
button_interrupt_flag = 0;
button_pressed = 1 - button_pressed; // 切换按键状态
}
if (button_pressed) { // 奇数次按下SW1
GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1); // LED1和LED2点亮
GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1); // LED3和LED4熄灭
} else { // 偶数次按下SW1
GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1); // LED1和LED2熄灭
GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1); // LED3和LED4闪烁
for (int i=0; i<1000000; i++) {
if (button_interrupt_flag) {
button_interrupt_flag = 0;
button_pressed = 1 - button_pressed; // 切换按键状态
break;
}
GPIO_ToggleBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1); // LED3和LED4翻转
for (int j=0; j<10000; j++);
}
}
}
while (1);
}
void EXTI15_10_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line13) != RESET) {
EXTI_ClearITPendingBit(EXTI_Line13);
button_interrupt_flag = 1;
}
}
```
在这个代码中,我们通过STM32的GPIO和EXTI模块来实现LED和按键的控制。其中,LED1和LED2的GPIO是PA0和PA1,LED3和LED4的GPIO是PB0和PB1,按键的GPIO是PC13。在主循环中,我们使用一个计数器来循环23次,在每次循环中根据按键状态来控制LED的状态,同时在偶数次按下SW1时使用延时函数来实现LED3和LED4的闪烁。在中断函数中,我们通过判断中断是否来自按键的方式来改变按键的状态。
阅读全文