lvgl8.x 对接实体按键驱动

1. lvgl 输入设备种类

实体按键属于 的输入设备中的一种,所以对接外部的硬件实体按键实际上就是为 添加输入设备。为 添加输入设备需要在 这个 文件中完成,注意这个文件并不存在于 lvgl 源码文件夹下,而是位于 文件夹下,在这个目录下官方为我们准备好了对接模板文件,我们对这个模板文件进行修改即可

lvgl 的输入设备共有以下五种:
触摸板,例如电容屏、电阻屏等
鼠标
键盘
编码器
外部按键

开发板目前现有的驱动是 和 这两者其实都是外部或是说显示屏周边的按键,两者的的区别是, 属于独立按键而 属于矩阵键盘。

2. lvgl 接入 Button 按键

**Button 按键特殊注意点:**在 的设计思想上 按键用于在没有触摸屏的情况下,为了点触软件按钮,而设计的与软件按钮对应的周边(比如硬件按钮位于软件按钮正上方,正下方,左方或右方)硬件实体按键。

**Button 按键如何工作呢:**通过 lvgl 的设计可以不难发现 并没有把 按键单纯作为一个按键,而是将软件按键一一对应的实体按键点按产生的电平变化转化为在屏幕某一个坐标上的点按,换句话说 将 按键模拟成了触摸屏,而模拟点按的坐标就是你想控制的那个软件按键在屏幕上显示的中心坐标(注意中心坐标需要我们根据我们要控制的软件按键坐标自行计算好,并提供给 ,我们计算的坐标必须位于软件按键的中心,不然会发现无法控制,软件按键不会随硬件按键按下而跟着按下)。

所以按钮是指屏幕旁边的外部 按钮,它们被分配给屏幕的特定坐标。如果一个按钮被按下,它将模拟在指定坐标上的按下。(类似于触摸板)将按钮分配给坐标使用
, 应该像下面这样:

2.1 修改输入设备初始化函数

  • 这个函数可以用于编写按键相关的硬件 IO 初始化相关代码,如果硬件 IO 初始化已经在专门统一的驱动中已经初始化,这个函数可以不使用,留空或不调用均可。
  • 初始化管理输入设备的结构体。
  • 指定我们使用的输入设备类型。
  • 指定用于读取按键状态的函数。
  • 将实体按键注册到 中。
  • 将实体按键映射到软件按键所在的屏幕中心坐标,并将坐标指定给 ,注意中心坐标需要我们根据我们要控制的软件按键坐标在这里自行计算好,并提供给 ,我们计算的坐标必须位于软件按键的中心,不然会发现无法控制,软件按键不会随硬件按键按下而跟着按下)具体如下代码块。

2.2 修改按键状态读取相关函数

注意这里主要编写完善 这个判断物理按键是否被按下的函数,这个函数可以通过 id 来区分每一个物理按键,也就是说可以将所有物理按键的读取都放置在这里实现,实现之后 可以通过 id 进行逐个读取。
这里需要实现 的就是获取硬件 IO 的电平,并将电平状态对应为按键的或

2.3 创建一个被控按键

这样独立的 Button 物理按键就可以控制 lvgl 的软件按键了,lvgl 的软件按键会随着物理按键的按下而按下,并呈现相应的动画显示效果。

3. lvgl 接入 Keypad 键盘

前面已经说到 属于矩阵键盘,它与 button 独立按键的区别是可以通过返回不同的键值来区分控制的软件按键(换句话说就是通过不同的键值(事件)来控制不同的软件按键, 按键只有两个键值(事件)就是 和 ),而不需要像 独立按键那样给每个每个物理按键分配控制软件按键在屏幕上显示的中心坐标来区分控制。

3.1 修改输入设备初始化函数

因为这里需要对接的是 (矩阵键盘),所以我们将 模板文件中
初始化函数与 无相关的内容(比如触摸屏,鼠标,编码器等)先注释(或使用条件编译进行隔离编译),留下需要的 部分,如下图所示。

注意这里主要编写完善 这个判断某个物理按键是否被按下的函数,这个函数可以通过读取不同的硬件 IO 来区分每一个物理按键,**这里需要实现的就是获取硬件 IO 的电平,并将电平状态对应为某个按键键值(事件)并将事件返回给 。

3.3 创建被控按键

这里需要使用 函数创建一个控件(或者叫做对象)组(),这是 矩阵键盘与 button 按键不同的地方,下面详细说明为什么需要创建组。
我们可以试着想象这样的一个场景,当我们的屏幕上存在较多的显示组件需要控制但是具备的物理按键较少时,这时我们就无法使用按键来控制所有的控件修改控件的内容,这时候我们就可以创建一个控件组,并将需要被控制的控件都添加到这个控件组中, 会在这个控件组中进行控件轮流焦点转换来实现选中不同的控件,这时我们就可以专门使用一个按键进行组中控件的焦点轮流转换,其他按键则用于对控件内容的修改等操作。

3.4 group 的概念

通过上述的对接我们知道 相比, 比较特殊,光移植完还不行,需要使用的话,还需要

需要使用按键控制一组对象,需要将要使用键盘或编码器控制的对象添加到组中。在每一组中都有一个被聚焦的对象接收按下的按键产生的事件或编码器产生的动作。例如,如果一个文本区域是集中的,您按键盘上的某个字母,键将被发送并插入到文本区域。类似地,如果一个滑块被聚焦,并且你按下向左或向右的箭头,滑块的值将会改变。这些操作的前提是需要将输入设备与组关联起来。一个输入设备只能将密钥发送给一个组,但是一个组也可以接收来自多个输入设备的数据。要创建组,请使用 创建好组之后向组添加对象,添加对象使用 。使用 将组与输入设备关联,其中 是 的返回值。

与 相关有一些预定义的键有特殊的含义,如下:

下一个对象
关注前一个对象
触发LV_EVENT_PRESSED/CLICKED/LONG_PRESSED等事件
增加价值或向上移动
降低价值或向下移动
增加价值或向右移动
减少数值或向左移动
关闭或退出(例如关闭下拉列表)
删除(例如文本区域右边的一个字符)
删除左边的字符(例如在文本区域)
转到开始/顶部(例如在文本区域)
转到最后(例如在文本区域)
最重要的特殊键是 , 和 。
在 函数中,您应该将一些键转换为这些特殊的键,以便在组中导航并与所选对象交互。只使用 就足够了,因为大多数对象都可以用它们完全控制。对于编码器,您应该只使用 和 。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年1月19日
下一篇 2022年1月19日

相关推荐