芯片开放社区
直播中

张昂笙

7年用户 1001经验值
私信 关注
[技术讨论]

【平头哥RVB2601创意应用开发】板载按键实验

前言

上一篇讲解了使用官方例程来操作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



代码编辑

修改RGB操作方式

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


初始化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);
}
按键控制逻辑

按键控制逻辑如下:
按下key1红灯亮,按下key2绿灯亮,key1key2都按下了蓝灯亮,没有按下任何按键RGB都不亮。
代码实现如下:
static void key_Lgc(void)
{
//        printf("%d---%dn",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);
        }
}
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();
    }
}
效果演示

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



文章转载自:平头哥芯片开放社区 作者:hehung

更多回帖

发帖
×
20
完善资料,
赚取积分