前言
上一篇讲解了使用官方例程来操作RGB,本篇将使用上一篇的工程加上按键控制。
目的:按下key1红灯亮,按下key2绿灯亮,key1和key2都按下了蓝灯亮,没有按下任何按键RGB都不亮。
原理图
我们先看一下按键和LED的原理图。
按键原理图如下,原理上写得是K4和K5,与板载上的按键名称不一致,我们在看看端口复用表确定是哪个按键,下面会详细说明。
从原理图上看,按下按键之后,GPIO端口电平会变低,如果没有按下按键,GPIO端口是3.3V高电平。
端口复用表如下图,可以知道,PA11连接到了KEY1,PA12连接到了KEY2.
关于LED的电路图,如下图,作为普通IO控制的话,LED GPIO断如果为高电平,LED灭,如果为低电平,LED亮。上一篇帖子已经讲解了RGB上LED的电路图连接,这里不在赘述,如下。
蓝色 -- PA4 -- PWM4
绿色 -- PA25 -- PWM2
红色 -- PA7 -- PWM7
代码编辑
修改RGB操作方式
上一篇RGB操作中,对RGB是使用的PWM方式操作的,这一篇将使用普通GPIO来操作,打开app_config.h文件,修改为如下,RGB作为普通GPIO控制代码在main函数中,这里不在赘述
初始化KEY
初始化PA11,PA12作为普通GPIO的输入端口使用。
sta
tic 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绿灯亮,key1和key2都按下了蓝灯亮,没有按下任何按键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