本帖最后由 jinglixixi 于 2023-3-1 00:44 编辑
在HC32F4A0开发板上配有3*3的矩阵按键,其电路如图1所示。
为掌握其用法,特为它配置了OLED屏来直接显示其触动的按键,其输出效果如图2所示。
图1 原理图
图2 检测效果
实现该效果的主程序为:
int32_t main(void)
{
LL_PERIPH_WE(LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_GPIO | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM);
BSP_CLK_Init();
BSP_IO_Init();
BSP_LED_Init();
KEYSCAN_ROW0_Init();
KEYSCAN_ROW1_Init();
KEYSCAN_ROW2_Init();
KEYSCAN_COL_Init();
EXTINT_ClearExtIntStatus(KEYSCAN_ROW0_EXTINT);
EXTINT_ClearExtIntStatus(KEYSCAN_ROW1_EXTINT);
EXTINT_ClearExtIntStatus(KEYSCAN_ROW2_EXTINT);
KEYSCAN_Cmd(ENABLE);
LED_Init();
OLED_Init();
OLED_Clear();
OLED_ShowString(20,0,"HC32F4A0",16);
OLED_ShowString(20,4,"KEY",16);
LL_PERIPH_WP(LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_GPIO | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM);
for (;;) {
;
}
}
由于该矩阵按键是采用扫描的方式进行处理,故它是按行来判别的,并指示出是哪一列的按键被按下。
为此,3个按行进行判别的函数为:
static void KEYSCAN_ROW0_IrqCallback(void)
{
if (SET == EXTINT_GetExtIntStatus(KEYSCAN_ROW0_EXTINT)) {
BSP_LED_Toggle(LED_BLUE);
DDL_Printf("Key row 0, col %ld is pressed.\r\n", KEYSCAN_GetKeyoutIdx());
OLED_ShowNum(44,4,1+KEYSCAN_GetKeyoutIdx(),3,16);
while (PIN_RESET == GPIO_ReadInputPins(KEYIN0_PORT, KEYIN0_PIN));
EXTINT_ClearExtIntStatus(KEYSCAN_ROW0_EXTINT);
}
}
static void KEYSCAN_ROW1_IrqCallback(void)
{
if (SET == EXTINT_GetExtIntStatus(KEYSCAN_ROW1_EXTINT)) {
BSP_LED_Toggle(LED_YELLOW);
DDL_Printf("Key row 1, col %ld is pressed.\r\n", KEYSCAN_GetKeyoutIdx());
OLED_ShowNum(44,4,4+KEYSCAN_GetKeyoutIdx(),3,16);
while (PIN_RESET == GPIO_ReadInputPins(KEYIN1_PORT, KEYIN1_PIN));
EXTINT_ClearExtIntStatus(KEYSCAN_ROW1_EXTINT);
}
}
static void KEYSCAN_ROW2_IrqCallback(void)
{
if (SET == EXTINT_GetExtIntStatus(KEYSCAN_ROW2_EXTINT)) {
BSP_LED_Toggle(LED_RED);
DDL_Printf("Key row 2, col %ld is pressed.\r\n", KEYSCAN_GetKeyoutIdx());
OLED_ShowNum(44,4,7+KEYSCAN_GetKeyoutIdx(),3,16);
while (PIN_RESET == GPIO_ReadInputPins(KEYIN2_PORT, KEYIN2_PIN));
EXTINT_ClearExtIntStatus(KEYSCAN_ROW2_EXTINT);
}
}
此外,还以3个LED灯来指示所触动的是哪一行,即蓝色LED标识第1行,黄色LED标识第2行,红色LED标识第3行。并以LED灯的亮灭来指示触发是奇数次还是偶数次,奇数次是亮,偶数次是灭。
图3 初始状态
图4 首次按下K1键
图5 再次按下K1键
图6 按下K5键
图7按下K9键
当依次按下3行按键时,由于每行均是首次被触动,故蓝黄红3个LED灯均被点亮,见图8所示。
此外,值得学习的是蓝黄红这3个LED灯是由一个I2C接口的芯片TCA9539控制的。
图8依次按下3行键