完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
前言 上一篇讲解了使用官方例程来操作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的输入端口使用。 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绿灯亮,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 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
【平头哥Sipeed LicheeRV 86开发板试用体验】Waft初体验
15662 浏览 1 评论
13712 浏览 4 评论
【平头哥Sipeed LicheeRV 86开发板试用体验】四、烧写waft系统&搭建waft测试环境
19629 浏览 2 评论
59037 浏览 19 评论
【限时福利】加入芯片开发社区,领100G电子工程师资料大礼包
87765 浏览 121 评论
邀请函 | 3月2日 来上海参加平头哥“玄铁RISC-V生态大会”
746浏览 0评论
读书分享会 | 玄铁RISC-V处理器入门与实战电子书免费下载!
643浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 20:14 , Processed in 1.798416 second(s), Total 65, Slave 50 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号