hc32l13x ch455h 4x5矩阵键盘实现示例
时间: 2023-07-07 09:08:21 浏览: 105
以HC32L13X为例,实现基于CH455H的4x5矩阵键盘的示例代码如下:
```c
#include "HC32L13x.h"
#include "hc32l13x_gpio.h"
#include "hc32l13x_clk.h"
#define KEY_PORT GpioPortA
#define KEY_PIN1 GpioPin0
#define KEY_PIN2 GpioPin1
#define KEY_PIN3 GpioPin2
#define KEY_PIN4 GpioPin3
#define KEY_PIN5 GpioPin4
#define KEY_PIN6 GpioPin5
#define KEY_PIN7 GpioPin6
#define KEY_PIN8 GpioPin7
#define KEY_PIN9 GpioPin8
#define KEY_PIN10 GpioPin9
void GPIO_Config(void)
{
stc_gpio_cfg_t stcGpioCfg;
DDL_ZERO_STRUCT(stcGpioCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
Gpio_StructInit(&stcGpioCfg);
stcGpioCfg.enDir = GpioDirIn;
stcGpioCfg.enDrv = GpioDrvH;
stcGpioCfg.enPu = GpioPuEnable;
Gpio_Init(KEY_PORT, KEY_PIN1, &stcGpioCfg);
Gpio_Init(KEY_PORT, KEY_PIN2, &stcGpioCfg);
Gpio_Init(KEY_PORT, KEY_PIN3, &stcGpioCfg);
Gpio_Init(KEY_PORT, KEY_PIN4, &stcGpioCfg);
Gpio_Init(KEY_PORT, KEY_PIN5, &stcGpioCfg);
Gpio_Init(KEY_PORT, KEY_PIN6, &stcGpioCfg);
Gpio_Init(KEY_PORT, KEY_PIN7, &stcGpioCfg);
Gpio_Init(KEY_PORT, KEY_PIN8, &stcGpioCfg);
Gpio_Init(KEY_PORT, KEY_PIN9, &stcGpioCfg);
Gpio_Init(KEY_PORT, KEY_PIN10, &stcGpioCfg);
}
uint32_t KEY_Scan(void)
{
uint32_t u32Ret = 0;
uint8_t i;
/* 配置为输出模式,拉高 */
for (i = 0; i < 5; i++)
{
Gpio_SetIO(KEY_PORT, (KEY_PIN6 << i));
}
/* 配置为输入模式,检测按键状态 */
for (i = 0; i < 4; i++)
{
Gpio_SetIO(KEY_PORT, (KEY_PIN1 << i));
if (!Gpio_GetIO(KEY_PORT, KEY_PIN5))
{
u32Ret = (1 << (i * 3));
break;
}
if (!Gpio_GetIO(KEY_PORT, KEY_PIN6))
{
u32Ret = (2 << (i * 3));
break;
}
if (!Gpio_GetIO(KEY_PORT, KEY_PIN7))
{
u32Ret = (3 << (i * 3));
break;
}
Gpio_ClrIO(KEY_PORT, (KEY_PIN1 << i));
}
/* 配置为输出模式,拉高 */
for (i = 0; i < 5; i++)
{
Gpio_SetIO(KEY_PORT, (KEY_PIN6 << i));
}
/* 配置为输入模式,检测按键状态 */
for (i = 0; i < 4; i++)
{
Gpio_SetIO(KEY_PORT, (KEY_PIN1 << i));
if (!Gpio_GetIO(KEY_PORT, KEY_PIN8))
{
u32Ret |= (1 << (i * 3 + 1));
break;
}
if (!Gpio_GetIO(KEY_PORT, KEY_PIN9))
{
u32Ret |= (2 << (i * 3 + 1));
break;
}
if (!Gpio_GetIO(KEY_PORT, KEY_PIN10))
{
u32Ret |= (3 << (i * 3 + 1));
break;
}
Gpio_ClrIO(KEY_PORT, (KEY_PIN1 << i));
}
return u32Ret;
}
int main(void)
{
GPIO_Config();
while (1)
{
uint32_t u32Key = KEY_Scan();
if (u32Key != 0)
{
/* 按键处理 */
}
}
}
```
以上代码中,GPIO_Config函数用于配置GPIO,包括设置输入/输出模式、上拉等;KEY_Scan函数用于检测按键状态,通过对不同的GPIO进行配置和检测,实现4x5矩阵键盘的按键扫描。在主函数中,通过循环调用KEY_Scan函数,实现实时检测按键状态并进行相应处理。
阅读全文