HC32L136 4x5矩阵键盘实现
时间: 2024-04-30 21:21:05 浏览: 18
HC32L136是一款基于ARM Cortex-M3内核的微控制器,用于实现4x5矩阵键盘需要以下步骤:
1. 硬件连线:将4x5矩阵键盘的行线(ROW0-ROW3)连接到HC32L136的GPIO引脚上,并将列线(COL0-COL4)连接到外部中断输入引脚上。
2. 初始化GPIO:通过设置GPIO的模式和输出状态来初始化行线的GPIO引脚。
3. 初始化外部中断:通过设置外部中断的触发条件和回调函数来初始化列线的外部中断输入引脚。
4. 循环读取键值:在主程序循环中,轮询读取矩阵键盘是否有按键按下,并根据按下的键值进行相应的处理。
下面是一个简单的示例代码,仅供参考:
```c
#include "hc32l136.h"
#define ROW0_GPIO_PORT GpioPortB
#define ROW0_GPIO_PIN GpioPin3
#define ROW1_GPIO_PORT GpioPortB
#define ROW1_GPIO_PIN GpioPin4
#define ROW2_GPIO_PORT GpioPortB
#define ROW2_GPIO_PIN GpioPin5
#define ROW3_GPIO_PORT GpioPortB
#define ROW3_GPIO_PIN GpioPin6
#define COL0_INT_PORT GpioPortA
#define COL0_INT_PIN GpioPin2
#define COL1_INT_PORT GpioPortA
#define COL1_INT_PIN GpioPin3
#define COL2_INT_PORT GpioPortA
#define COL2_INT_PIN GpioPin4
#define COL3_INT_PORT GpioPortA
#define COL3_INT_PIN GpioPin5
#define COL4_INT_PORT GpioPortA
#define COL4_INT_PIN GpioPin6
void ROW_Init(void)
{
Gpio_InitIO(ROW0_GPIO_PORT, ROW0_GPIO_PIN, GpioDirOut);
Gpio_InitIO(ROW1_GPIO_PORT, ROW1_GPIO_PIN, GpioDirOut);
Gpio_InitIO(ROW2_GPIO_PORT, ROW2_GPIO_PIN, GpioDirOut);
Gpio_InitIO(ROW3_GPIO_PORT, ROW3_GPIO_PIN, GpioDirOut);
Gpio_SetIO(ROW0_GPIO_PORT, ROW0_GPIO_PIN, GpioPinSet);
Gpio_SetIO(ROW1_GPIO_PORT, ROW1_GPIO_PIN, GpioPinSet);
Gpio_SetIO(ROW2_GPIO_PORT, ROW2_GPIO_PIN, GpioPinSet);
Gpio_SetIO(ROW3_GPIO_PORT, ROW3_GPIO_PIN, GpioPinSet);
}
void COL_Init(void)
{
Gpio_InitIO(COL0_INT_PORT, COL0_INT_PIN, GpioDirIn);
Gpio_EnableFuncReg(COL0_INT_PORT, COL0_INT_PIN, GpioAf2);
Gpio_SetAfMode(COL0_INT_PORT, COL0_INT_PIN, GpioAfMode1);
Gpio_InitIO(COL1_INT_PORT, COL1_INT_PIN, GpioDirIn);
Gpio_EnableFuncReg(COL1_INT_PORT, COL1_INT_PIN, GpioAf2);
Gpio_SetAfMode(COL1_INT_PORT, COL1_INT_PIN, GpioAfMode1);
Gpio_InitIO(COL2_INT_PORT, COL2_INT_PIN, GpioDirIn);
Gpio_EnableFuncReg(COL2_INT_PORT, COL2_INT_PIN, GpioAf2);
Gpio_SetAfMode(COL2_INT_PORT, COL2_INT_PIN, GpioAfMode1);
Gpio_InitIO(COL3_INT_PORT, COL3_INT_PIN, GpioDirIn);
Gpio_EnableFuncReg(COL3_INT_PORT, COL3_INT_PIN, GpioAf2);
Gpio_SetAfMode(COL3_INT_PORT, COL3_INT_PIN, GpioAfMode1);
Gpio_InitIO(COL4_INT_PORT, COL4_INT_PIN, GpioDirIn);
Gpio_EnableFuncReg(COL4_INT_PORT, COL4_INT_PIN, GpioAf2);
Gpio_SetAfMode(COL4_INT_PORT, COL4_INT_PIN, GpioAfMode1);
Exti_Init();
Exti_ConfigIrq(COL0_INT_PORT, COL0_INT_PIN, ExtiFallingEdge, ExtiFilterEnable);
Exti_ConfigIrq(COL1_INT_PORT, COL1_INT_PIN, ExtiFallingEdge, ExtiFilterEnable);
Exti_ConfigIrq(COL2_INT_PORT, COL2_INT_PIN, ExtiFallingEdge, ExtiFilterEnable);
Exti_ConfigIrq(COL3_INT_PORT, COL3_INT_PIN, ExtiFallingEdge, ExtiFilterEnable);
Exti_ConfigIrq(COL4_INT_PORT, COL4_INT_PIN, ExtiFallingEdge, ExtiFilterEnable);
NVIC_ClearPendingIRQ(EXTI0_1_IRQn);
NVIC_EnableIRQ(EXTI0_1_IRQn);
}
void EXTI0_1_IRQHandler(void)
{
uint8_t key_value;
if (Exti_GetPendingStatus(COL0_INT_PORT, COL0_INT_PIN) == Set)
{
key_value = 0;
Exti_ClearPendingStatus(COL0_INT_PORT, COL0_INT_PIN);
}
else if (Exti_GetPendingStatus(COL1_INT_PORT, COL1_INT_PIN) == Set)
{
key_value = 1;
Exti_ClearPendingStatus(COL1_INT_PORT, COL1_INT_PIN);
}
else if (Exti_GetPendingStatus(COL2_INT_PORT, COL2_INT_PIN) == Set)
{
key_value = 2;
Exti_ClearPendingStatus(COL2_INT_PORT, COL2_INT_PIN);
}
else if (Exti_GetPendingStatus(COL3_INT_PORT, COL3_INT_PIN) == Set)
{
key_value = 3;
Exti_ClearPendingStatus(COL3_INT_PORT, COL3_INT_PIN);
}
else if (Exti_GetPendingStatus(COL4_INT_PORT, COL4_INT_PIN) == Set)
{
key_value = 4;
Exti_ClearPendingStatus(COL4_INT_PORT, COL4_INT_PIN);
}
else
{
return;
}
// TODO: 根据key_value进行相应的处理
}
int main(void)
{
ROW_Init();
COL_Init();
while (1)
{
// TODO: 轮询读取键值
}
}
```