【LVGL】不同类型输入设备驱动接口的实现

官方提供了lv_port_indev_template.c文件,用以实现触摸屏、鼠标、键盘、编码器、按钮五种输入设备的接口程序。使用相应的设备,就需要去掉接口部分的注释,填充相应的初始化函数和读取函数。
LVGL支持多设备输入,只需要在lv_port_indev_init()函数中注册多个输入设备结构体即可。
比如,这里注册了三个输入设备,分别对应触摸屏键盘编码器

void lv_port_indev_init(void)
{static lv_indev_drv_t indev_drv1, indev_drv2, indev_drv3;/* 初始化触摸屏 */touchpad_init();/* 注册触摸屏输入设备 */lv_indev_drv_init(&indev_drv1);indev_drv1.type = LV_INDEV_TYPE_POINTER;indev_drv1.read_cb = touchpad_read;indev_touchpad = lv_indev_drv_register(&indev_drv1);/* 初始化键盘 */keypad_init();/* 注册键盘输入设备 */lv_indev_drv_init(&indev_drv2);indev_drv2.type = LV_INDEV_TYPE_KEYPAD;indev_drv2.read_cb = keypad_read;indev_keypad = lv_indev_drv_register(&indev_drv2);/* 初始化编码器 */encoder_init();/* 注册编码器输入设备 */lv_indev_drv_init(&indev_drv3);indev_drv3.type = LV_INDEV_TYPE_ENCODER;indev_drv3.read_cb = encoder_read;indev_encoder = lv_indev_drv_register(&indev_drv3);
}

需要注意的是,键盘和编码器需要绑定到对应的group,才能对group里的控件进行响应。

	g = lv_group_create();					//创建组lv_group_set_default(g);				//设置当前组为默认lv_indev_set_group(indev_encoder, g);	//设置当前组的输入设备为编码器

对于触摸屏来说,需要在touchpad_init()函数中通过iic完成对触摸芯片的初始化,在touchpad_read()函数中判断触摸状态读取触摸坐标

