在人机交互方面,处理显示器件的使用,按键这样的输出器件也是不可或缺的。
例如用板载的4个按键就可以完成LED的控制及参数设置的处理。
图1至图3是利用按键控制LED的效果,即当按下KEY1时点亮红色LED,按下KEY2时熄灭红色LED;当按下KEY3时点亮蓝色LED,按下KEY4时熄灭蓝色LED。
图1 点亮红色LED
图2点亮蓝色LED
图3点亮2个LED
在使用串口的情况下,依次按下KEY1~ KEY4会出现图4所示的输出信息。
图4 串口输出信息
若对按键的中断处理程序加以改造,则可在OLED屏上直接显示出按键值,其内容如下:
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());
if(KEYSCAN_GetKeyoutIdx()==3)
{
OLED_ShowString(20,5,"K1",16);
}
else
{
OLED_ShowString(20,5,"K2",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());
if(KEYSCAN_GetKeyoutIdx()==7)
{
OLED_ShowString(20,5,"K4",16);
}
else
{
OLED_ShowString(20,5,"K3",16);
}
while (PIN_RESET == GPIO_ReadInputPins(KEYIN1_PORT, KEYIN1_PIN)) {
;
}
EXTINT_ClearExtIntStatus(KEYSCAN_ROW1_EXTINT);
}
}
对于的主程序为:
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();
//DDL_PrintfInit(BSP_PRINTF_DEVICE, BSP_PRINTF_BAUDRATE, BSP_PRINTF_Preinit);
KEYSCAN_ROW0_Init();
KEYSCAN_ROW1_Init();
KEYSCAN_COL_Init();
EXTINT_ClearExtIntStatus(KEYSCAN_ROW0_EXTINT);
EXTINT_ClearExtIntStatus(KEYSCAN_ROW1_EXTINT);
KEYSCAN_Cmd(ENABLE);
Init_OLED();
LL_PERIPH_WP(LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_GPIO | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM);
OLED_Init();
OLED_Clear();
OLED_ShowString(20,0,"HC32F448",16);
OLED_ShowString(20,2,"OLED Test",16);
for (;;) {
;
}
}
经程序的编译与下载,其测试效果如图5所示。
图5 键值显示
此外,使用GPIO口也可自行扩展触摸键来进行控制,对按键和LED配置的函数为:
void KEY_LED_Init(void)
{
stc_gpio_init_t stcGpioInit;
(void)GPIO_StructInit(&stcGpioInit);
stcGpioInit.u16PinState = PIN_STAT_RST;
stcGpioInit.u16PinDir = PIN_DIR_OUT;
(void)GPIO_Init(LED_G_PORT, LED_G_PIN, &stcGpioInit);
stcGpioInit.u16PinState = PIN_STAT_RST;
stcGpioInit.u16PinDir = PIN_DIR_IN;
(void)GPIO_Init(GPIO_PORT_A, GPIO_PIN_04, &stcGpioInit);
}
以触摸键控制LED的主程序为:
int32_t main(void)
{
LL_PERIPH_WE(LL_PERIPH_GPIO);
KEY_LED_Init();
LL_PERIPH_WP(LL_PERIPH_GPIO);
for (;;) {
if(GPIO_ReadInputPins(GPIO_PORT_A, GPIO_PIN_04)==1)
{
GPIO_SetPins(GPIO_PORT_A,GPIO_PIN_02);
}
else
{
GPIO_ResetPins(GPIO_PORT_A,GPIO_PIN_02);
}
}
}
经程序的编译与下载,其测试效果如图6和图7所示。
图6 空闲状态(点亮LED)
图7 触摸状态(熄灭LED)
|