hc32l13x实现4x5矩阵键盘,一个ch455实现按键灯光,具体实现代码
时间: 2023-12-21 15:03:48 浏览: 92
以下是一个简单的示例代码,实现了HC32L13X芯片控制4x5矩阵键盘和CH455芯片控制按键灯光。具体实现过程中,需要根据自己电路连接情况和具体需求进行相应的修改。
```c
#include "hc32l13x.h"
#define KEY_PORT GpioPortD
#define KEY_COL1_PIN GpioPin10
#define KEY_COL2_PIN GpioPin11
#define KEY_COL3_PIN GpioPin12
#define KEY_COL4_PIN GpioPin13
#define KEY_ROW1_PIN GpioPin6
#define KEY_ROW2_PIN GpioPin7
#define KEY_ROW3_PIN GpioPin8
#define KEY_ROW4_PIN GpioPin9
#define KEY_ROW5_PIN GpioPin14
#define LED_PORT GpioPortA
#define LED_PIN GpioPin0
void KEY_Init(void)
{
/* 使能GPIO外设时钟 */
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
/* 配置按键列为输出模式 */
Gpio_Init(KEY_PORT, KEY_COL1_PIN, GpioDirOut);
Gpio_Init(KEY_PORT, KEY_COL2_PIN, GpioDirOut);
Gpio_Init(KEY_PORT, KEY_COL3_PIN, GpioDirOut);
Gpio_Init(KEY_PORT, KEY_COL4_PIN, GpioDirOut);
/* 配置按键行为输入模式 */
Gpio_Init(KEY_PORT, KEY_ROW1_PIN, GpioDirIn);
Gpio_Init(KEY_PORT, KEY_ROW2_PIN, GpioDirIn);
Gpio_Init(KEY_PORT, KEY_ROW3_PIN, GpioDirIn);
Gpio_Init(KEY_PORT, KEY_ROW4_PIN, GpioDirIn);
Gpio_Init(KEY_PORT, KEY_ROW5_PIN, GpioDirIn);
/* 将按键列设置为高电平 */
Gpio_SetIO(KEY_PORT, KEY_COL1_PIN);
Gpio_SetIO(KEY_PORT, KEY_COL2_PIN);
Gpio_SetIO(KEY_PORT, KEY_COL3_PIN);
Gpio_SetIO(KEY_PORT, KEY_COL4_PIN);
}
uint8_t KEY_Scan(void)
{
uint8_t key_val = 0;
/* 扫描按键 */
Gpio_ClrIO(KEY_PORT, KEY_COL1_PIN);
if (Gpio_GetIO(KEY_PORT, KEY_ROW1_PIN) == FALSE) key_val = 1;
if (Gpio_GetIO(KEY_PORT, KEY_ROW2_PIN) == FALSE) key_val = 5;
if (Gpio_GetIO(KEY_PORT, KEY_ROW3_PIN) == FALSE) key_val = 9;
if (Gpio_GetIO(KEY_PORT, KEY_ROW4_PIN) == FALSE) key_val = 13;
if (Gpio_GetIO(KEY_PORT, KEY_ROW5_PIN) == FALSE) key_val = 17;
Gpio_SetIO(KEY_PORT, KEY_COL1_PIN);
Gpio_ClrIO(KEY_PORT, KEY_COL2_PIN);
if (Gpio_GetIO(KEY_PORT, KEY_ROW1_PIN) == FALSE) key_val = 2;
if (Gpio_GetIO(KEY_PORT, KEY_ROW2_PIN) == FALSE) key_val = 6;
if (Gpio_GetIO(KEY_PORT, KEY_ROW3_PIN) == FALSE) key_val = 10;
if (Gpio_GetIO(KEY_PORT, KEY_ROW4_PIN) == FALSE) key_val = 14;
if (Gpio_GetIO(KEY_PORT, KEY_ROW5_PIN) == FALSE) key_val = 18;
Gpio_SetIO(KEY_PORT, KEY_COL2_PIN);
Gpio_ClrIO(KEY_PORT, KEY_COL3_PIN);
if (Gpio_GetIO(KEY_PORT, KEY_ROW1_PIN) == FALSE) key_val = 3;
if (Gpio_GetIO(KEY_PORT, KEY_ROW2_PIN) == FALSE) key_val = 7;
if (Gpio_GetIO(KEY_PORT, KEY_ROW3_PIN) == FALSE) key_val = 11;
if (Gpio_GetIO(KEY_PORT, KEY_ROW4_PIN) == FALSE) key_val = 15;
if (Gpio_GetIO(KEY_PORT, KEY_ROW5_PIN) == FALSE) key_val = 19;
Gpio_SetIO(KEY_PORT, KEY_COL3_PIN);
Gpio_ClrIO(KEY_PORT, KEY_COL4_PIN);
if (Gpio_GetIO(KEY_PORT, KEY_ROW1_PIN) == FALSE) key_val = 4;
if (Gpio_GetIO(KEY_PORT, KEY_ROW2_PIN) == FALSE) key_val = 8;
if (Gpio_GetIO(KEY_PORT, KEY_ROW3_PIN) == FALSE) key_val = 12;
if (Gpio_GetIO(KEY_PORT, KEY_ROW4_PIN) == FALSE) key_val = 16;
if (Gpio_GetIO(KEY_PORT, KEY_ROW5_PIN) == FALSE) key_val = 20;
Gpio_SetIO(KEY_PORT, KEY_COL4_PIN);
return key_val;
}
void LED_Init(void)
{
/* 使能GPIO外设时钟 */
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
/* 配置LED引脚为输出模式 */
Gpio_Init(LED_PORT, LED_PIN, GpioDirOut);
/* 将LED引脚设置为低电平,灭灯状态 */
Gpio_ClrIO(LED_PORT, LED_PIN);
}
void LED_On(void)
{
/* 将LED引脚设置为高电平,点亮LED */
Gpio_SetIO(LED_PORT, LED_PIN);
}
void LED_Off(void)
{
/* 将LED引脚设置为低电平,灭灯 */
Gpio_ClrIO(LED_PORT, LED_PIN);
}
int main(void)
{
KEY_Init();
LED_Init();
while (1)
{
uint8_t key_val = KEY_Scan();
/* 检测到按键按下,点亮LED */
if (key_val)
{
LED_On();
}
else
{
LED_Off();
}
}
}
```
在以上示例代码中,KEY_Init函数用于初始化按键GPIO引脚的方向和电平状态,KEY_Scan函数用于扫描按键状态并返回对应按键的编号,LED_Init函数用于初始化LED引脚的方向和电平状态,LED_On和LED_Off函数用于控制LED的点亮和熄灭。在主函数中,通过不断扫描按键状态,并根据检测到的按键编号控制LED的状态。
阅读全文