static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{static lv_coord_t last_x = 0;static lv_coord_t last_y = 0;/* 保存按下的坐标和状态 */if(touchpad_is_pressed()){touchpad_get_xy(&last_x, &last_y);			//获取触摸坐标点data->state = LV_INDEV_STATE_PR;			//触摸屏按下} elsedata->state = LV_INDEV_STATE_REL;			//触摸屏松开/* 设置最后按下的坐标 */data->point.x = last_x;data->point.y = last_y;
}

键盘输入设备可以是普通按键,也可以是红外遥控键盘,只要能得到不同的键值就行。键盘输入设备的初始化keypad_init()主要对IO口进行初始化操作,通过keypad_read()查询按键状态以及当前键值。

static void keypad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{static uint32_t last_key = 0;/* 获取按键是否被按下,并保存键值 */uint32_t act_key = keypad_get_key();if(act_key != 0) {data->state = LV_INDEV_STATE_PR;		//按键按下/* 将键值转换成 LVGL 的事件控制字符 */switch(act_key) 						//键值不为0,说明有按键按下{				case 21:act_key = LV_KEY_DOWN;break;case 64:act_key = LV_KEY_ENTER;break;case 67:act_key = LV_KEY_NEXT;break;case 68:act_key = LV_KEY_PREV;break;case 70:act_key = LV_KEY_UP;break;default:break;		}last_key = act_key;} else data->state = LV_INDEV_STATE_REL;		//按键释放data->key = last_key;
}

编码器由于既有旋钮又有按钮,故相比键盘输入设备多了读取旋钮状态的部分代码。

static void encoder_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{static uint32_t last_key = 0;uint32_t act_key = key_scan(0);			//读取键值int8_t adc_num = adc_get_number();		//读取编码器增量,这里用adc采样分段量化进行模拟if(act_key != 0) 						//按键按下{switch(act_key) {case 4:							act_key = LV_KEY_ENTER;				//enter键encoder_state = LV_INDEV_STATE_PR;    //按钮按下,触发相应的输入事件break;case 1:act_key = LV_KEY_LEFT;				//left键encoder_diff = -1;					//通过按键触发使编码器增量-1encoder_state = LV_INDEV_STATE_REL;	//按钮未按下(实际上已按下但是无需响应)break;case 5:act_key = LV_KEY_RIGHT;				//right键    encoder_diff = 1;					//通过按键触发使编码器增量1encoder_state = LV_INDEV_STATE_REL;	//按钮未按下(实际上已按下但是无需响应)break;default:break;}last_key = act_key;}else if(adc_num != 0)					//编码器转动{encoder_diff = adc_num;				//增量为正会向下切换控件,增量为负会向上切换控件encoder_state = LV_INDEV_STATE_REL;}else									//既无按键按下,也无编码器增量{encoder_diff = 0;encoder_state = LV_INDEV_STATE_REL;}data->key = last_key;					//编码器键值data->enc_diff = encoder_diff;			//编码器增量data->state = encoder_state;			//编码器触发状态encoder_diff=0;							//将增量置为0,否则会一直触发
}

adc模拟编码器增量的代码如下

uint32_t adc_value;int8_t adc_get_number(void)
{int8_t ret =0;adc_value =adc_get_result(1);			//调节电位器,获取不同的ADC采样值if(adc_value < 400)adc_number = 1;else if(adc_value > 800 && adc_value < 1200)adc_number = 2;else if(adc_value > 1600 && adc_value < 2000)adc_number = 3;else if(adc_value > 2400 && adc_value < 2800)adc_number = 4;else if(adc_value > 3200 && adc_value < 3600)adc_number = 5;if(adc_number > adc_number_prev)ret = 1;else if(adc_number < adc_number_prev)ret = -1;adc_number_prev = adc_number;return ret;
}

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

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

相关文章

Linux第13步_安装“vim编辑器”及应用介绍

学习“磁盘重新分区”后&#xff0c;嵌入式Linux系统环境搭建进入安装“vim编辑器”这个环节。vim编辑器可以用来修改文件&#xff0c;在后期使用中&#xff0c;会经常用到。 1、安装“vim编辑器” 输入“sudo apt-get install vim回车”&#xff0c;就可以执行安装“vim编辑…

thinkphp学习03-url访问模式

多应用&#xff1a;http://serverName/index.php/应用/控制器/操作/参数/值…&#xff1b;单应用&#xff1a;http://serverName/index.php/控制器/操作/参数/值…&#xff1b; http://localhost:8506/index.php Contoller下新建Test.php <?php namespace app\controlle…

new和delete表达式的工作步骤

new表达式工作步骤 调用一个operator new库函数开辟未类型化的空间 void *operator new(size_t); 在为类型化的空间上调用构造函数&#xff0c;初始化对象的成员 返回相应类型的指针 delete表达式工作步骤 调用相应类型的析构函数,但析构函数并不能删除对象所在的空间&…

黑马程序员Java项目实战《瑞吉外卖》,轻松掌握springboot + mybatis plus开发核心技术的真java实战项目——第三部分

黑马程序员Java项目实战《瑞吉外卖》&#xff0c;轻松掌握springboot mybatis plus开发核心技术的真java实战项目——第三部分 1. 菜品管理的业务功能1.1 文件的上传和下载&#x1f647;‍♂️1.2 新增菜品1.3 接收页面提交的数据&#x1f647;‍♂️&#xff08;涉及两张表&a…

Long类型转换精度丢失问题解决

问题: 启动前端项目 页面传递的ID 和数据库保存的ID不一致 原因&#xff1a;给前端返回的id为long类型&#xff0c;在转换json传递到前端以后精度丢失&#xff0c;所以前端给我们的id也是丢失精度的id,不能查询数据。 因为js数字类型最大长度为16位&#xff0c;而java的long类…

spring动态控制定时任务

在spring框架中&#xff0c;对于简单的定时任务&#xff0c;可以使用 Scheduled 注解实现&#xff0c;在实际项目中&#xff0c;经常需要动态的控制定时任务&#xff0c;比如通过接口增加、启动、停止、删除定时任务&#xff0c;动态的改变定时任务的执行时间等。 我们可以通过…

android系列-init 挂载文件系统

1.init 挂载文件系统 //android10\system\core\init\main.cppint main(int argc, char** argv) {return FirstStageMain(argc, argv); } //android10\system\core\init\first_stage_init.cppint FirstStageMain(int argc, char** argv) {CHECKCALL(mount("tmpfs",…

dnSpy调试Web应用程序

文章目录 前言一、dnSpy是什么&#xff1f;二、如何使用dnSpy三、如何调试Web应用程序四、下载总结 前言 dnSpy是一个.NET程序集调试器和编辑器&#xff0c;主要用于调试和编辑没有源码的.NET程序集。 一、dnSpy是什么&#xff1f; dnSpy是一个.NET程序集调试器和编辑器&#…

IDEA 控制台中文乱码问题解决方法(UTF-8 编码)

设置 IDEA 编码格式 1&#xff1a;打开 IntelliJ IDEA>File>Setting>Editor>File Encodings&#xff0c;将 Global Encoding、Project Encoding、Default encodeing for properties files 这三项都设置成 UTF-8 2&#xff1a;将 vm option 参数改为&#xff1a; -…

Linux Capabilities 基础概念与基本使用

目录 1. Linux capabilities 是什么&#xff1f; 2. capabilities 的赋予和继承 线程的 capabilities Permitted* 允许 Effective* 有效 Inheritable* 遗传 Bounding&#xff08;集合&#xff09; Ambient 文件的 capabilities Permitted Inheritable Effective 3…

链表

目录 单链表 双链表 单链表 题目如下&#xff1a;模拟一个单链表&#xff0c;实现插入删除操作 解题代码 #include <iostream>using namespace std;const int N 100010;// head 表示头结点的下标 // e[i] 表示节点i的值 // ne[i] 表示节点i的next指针是多少 // idx …

墨墨智库正式上线:开启您的AI智慧之旅

在这个由数据驱动的时代&#xff0c;AI技术正迅速改变我们的工作和生活方式。有没有想过一个平台可以为您提供所有AI相关资源的便捷访问&#xff1f;这就是「墨墨智库」的使命。我们非常高兴地宣布&#xff0c;经过精心准备和期待&#xff0c;「墨墨智库」现已正式上线&#xf…

图像解析力测试

什么是图像解析力测试 图像解析力测试是衡量成像系统性能的关键指标之一,它决定了摄像头捕捉到的图像细节和清晰度。目前主流的图像解析力测试方法主要有TV line检测、MTF检测和SFR检测。 TV line检测主要用于主观测试,通过观察图像中的线条来评估解析力。然而,这种方法缺乏…

verilog readmemh readmemb

用法 $readmemh("hex_mem_file", mem, [start_address], [end_address]) $readmemb("bin_mem_file", mem, [start_address], [end_address])hex_mem_file 十六进制文本 空格分隔 bin_mem_file 二进制文本 空格分隔 mem 存储数组 start_address 起始地址 可…

学习笔记——C++一维数组

1&#xff0c;一维数组的定义方式 三种定义方式 1&#xff0c;数据类型 数组名[ 数组长度 ]&#xff1b; 2&#xff0c;数据类型 数组名[ 数组长度 ]{值1&#xff0c;值2&#xff0c;值3 ……}&#xff1b;//未说明的元素用0填补 3&#xff0c;数据类型 数组名[ ]{值1&…

Joplin配合teracloud进行多版本客户端分别笔记同步

最近瞎搜索joplin&#xff0c;意外在github上搜到plugins&#xff0c;插件仓库&#xff0c;里面有一个思维导图的插件我还是蛮喜欢的&#xff0c;结果下载后安装发现&#xff0c;我当前的Jopin的版本如下 &#xff08;Joplin 2.7.15 (prod, win32) 同步版本: 3 配置文件版本: 4…

MySQL练习-DDL语法练习

文章目录 1、数据库操作2、表操作3、DDL数据类型 突然想起来好久没写过SQL了&#xff0c;写一下SQL练习一下&#x1f60a; 个人写sql比较喜欢用小写&#x1f601; 什么是DDL&#xff1a;DDL是对数据库和表的操作 在这里练习DLL的时候先不添加约束&#xff0c;后面会把约束集中…

KVM虚拟化技术

在当今的云计算时代&#xff0c;虚拟化技术已经成为了企业和个人用户的首选。而在众多虚拟化技术中&#xff0c;KVM&#xff08;Kernel-based Virtual Machine&#xff09;虚拟化技术因其高性能、低成本和灵活性而备受青睐。本文将介绍KVM虚拟化技术的原理、特点以及应用场景。…

陀螺研究院发布《中国产业区块链生态图谱 2024版》

从发展实践来看&#xff0c;产业区块链在我国已历经了4年的高速发展&#xff0c;发展至今&#xff0c;我国区块链发展环境基本夯实&#xff0c;形成了技术突破与应用拓宽的创新土壤&#xff0c;围绕区块链为主体的产业链条不断纵深延伸&#xff0c;在基础设施支撑、融合创新拓展…

学习c语言,隐形类型转换,整形提升

把整形定义字符型的话&#xff0c;字符型指挥提取整形前8位&#xff0c;但是整形有32位&#xff0c;如果字符型最后一位为0全部补0&#xff0c;为1全部补1。