07_瑞萨GUI(LVGL)移植实战教程之LVGL对接EC11旋转编码器驱动

本系列教程配套出有视频教程,观看地址:https://www.bilibili.com/video/BV1gV4y1e7Sg

7. LVGL对接EC11旋转编码器驱动

本次实验我们向LVGL库中对接EC11旋转编码器驱动,让我们能通过EC11旋转编码器操作UI。

7.1 复制工程

上次实验得出的工程我们可以通过复制在原有的基础上得到一个新的工程。

如果你不清楚复制工程的步骤,请参考阅读第三章实验的步骤教程。

本次实验我们的项目命名为:05_dshanmcu_ra6m5_lvgl_display_touchpad_encoder

chapter-7_001

7.2 对接驱动

打开 05_dshanmcu_ra6m5_lvgl_display_touchpad_encoder\dshanmcu_ra6m5\drivers\drv_gpio_ec11.c 文件,做如下修改:

将第 9 行的代码改为如下:

#define DRV_GPIO_EC11_USE_LVGL  (1)

打开 05_dshanmcu_ra6m5_lvgl_display_touchpad_encoder\dshanmcu_ra6m5\drivers\lv_port_indev.c 文件,下面对其进行修改适配我们的工程:

  1. 在第 14 行空白处添加头文件包含:
#include "drv_gpio_ec11.h"
  1. 修改 lv_port_indev_init 函数为如下代码:
void lv_port_indev_init(void)
{/*** Here you will find example implementation of input devices supported by LittelvGL:*  - Touchpad*  - Mouse (with cursor support)*  - Keypad (supports GUI usage only with key)*  - Encoder (supports GUI usage only with: left, right, push)*  - Button (external buttons to press points on the screen)**  The `..._read()` function are only examples.*  You should shape them according to your hardware*//*------------------* Touchpad* -----------------*//*Initialize your touchpad if you have*/touchpad_init();/*Register a touchpad input device*/static lv_indev_drv_t indev_pointer_drv;lv_indev_drv_init(&indev_pointer_drv);indev_pointer_drv.type = LV_INDEV_TYPE_POINTER;indev_pointer_drv.read_cb = touchpad_read;indev_touchpad = lv_indev_drv_register(&indev_pointer_drv);/*------------------* Mouse* -----------------*//*Initialize your mouse if you have*///mouse_init();/*Register a mouse input device*///lv_indev_drv_init(&indev_drv);//indev_drv.type = LV_INDEV_TYPE_POINTER;//indev_drv.read_cb = mouse_read;//indev_mouse = lv_indev_drv_register(&indev_drv);/*Set cursor. For simplicity set a HOME symbol now.*///lv_obj_t * mouse_cursor = lv_img_create(lv_scr_act());//lv_img_set_src(mouse_cursor, LV_SYMBOL_HOME);//lv_indev_set_cursor(indev_mouse, mouse_cursor);/*------------------* Keypad* -----------------*//*Initialize your keypad or keyboard if you have*///keypad_init();/*Register a keypad input device*///lv_indev_drv_init(&indev_drv);//indev_drv.type = LV_INDEV_TYPE_KEYPAD;//indev_drv.read_cb = keypad_read;//indev_keypad = lv_indev_drv_register(&indev_drv);/*Later you should create group(s) with `lv_group_t * group = lv_group_create()`,*add objects to the group with `lv_group_add_obj(group, obj)`*and assign this input device to group to navigate in it:*`lv_indev_set_group(indev_keypad, group);`*//*------------------* Encoder* -----------------*//*Initialize your encoder if you have*/encoder_init();/*Register a encoder input device*/static lv_indev_drv_t indev_encoder_drv;lv_indev_drv_init(&indev_encoder_drv);indev_encoder_drv.type = LV_INDEV_TYPE_ENCODER;indev_encoder_drv.read_cb = encoder_read;indev_encoder = lv_indev_drv_register(&indev_encoder_drv);/*Later you should create group(s) with `lv_group_t * group = lv_group_create()`,*add objects to the group with `lv_group_add_obj(group, obj)`*and assign this input device to group to navigate in it:*`lv_indev_set_group(indev_encoder, group);`*//*------------------* Button* -----------------*//*Initialize your button if you have*///button_init();/*Register a button input device*///lv_indev_drv_init(&indev_drv);//indev_drv.type = LV_INDEV_TYPE_BUTTON;//indev_drv.read_cb = button_read;//indev_button = lv_indev_drv_register(&indev_drv);/*Assign buttons to points on the screen*///static const lv_point_t btn_points[2] = {//    {10, 10},   /*Button 0 -> x:10; y:10*///    {40, 100},  /*Button 1 -> x:40; y:100*///};//lv_indev_set_button_points(indev_button, btn_points);lv_group_t *g = lv_group_create();lv_group_set_default(g);lv_indev_set_group(indev_touchpad, g);lv_indev_set_group(indev_encoder, g);
}
  1. 修改 encoder_init 函数为如下代码:
