STM32外部中断完成两个按键控制共阴共阳数码管加减的完整代码
时间: 2024-11-13 14:24:29 浏览: 35
STM32外部中断用于键盘输入控制数码管加减的操作需要几个步骤,包括设置中断、配置IO口、处理中断以及驱动数码管。这里是一个简化版的示例代码,假设你有两颗按键A和B对应于数码管的加和减操作,并且已经连接了共阴极数码管。
```c
#include "stm32f10x.h"
#include "GPIO.h"
#include "delay.h"
// 定义按键和数码管的相关变量
#define KEY_A PA_Pin_0 // 按键A
#define KEY_B PB_Pin_0 // 按键B
#define LCD_D4 PC_Pin_0 // 数码管D4
#define LCD_D5 PC_Pin_1 // 数码管D5 ... 等待其他位
static volatile uint8_t keypad_state = 0; // 键盘状态
void EXTI_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = KEY_A | KEY_B;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 输入浮空
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = LCD_D4 | LCD_D5; // 数码管输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
EXTI_InitStructure.EXTI_Line = KEY_A_EXTI_LINE | KEY_B_EXTI_LINE; // 设置中断线
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 异步中断
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 开启中断
EXTI_Init(&EXTI_InitStructure);
}
void EXTI_IRQHandler(void) {
if (EXTI_GetITStatus(KEY_A_EXTI_LINE) != RESET) {
EXTI_ClearITPendingBit(KEY_A_EXTI_LINE); // 清除中断标志
if (keypad_state == 0) { // 如果按A键
keypad_state = 1; // 转换状态
// 控制数码管加法操作...
}
} else if (EXTI_GetITStatus(KEY_B_EXTI_LINE) != RESET) {
EXTI_ClearITPendingBit(KEY_B_EXTI_LINE);
if (keypad_state == 1) { // 如果按B键
keypad_state = 0; // 转换状态
// 控制数码管减法操作...
}
}
}
void Display_LCD(uint8_t digit) {
GPIO_ResetBits(GPIOC, LCD_D4 | LCD_D5); // 清零显示
switch(digit) {
case '0': LCD_D4 = SET; break;
case '1': LCD_D4 = SET; LCD_D5 = SET; break;
... // 其他数字对应相应的LCD位
}
GPIO_SetBits(GPIOC, LCD_D4 | LCD_D5); // 显示数字
}
int main(void) {
EXTI_Init();
NVIC_EnableIRQ(EXTI_IRQn); // 启动中断服务请求
while (1) {
if (keypad_state) {
// 当状态为1时(比如代表加法),执行相应操作并更新数码管...
} else {
// 当状态为0时(比如代表减法),执行相应操作并更新数码管...
}
}
return 0;
}
```
阅读全文