2157|2

1517

帖子

1

TA的资源

五彩晶圆(初级)

楼主
 

【小华HC32F448测评】+按键控制 [复制链接]

 

在人机交互方面,处理显示器件的使用,按键这样的输出器件也是不可或缺的。

例如用板载的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)

 

最新回复

66666,按键的基本功得好好学习,会了按键,可以打遍天下MCU,无敌!   详情 回复 发表于 2023-8-26 18:18
点赞 关注
 
 

回复
举报

1704

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 

按键控制是基础,要好好测试一下

 
 
 

回复

6993

帖子

11

TA的资源

版主

板凳
 

66666,按键的基本功得好好学习,会了按键,可以打遍天下MCU,无敌!

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表