1970|2

282

帖子

2

TA的资源

一粒金砂(高级)

楼主
 

【平头哥RVB2601创意应用开发】3. 板载按键实验 [复制链接]

  本帖最后由 hehung 于 2022-3-6 13:07 编辑
  • 前言

上一篇讲解了使用官方例程来操作RGB,本篇将使用上一篇的工程加上按键控制。

目的:按下key1红灯亮,按下key2绿灯亮,key1key2都按下了蓝灯亮,没有按下任何按键RGB都不亮。

  • 原理图

我们先看一下按键和LED的原理图。

按键原理图如下,原理上写得是K4K5,与板载上的按键名称不一致,我们在看看端口复用表确定是哪个按键,下面会详细说明。

从原理图上看,按下按键之后,GPIO端口电平会变低,如果没有按下按键,GPIO端口是3.3V高电平。

 

 

端口复用表如下图,可以知道,PA11连接到了KEY1PA12连接到了KEY2.

 

关于LED的电路图,如下图,作为普通IO控制的话,LED GPIO断如果为高电平,LED灭,如果为低电平,LED亮。上一篇帖子已经讲解了RGBLED的电路图连接,这里不在赘述,如下。

蓝色 -- PA4 -- PWM4

绿色 -- PA25 -- PWM2

红色 -- PA7 -- PWM7

   

代码编辑

  1. 修改RGB操作方式

上一篇RGB操作中,对RGB是使用的PWM方式操作的,这一篇将使用普通GPIO来操作,打开app_config.h文件,修改为如下,RGB作为普通GPIO控制代码在main函数中,这里不在赘述

 

  1. 初始化KEY

初始化PA11PA12作为普通GPIO的输入端口使用。

static csi_gpio_pin_t key1;
static csi_gpio_pin_t key2;
static void key_init(void)
{
    csi_pin_set_mux(PA11, PIN_FUNC_GPIO);
    csi_pin_set_mux(PA12, PIN_FUNC_GPIO);
    csi_gpio_pin_init(&key1, PA11);
    csi_gpio_pin_dir(&key1, GPIO_DIRECTION_INPUT);
    csi_gpio_pin_init(&key2, PA12);
    csi_gpio_pin_dir(&key2, GPIO_DIRECTION_INPUT);
}

 

  1. 按键控制逻辑

按键控制逻辑如下:

按下key1红灯亮,按下key2绿灯亮,key1key2都按下了蓝灯亮,没有按下任何按键RGB都不亮。

代码实现如下:

static void key_Lgc(void)
{
//	printf("%d---%d\n",csi_gpio_pin_read(&key1), csi_gpio_pin_read(&key2));
	/* Key1 和 Key2都按下,蓝灯亮 */
	if(GPIO_PIN_LOW == csi_gpio_pin_read(&key1) && GPIO_PIN_LOW == csi_gpio_pin_read(&key2))
	{
		csi_gpio_pin_write(&r, GPIO_PIN_HIGH);
        csi_gpio_pin_write(&g, GPIO_PIN_HIGH);
        csi_gpio_pin_write(&b, GPIO_PIN_LOW);
	}
	/* Key1按下,红灯亮 */
	else if(GPIO_PIN_LOW == csi_gpio_pin_read(&key1))
	{
		csi_gpio_pin_write(&r, GPIO_PIN_LOW);
        csi_gpio_pin_write(&g, GPIO_PIN_HIGH);
        csi_gpio_pin_write(&b, GPIO_PIN_HIGH);
	}
	/* Key2按下,绿灯亮 */
	else if(GPIO_PIN_LOW == csi_gpio_pin_read(&key2))
	{
		csi_gpio_pin_write(&r, GPIO_PIN_HIGH);
        csi_gpio_pin_write(&g, GPIO_PIN_LOW);
        csi_gpio_pin_write(&b, GPIO_PIN_HIGH);
	}
	/* 都没按下,灭 */
	else
	{
		csi_gpio_pin_write(&r, GPIO_PIN_HIGH);
        csi_gpio_pin_write(&g, GPIO_PIN_HIGH);
        csi_gpio_pin_write(&b, GPIO_PIN_HIGH);
	}
}

 

  1. demo_task函数修改

while循环之前添加key_init()初始化按键相关的GPIO

while循环体中,将led_refresh删除,修改任务周期为10ms,将key_lgc()放在while体中判断按键是否按下并控制相应的RGB灯亮灭。

static void demo_task(void *arg)
{
    lv_init();
    oled_init();
    lable_test();
    led_pinmux_init();
	key_init();

    while (1)
    {
        lv_task_handler();
        udelay(1000 * 10);
        lv_tick_inc(1);
//        led_refresh();
		key_Lgc();
    }
}
  • 效果演示

实现效果达到预期,如下:

 

最新回复

现在看到兄弟,没人给你回帖,给你补一个,最近项目完成得怎么样了?  详情 回复 发表于 2022-5-4 17:56
点赞 关注
 
 

回复
举报

7091

帖子

11

TA的资源

版主

沙发
 
现在看到兄弟,没人给你回帖,给你补一个,最近项目完成得怎么样了?

点评

还没做完  详情 回复 发表于 2022-5-6 09:25
 
 
 

回复

282

帖子

2

TA的资源

一粒金砂(高级)

板凳
 
lugl4313820 发表于 2022-5-4 17:56 现在看到兄弟,没人给你回帖,给你补一个,最近项目完成得怎么样了?

还没做完

 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表