keil5实现K1K2两个按键控制小灯
时间: 2024-10-19 17:17:55 浏览: 51
要在Keil5中使用K1和K2两个按键控制一个小灯,首先需要完成以下几个步骤:
1. **硬件连接**:
- 连接两个按键到STM32的输入引脚,比如K1连接到PB0,K2连接到PB1。确保它们都设置为下拉输入模式,这样默认状态下灯泡不会亮。
- 确保一个小灯连接到一个输出引脚,如LED1连接到PA8。
2. **GPIO初始化**:
- 使用之前提到的GPIO_Init函数,初始化这两个按键以及LED的GPIO。
```c
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; // K1 和 K2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 输入上拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; // LED1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP; // 输出推挽
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
```
3. **按键中断配置**:
- 设置按键上升沿触发中断,并开启对应中断:
```c
EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1; // K1 和 K2
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_IntCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_EnableIRQ(EXTI0_IRQn);
```
4. **中断服务函数**:
- 编写中断服务函数,检查每个按键的状态,并根据状态切换LED的点亮状态:
```c
static bool k1Pressed = false, k2Pressed = false;
volatile uint8_t ledState = 0; // LED状态变量
void EXTI0_IRQHandler(void) {
if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
k1Pressed = true;
EXTI_ClearITPendingBit(EXTI_Line0);
if (!k2Pressed) {
ledState ^= 1 << 3; // K1按下,切换LED1
}
}
if (EXTI_GetITStatus(EXTI_Line1) != RESET) {
k2Pressed = true;
EXTI_ClearITPendingBit(EXTI_Line1);
if (!k1Pressed) {
ledState ^= 1; // K2按下,点亮LED1
}
}
}
void toggleLED(void) {
GPIO_SetBits(GPIOA, ledState);
}
```
5. **主程序循环**:
- 在主循环中定期轮询或响应按键事件改变LED状态。
```c
int main(void) {
... // 初始化其他模块后
while (1) {
if (k1Pressed) {
k1Pressed = false; // 释放按键后恢复中断
toggleLED();
}
// 同理处理K2按键事件
}
}
```
阅读全文