static void encoder_init(void)
{/*Your code comes here*/fsp_err_t err;err = drv_gpio_ec11_init();if(FSP_SUCCESS != err){printf ("%s %d\r\n", __FUNCTION__, __LINE__);__BKPT();}
}
  1. 修改 encoder_read 函数为如下代码:
/*Will be called by the library to read the encoder*/
static void encoder_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{uint32_t handler_start = lv_tick_get();if(drv_gpio_ec11_get_pin_state(EC11_PIN_KEY)){if(handler_start >= drv_gpio_ec11_get_pin_press_tick(EC11_PIN_KEY)){encoder_diff = 0;encoder_state = LV_INDEV_STATE_PR;drv_gpio_ec11_set_pin_state(EC11_PIN_KEY, 0);}}else if(drv_gpio_ec11_get_pin_state(EC11_PIN_S1)){if(handler_start >= drv_gpio_ec11_get_pin_press_tick(EC11_PIN_S1)){encoder_diff -= 1;drv_gpio_ec11_set_pin_state(EC11_PIN_S1, 0);}}else if(drv_gpio_ec11_get_pin_state(EC11_PIN_S2)){if(handler_start >= drv_gpio_ec11_get_pin_press_tick(EC11_PIN_S2)){encoder_diff += 1;drv_gpio_ec11_set_pin_state(EC11_PIN_S2, 0);}}else{bsp_io_level_t level;g_ioport.p_api->pinRead(&g_ioport_ctrl, EC11_PIN_KEY, &level);if(level){encoder_state = LV_INDEV_STATE_REL;encoder_diff = 0;}}data->enc_diff = encoder_diff;data->state = encoder_state;
}

7.3 调用app

打开 05_dshanmcu_ra6m5_lvgl_display_touchpad_encoder\dshanmcu_ra6m5\src\hal_entry.c 将 hal_entry 函数修改为如下所示的代码:

void hal_entry(void)
{/* TODO: add your own code here *///app_uart_test();//app_i2c_touchpad_test();//app_spi_display_test();app_lvgl_test();//app_ec11_test();#if BSP_TZ_SECURE_BUILD/* Enter non-secure code */R_BSP_NonSecureEnter();
#endif
}

7.4 验证效果

点击编译按钮,再点击 debug 按钮,将程序烧写到开发板中。操作EC11编码器(左转、右转、按下)会看到UI也会跟着变化。

本节完

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/103685.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

某米ax3000路由器组网解析

我们使用某米k60手机与某米ax3000 wifi6路由器组网,来分析和学习网络速率与瓶颈限制。 某米 AX3000 路由器简介 某米 AX3000 路由器是一款支持 WiFi 6 的双频路由器,它的 MIMO 是 22,也就是两根天线。MIMO 是 Multiple Input Multiple Outpu…

nvm 在 Windows 上的使用

