hc32l13x ch455h 4x5矩阵键盘,数码管驱动,按键使用gpio,数码管使用PB12,PB13gpio引脚控制
时间: 2023-07-20 18:08:01 浏览: 115
对于 HC32L13x,你需要使用 GPIO 初始化来控制 PB12 和 PB13 引脚。你可以使用以下代码:
```c
#include "hc32l13x.h"
int main(void) {
// 初始化 PB12 和 PB13 引脚为 GPIO 输出模式
GPIO_SetFunc(GPIO_PORT_B, GPIO_PIN_12, GPIO_FUNC_0_GPIO);
GPIO_SetFunc(GPIO_PORT_B, GPIO_PIN_13, GPIO_FUNC_0_GPIO);
GPIO_SetOutputEnable(GPIO_PORT_B, GPIO_PIN_12, GPIO_OUTPUT_ENABLE);
GPIO_SetOutputEnable(GPIO_PORT_B, GPIO_PIN_13, GPIO_OUTPUT_ENABLE);
// 控制 PB12 和 PB13 引脚
GPIO_WritePin(GPIO_PORT_B, GPIO_PIN_12, 1); // 控制 PB12 引脚输出高电平
GPIO_WritePin(GPIO_PORT_B, GPIO_PIN_13, 0); // 控制 PB13 引脚输出低电平
while (1) {
// 循环执行
}
}
```
至于 4x5 矩阵键盘和数码管驱动的实现,需要根据具体的电路原理图和代码实现来进行。
相关问题
hc32l13x ch455h 4x5矩阵键盘,数码管驱动,按键使用gpio,数码管使用PB12,PB13gpio引脚控制,具体实现代码
以下是使用HC32L13X芯片的CH455H 4x5矩阵键盘和数码管的代码实现:
```c
#include "hc32l13x.h"
#define KEY_PORT GpioPortA
#define KEY_PIN GpioPin0
#define DISP_PORT GpioPortB
#define DISP_PIN1 GpioPin12
#define DISP_PIN2 GpioPin13
#define KEY_ROW1_PORT GpioPortA
#define KEY_ROW1_PIN GpioPin1
#define KEY_ROW2_PORT GpioPortA
#define KEY_ROW2_PIN GpioPin2
#define KEY_ROW3_PORT GpioPortA
#define KEY_ROW3_PIN GpioPin3
#define KEY_ROW4_PORT GpioPortA
#define KEY_ROW4_PIN GpioPin4
#define KEY_COL1_PORT GpioPortA
#define KEY_COL1_PIN GpioPin5
#define KEY_COL2_PORT GpioPortA
#define KEY_COL2_PIN GpioPin6
#define KEY_COL3_PORT GpioPortA
#define KEY_COL3_PIN GpioPin7
#define KEY_COL4_PORT GpioPortA
#define KEY_COL4_PIN GpioPin8
#define KEY_COL5_PORT GpioPortA
#define KEY_COL5_PIN GpioPin9
#define KEY_ROW1_HIGH() Gpio_SetIO(KEY_ROW1_PORT, KEY_ROW1_PIN)
#define KEY_ROW1_LOW() Gpio_ClrIO(KEY_ROW1_PORT, KEY_ROW1_PIN)
#define KEY_ROW2_HIGH() Gpio_SetIO(KEY_ROW2_PORT, KEY_ROW2_PIN)
#define KEY_ROW2_LOW() Gpio_ClrIO(KEY_ROW2_PORT, KEY_ROW2_PIN)
#define KEY_ROW3_HIGH() Gpio_SetIO(KEY_ROW3_PORT, KEY_ROW3_PIN)
#define KEY_ROW3_LOW() Gpio_ClrIO(KEY_ROW3_PORT, KEY_ROW3_PIN)
#define KEY_ROW4_HIGH() Gpio_SetIO(KEY_ROW4_PORT, KEY_ROW4_PIN)
#define KEY_ROW4_LOW() Gpio_ClrIO(KEY_ROW4_PORT, KEY_ROW4_PIN)
#define KEY_COL1_HIGH() Gpio_SetIO(KEY_COL1_PORT, KEY_COL1_PIN)
#define KEY_COL1_LOW() Gpio_ClrIO(KEY_COL1_PORT, KEY_COL1_PIN)
#define KEY_COL2_HIGH() Gpio_SetIO(KEY_COL2_PORT, KEY_COL2_PIN)
#define KEY_COL2_LOW() Gpio_ClrIO(KEY_COL2_PORT, KEY_COL2_PIN)
#define KEY_COL3_HIGH() Gpio_SetIO(KEY_COL3_PORT, KEY_COL3_PIN)
#define KEY_COL3_LOW() Gpio_ClrIO(KEY_COL3_PORT, KEY_COL3_PIN)
#define KEY_COL4_HIGH() Gpio_SetIO(KEY_COL4_PORT, KEY_COL4_PIN)
#define KEY_COL4_LOW() Gpio_ClrIO(KEY_COL4_PORT, KEY_COL4_PIN)
#define KEY_COL5_HIGH() Gpio_SetIO(KEY_COL5_PORT, KEY_COL5_PIN)
#define KEY_COL5_LOW() Gpio_ClrIO(KEY_COL5_PORT, KEY_COL5_PIN)
#define DISP_HIGH() Gpio_SetIO(DISP_PORT, DISP_PIN1); Gpio_SetIO(DISP_PORT, DISP_PIN2)
#define DISP_LOW() Gpio_ClrIO(DISP_PORT, DISP_PIN1); Gpio_ClrIO(DISP_PORT, DISP_PIN2)
#define KEY_SCAN_INTERVAL 10000
static uint8_t KeyScan(void)
{
uint8_t key = 0xFF;
KEY_ROW1_HIGH(); KEY_ROW2_HIGH(); KEY_ROW3_HIGH(); KEY_ROW4_LOW(); KEY_COL1_LOW(); DelayUs(KEY_SCAN_INTERVAL);
if (!Gpio_GetIO(KEY_PORT, KEY_PIN)) { key = 0; }
KEY_ROW1_HIGH(); KEY_ROW2_HIGH(); KEY_ROW3_LOW(); KEY_ROW4_HIGH(); KEY_COL1_LOW(); DelayUs(KEY_SCAN_INTERVAL);
if (!Gpio_GetIO(KEY_PORT, KEY_PIN)) { key = 1; }
KEY_ROW1_HIGH(); KEY_ROW2_HIGH(); KEY_ROW3_LOW(); KEY_ROW4_HIGH(); KEY_COL1_HIGH(); KEY_COL2_LOW(); DelayUs(KEY_SCAN_INTERVAL);
if (!Gpio_GetIO(KEY_PORT, KEY_PIN)) { key = 2; }
KEY_ROW1_HIGH(); KEY_ROW2_HIGH(); KEY_ROW3_LOW(); KEY_ROW4_HIGH(); KEY_COL2_HIGH(); KEY_COL3_LOW(); DelayUs(KEY_SCAN_INTERVAL);
if (!Gpio_GetIO(KEY_PORT, KEY_PIN)) { key = 3; }
KEY_ROW1_HIGH(); KEY_ROW2_HIGH(); KEY_ROW3_LOW(); KEY_ROW4_HIGH(); KEY_COL3_HIGH(); KEY_COL4_LOW(); DelayUs(KEY_SCAN_INTERVAL);
if (!Gpio_GetIO(KEY_PORT, KEY_PIN)) { key = 4; }
KEY_ROW1_HIGH(); KEY_ROW2_HIGH(); KEY_ROW3_HIGH(); KEY_ROW4_LOW(); KEY_COL4_HIGH(); DelayUs(KEY_SCAN_INTERVAL);
if (!Gpio_GetIO(KEY_PORT, KEY_PIN)) { key = 5; }
KEY_ROW1_HIGH(); KEY_ROW2_LOW(); KEY_ROW3_HIGH(); KEY_ROW4_HIGH(); KEY_COL1_LOW(); DelayUs(KEY_SCAN_INTERVAL);
if (!Gpio_GetIO(KEY_PORT, KEY_PIN)) { key = 6; }
KEY_ROW1_HIGH(); KEY_ROW2_LOW(); KEY_ROW3_HIGH(); KEY_ROW4_HIGH(); KEY_COL1_HIGH(); KEY_COL2_LOW(); DelayUs(KEY_SCAN_INTERVAL);
if (!Gpio_GetIO(KEY_PORT, KEY_PIN)) { key = 7; }
KEY_ROW1_HIGH(); KEY_ROW2_LOW(); KEY_ROW3_HIGH(); KEY_ROW4_HIGH(); KEY_COL2_HIGH(); KEY_COL3_LOW(); DelayUs(KEY_SCAN_INTERVAL);
if (!Gpio_GetIO(KEY_PORT, KEY_PIN)) { key = 8; }
KEY_ROW1_HIGH(); KEY_ROW2_LOW(); KEY_ROW3_HIGH(); KEY_ROW4_HIGH(); KEY_COL3_HIGH(); KEY_COL4_LOW(); DelayUs(KEY_SCAN_INTERVAL);
if (!Gpio_GetIO(KEY_PORT, KEY_PIN)) { key = 9; }
KEY_ROW1_LOW(); KEY_ROW2_HIGH(); KEY_ROW3_HIGH(); KEY_ROW4_HIGH(); KEY_COL1_LOW(); DelayUs(KEY_SCAN_INTERVAL);
if (!Gpio_GetIO(KEY_PORT, KEY_PIN)) { key = 10; }
KEY_ROW1_LOW(); KEY_ROW2_HIGH(); KEY_ROW3_HIGH(); KEY_ROW4_HIGH(); KEY_COL1_HIGH(); KEY_COL2_LOW(); DelayUs(KEY_SCAN_INTERVAL);
if (!Gpio_GetIO(KEY_PORT, KEY_PIN)) { key = 11; }
KEY_ROW1_LOW(); KEY_ROW2_HIGH(); KEY_ROW3_HIGH(); KEY_ROW4_HIGH(); KEY_COL2_HIGH(); KEY_COL3_LOW(); DelayUs(KEY_SCAN_INTERVAL);
if (!Gpio_GetIO(KEY_PORT, KEY_PIN)) { key = 12; }
KEY_ROW1_LOW(); KEY_ROW2_HIGH(); KEY_ROW3_HIGH(); KEY_ROW4_HIGH(); KEY_COL3_HIGH(); KEY_COL4_LOW(); DelayUs(KEY_SCAN_INTERVAL);
if (!Gpio_GetIO(KEY_PORT, KEY_PIN)) { key = 13; }
KEY_ROW1_HIGH(); KEY_ROW2_HIGH(); KEY_ROW3_HIGH(); KEY_ROW4_HIGH(); KEY_COL5_LOW(); DelayUs(KEY_SCAN_INTERVAL);
if (!Gpio_GetIO(KEY_PORT, KEY_PIN)) { key = 14; }
return key;
}
static void DispNum(uint8_t num)
{
static const uint8_t DISP_TBL[] =
{
0x3F, 0x06, 0x5B, 0x4F, 0x66,
0x6D, 0x7D, 0x07, 0x7F, 0x6F,
};
uint8_t digit1 = num % 10;
uint8_t digit2 = num / 10;
uint8_t disp1 = (digit2 == 0) ? 0 : DISP_TBL[digit2];
uint8_t disp2 = DISP_TBL[digit1];
DISP_LOW();
Gpio_SetIO(DISP_PORT, DISP_PIN1);
HC32L13X_WriteIO(DISP_PORT, DISP_PIN2, (disp1 != 0) ? disp1 : 0x00);
DelayMs(1);
DISP_LOW();
Gpio_SetIO(DISP_PORT, DISP_PIN2);
HC32L13X_WriteIO(DISP_PORT, DISP_PIN1, disp2);
DelayMs(1);
}
int main(void)
{
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
Gpio_InitIO(KEY_PORT, KEY_PIN, GpioDirIn);
Gpio_InitIO(DISP_PORT, DISP_PIN1, GpioDirOut);
Gpio_InitIO(DISP_PORT, DISP_PIN2, GpioDirOut);
Gpio_InitIO(KEY_ROW1_PORT, KEY_ROW1_PIN, GpioDirOut);
Gpio_InitIO(KEY_ROW2_PORT, KEY_ROW2_PIN, GpioDirOut);
Gpio_InitIO(KEY_ROW3_PORT, KEY_ROW3_PIN, GpioDirOut);
Gpio_InitIO(KEY_ROW4_PORT, KEY_ROW4_PIN, GpioDirOut);
Gpio_InitIO(KEY_COL1_PORT, KEY_COL1_PIN, GpioDirOut);
Gpio_InitIO(KEY_COL2_PORT, KEY_COL2_PIN, GpioDirOut);
Gpio_InitIO(KEY_COL3_PORT, KEY_COL3_PIN, GpioDirOut);
Gpio_InitIO(KEY_COL4_PORT, KEY_COL4_PIN, GpioDirOut);
Gpio_InitIO(KEY_COL5_PORT, KEY_COL5_PIN, GpioDirOut);
while (1)
{
uint8_t key = KeyScan();
if (key != 0xFF)
{
DispNum(key);
}
}
}
```
在此代码中,我们将矩阵键盘的行列分别连接到不同的GPIO引脚上,并使用`KeyScan`函数扫描按键状态。扫描完成后,我们将数字显示在数码管上,使用`DispNum`函数将数字转换为7段LED数码管可以显示的格式。注意,该代码需要配合HC32L13X芯片的外设库一起使用。
hc32l13x ch455h 4x5矩阵键盘,数码管驱动,按键使用gpio,数码管使用i2c及具体实现示例
针对你提到的hc32l13x芯片及ch455h 4x5矩阵键盘和数码管驱动,我可以给你提供一些基本的实现示例,但需要注意的是,由于具体的硬件连接和功能实现可能会因为不同的应用场景而有所不同,因此以下仅供参考。
首先,我们来看一下hc32l13x芯片的GPIO和I2C的使用方法。
GPIO的使用方法:
1.引脚配置
hc32l13x芯片的GPIO可以通过库函数来进行配置,例如下面的代码可以将PC5配置为输出模式(推挽输出):
```
GPIO_SetFunc(GPIOC, GPIO_PIN_5, GPIO_FUNC_0_GPIO);
GPIO_SetDir(GPIOC, GPIO_PIN_5, GPIO_DIR_OUT);
GPIO_SetOutputVal(GPIOC, GPIO_PIN_5, 1);
```
2.读写GPIO
读写GPIO的方法也很简单,可以通过库函数来实现,例如下面的代码可以读取PA3引脚的电平值:
```
uint8_t u8PinVal = GPIO_ReadInputPortBit(GPIOA, GPIO_PIN_3);
```
I2C的使用方法:
1.I2C初始化
hc32l13x芯片的I2C可以通过库函数来进行初始化配置,例如下面的代码可以将I2C1配置为400KHz的速率:
```
stc_i2c_init_t stcI2cInit;
stcI2cInit.u32Baudrate = 400000UL;
stcI2cInit.bMaster = TRUE;
stcI2cInit.u8SlaveAddr = 0x00;
stcI2cInit.bWaitSelection = FALSE;
stcI2cInit.u8I2cClkDiv = I2C_CLK_DIV4;
stcI2cInit.u8I2cSclTime = I2C_SCL_TIME;
I2C_Init(I2C1, &stcI2cInit);
```
2.I2C发送数据
I2C发送数据的方法也很简单,可以通过库函数来实现,例如下面的代码可以向设备地址为0x50的设备发送一个字节的数据0x01:
```
uint8_t u8DataBuf[] = {0x01};
I2C_SendData(I2C1, 0x50, u8DataBuf, 1);
```
3.I2C接收数据
I2C接收数据的方法也很简单,可以通过库函数来实现,例如下面的代码可以从设备地址为0x50的设备接收一个字节的数据到u8DataBuf中:
```
uint8_t u8DataBuf[1];
I2C_ReceiveData(I2C1, 0x50, u8DataBuf, 1);
```
接下来,我们来看一下如何使用hc32l13x芯片和ch455h 4x5矩阵键盘和数码管驱动。
1.矩阵键盘的实现
首先,让我们来看一下ch455h 4x5矩阵键盘的引脚定义:
```
KEY_ROW0 - PC0
KEY_ROW1 - PC1
KEY_ROW2 - PC2
KEY_ROW3 - PC3
KEY_COL0 - PC4
KEY_COL1 - PC5
KEY_COL2 - PC6
KEY_COL3 - PC7
KEY_COL4 - PA2
```
可以看到,矩阵键盘的行和列的引脚都是通过GPIO进行控制的,因此我们可以通过配置GPIO的方式来实现矩阵键盘的扫描。
以4x5矩阵键盘为例,我们可以通过依次将每一列的引脚输出为低电平,然后读取每一行的引脚的电平值来判断是否有按键按下。
具体实现代码如下:
```
#define KEY_ROW0 GPIO_PIN_0
#define KEY_ROW1 GPIO_PIN_1
#define KEY_ROW2 GPIO_PIN_2
#define KEY_ROW3 GPIO_PIN_3
#define KEY_COL0 GPIO_PIN_4
#define KEY_COL1 GPIO_PIN_5
#define KEY_COL2 GPIO_PIN_6
#define KEY_COL3 GPIO_PIN_7
#define KEY_COL4 GPIO_PIN_2
#define KEY_ROW_PORT GPIOC
#define KEY_COL_PORT GPIOC
#define KEY_SCAN_INTERVAL 10 //扫描间隔时间(ms)
static uint8_t s_u8KeyState[4][5] = {0}; //按键状态数组
void Key_Scan(void)
{
static uint8_t s_u8KeyScanCol = 0; //当前扫描的列号
static uint32_t s_u32KeyScanTick = 0; //扫描定时器
//每隔一定时间扫描一次按键
if((SysTick_GetTick() - s_u32KeyScanTick) < KEY_SCAN_INTERVAL)
{
return;
}
s_u32KeyScanTick = SysTick_GetTick();
//输出当前列为低电平,并读取行的状态
GPIO_SetOutputVal(KEY_COL_PORT, KEY_COL0 << s_u8KeyScanCol, 0);
s_u8KeyState[0][s_u8KeyScanCol] = GPIO_ReadInputPortBit(KEY_ROW_PORT, KEY_ROW0);
s_u8KeyState[1][s_u8KeyScanCol] = GPIO_ReadInputPortBit(KEY_ROW_PORT, KEY_ROW1);
s_u8KeyState[2][s_u8KeyScanCol] = GPIO_ReadInputPortBit(KEY_ROW_PORT, KEY_ROW2);
s_u8KeyState[3][s_u8KeyScanCol] = GPIO_ReadInputPortBit(KEY_ROW_PORT, KEY_ROW3);
//将当前列恢复为高电平
GPIO_SetOutputVal(KEY_COL_PORT, KEY_COL0 << s_u8KeyScanCol, 1);
//判断是否扫描完了一行,如果是,则更新扫描列号
s_u8KeyScanCol++;
if(s_u8KeyScanCol >= 5)
{
s_u8KeyScanCol = 0;
}
}
```
2.数码管驱动的实现
接下来,让我们来看一下如何实现使用hc32l13x芯片和I2C驱动ch455h数码管。
首先,让我们来看一下ch455h数码管的引脚定义:
```
DIN - PC1
CLK - PC0
CS - PC2
```
可以看到,ch455h数码管的引脚是通过I2C进行控制的,因此我们可以通过配置I2C的方式来实现数码管的驱动。
具体实现代码如下:
```
#define SEG_ADDR 0xC0 //数码管地址
static uint8_t s_u8SegBuf[4] = {0}; //数码管缓存数据
void Seg_Init(void)
{
//向数码管发送初始化命令
uint8_t u8InitCmd[] = {0x21, 0x81, 0xA0, 0xCF};
I2C_SendData(I2C1, SEG_ADDR, u8InitCmd, sizeof(u8InitCmd));
}
void Seg_SetData(uint8_t u8Data[4])
{
memcpy(s_u8SegBuf, u8Data, sizeof(s_u8SegBuf));
}
void Seg_Update(void)
{
//向数码管发送更新数据命令
uint8_t u8UpdateCmd[] = {0x01, 0x02, 0x03, 0x04};
I2C_SendData(I2C1, SEG_ADDR, u8UpdateCmd, sizeof(u8UpdateCmd));
//向数码管发送数码数据
I2C_SendData(I2C1, SEG_ADDR, s_u8SegBuf, sizeof(s_u8SegBuf));
}
```
以上就是使用hc32l13x芯片和ch455h 4x5矩阵键盘和数码管驱动的基本实现示例,希望能够对你有所帮助。
阅读全文