gd32F450Z配置3*3按键矩阵外部中断的代码
时间: 2024-02-24 10:56:08 浏览: 30
好的,以下是gd32F450Z配置3*3按键矩阵外部中断的代码:
假设我们使用PA0、PA1、PA2、PA3、PA4、PA5、PA6、PA7、PB0这九个引脚作为3*3矩阵按键的输入引脚,PA8作为中断引脚。
首先,我们需要初始化这些引脚的GPIO和中断控制器:
```c
void gpio_init(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_AF);
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
gpio_pin_remap_config(GPIO_SWJ_JTAGDISABLE_REMAP, ENABLE);
gpio_init(GPIOA, GPIO_MODE_IPD, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
}
void exti_init(void)
{
nvic_irq_enable(EXTI4_15_IRQn, 0, 0);
nvic_irq_enable(EXTI9_5_IRQn, 0, 0);
gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_8);
exti_init(EXTI_8, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
exti_interrupt_flag_clear(EXTI_8);
exti_init(EXTI_4, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
exti_interrupt_flag_clear(EXTI_4);
}
```
接着,我们需要编写中断服务程序,检测按键的状态并执行相应的操作:
```c
void EXTI4_15_IRQHandler(void)
{
if (exti_interrupt_flag_get(EXTI_4)) {
exti_interrupt_flag_clear(EXTI_4);
check_key();
}
}
void EXTI9_5_IRQHandler(void)
{
if (exti_interrupt_flag_get(EXTI_8)) {
exti_interrupt_flag_clear(EXTI_8);
check_key();
}
}
void check_key(void)
{
uint16_t key_val = 0;
key_val = gpio_input_bit_get(GPIOA, GPIO_PIN_0) << 0 |
gpio_input_bit_get(GPIOA, GPIO_PIN_1) << 1 |
gpio_input_bit_get(GPIOA, GPIO_PIN_2) << 2 |
gpio_input_bit_get(GPIOA, GPIO_PIN_3) << 3 |
gpio_input_bit_get(GPIOA, GPIO_PIN_4) << 4 |
gpio_input_bit_get(GPIOA, GPIO_PIN_5) << 5 |
gpio_input_bit_get(GPIOA, GPIO_PIN_6) << 6 |
gpio_input_bit_get(GPIOA, GPIO_PIN_7) << 7 |
gpio_input_bit_get(GPIOB, GPIO_PIN_0) << 8;
switch (key_val) {
case KEY_1:
//TODO: 执行按键1的操作
break;
case KEY_2:
//TODO: 执行按键2的操作
break;
case KEY_3:
//TODO: 执行按键3的操作
break;
case KEY_4:
//TODO: 执行按键4的操作
break;
case KEY_5:
//TODO: 执行按键5的操作
break;
case KEY_6:
//TODO: 执行按键6的操作
break;
case KEY_7:
//TODO: 执行按键7的操作
break;
case KEY_8:
//TODO: 执行按键8的操作
break;
case KEY_9:
//TODO: 执行按键9的操作
break;
default:
break;
}
}
```
其中,`KEY_1`至`KEY_9`是用来表示每个按键的状态,我们需要根据实际情况进行定义。在`check_key()`函数中,我们通过读取每个引脚的输入状态,计算出当前按键的状态,并根据状态执行相应的操作。
最后,在主函数中调用`gpio_init()`和`exti_init()`函数进行初始化即可。
```c
int main(void)
{
gpio_init();
exti_init();
while (1) {
//TODO: 主函数中的其他操作
}
}
```
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)