NVM(Node Version Manager)是一个用于管理和切换多个 Node.js 版本的工具。它允许你在同一台机器上同时安装和使用不同版本的 Node.js,而无需手动安装和卸载。 之前都是只安装一个版本的 node.js,该更新时更新,使得以前…

NFT 合约部署教程

本篇文章主要介绍如何将您的 NFT(ERC-721 Token) 通过智能合约部署到去中心化网络中 Init Project //创建一款ocean的NFT mkdir nft-ocean//进入目录 cd nft-ocean//初始化项目,根据提示填写即可,packname和description填写即可 npm init//添加hardhat…

el-select数据过多的解决(纯前端)

前言 el-select数据过多这个问题应该很多人都遇到过,在生产环境中数据几百、几千条是比较常见的。当数据过多时,就会造成浏览器卡顿,如果客户电脑性能不行,浏览器直接卡死也有可能。 解决 先说一下现在项目中遇到的两种解决方案…

Qt +VTK+Cmake 编译和环境配置(第二篇,中级篇, 重新编译)

1.下载VTK和Cmake 这里不介绍了。我的VTK 8.2.0 cmake 3.27.4 就是不服这编译器了。重新来一次 打开Cmake,把VTK源文件路径和目标路径设置一下(目标路径自己设置,随意) 点击Configure:。 点击下一步 选择好 Qt的gcc…

多通道振弦数据记录仪应用桥梁安全监测的关键要点

多通道振弦数据记录仪应用桥梁安全监测的关键要点 随着近年来桥梁建设和维护的不断推进,桥梁安全监测越来越成为公共关注的焦点。多通道振弦数据记录仪因其高效、准确的数据采集和处理能力,已经成为桥梁安全监测中不可或缺的设备。本文将从以下几个方面…

2023年MySQL实战核心技术第二篇

目录 五 . 日志系统:一条SQL更新语句是如何执行的? 5.1 解释 5.2 重要的日志模块:redo log 5.2.1 解释 5.2.2 WAL(Write-Ahead Logging) 5.2.3 crash-safe。 5.3 重要的日志模块:binlog 5.3 .1 为什么会有…

向量数据库,能让AI再次起飞吗?

9月7-8日,深圳国际会展中心18号馆 来了,来了,腾讯面向产业互联网领域规格最高、规模最大、覆盖最广的年度科技盛会 -——- 腾讯全球数字生态大会。 9 月 7 日,我们将聚焦产业未来发展新趋势,针对云计算、大数据、人工…

【C++】封装map和set(红黑树实现)

前言: 前面,我们学习了set和map的用法,这两个容器可以完成查找,排序等操作,后来我们在学习过二叉搜索树的基础上又学习了两种特殊的二叉搜索树——AVL树和红黑树,他们俩可以是效率进一步提高,其…

深浅拷贝与赋值

数据类型 数据类型 在JavaScript中,数据类型有两大类。一类是基本数据类型,一类是引用数据类型。 基本数据类型有六种:number、string、boolean、null、undefined、symbol。 基本数据类型存放在栈中。存放在栈中的数据具有数据大小确定&a…

GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图

GPT对于每个科研人员已经成为不可或缺的辅助工具,不同的研究领域和项目具有不同的需求。如在科研编程、绘图领域: 1、编程建议和示例代码: 无论你使用的编程语言是Python、R、MATLAB还是其他语言,都可以为你提供相关的代码示例。 2、数据可…

pytorch-v2.0.1 cuda arm64 aarch64 torch 2.0.1+cu118 源码编译笔记【2】验证cuda安装 成功

接上篇 pytorch-v2.0.1 cuda arm64 aarch64 torch 2.0.1cu118 源码编译笔记_hkNaruto的博客-CSDN博客 由于采用/usr/local/bin/gcc编译,先设置LD_LIBRARY_PATH,再启动python3 export LD_LIBRARY_PATH/usr/local/lib64:/usr/local/lib:/usr/lib64:/usr/…