LVGL学习之初始化和屏幕旋转

背景

手里有一块ESP32-S2-HMI-DevKit-1开发板,是乐鑫基于ESP32-S2模组开发的HMI人机交互方案开发板;
一边学习ESP32开发的过程中,也顺带学习一下LVGL图形库;
遇到的第一个问题:
官方提供的例程都是横屏显示的,我想切换为竖屏显示,就这么简单。

开发环境

  • Windows 10
  • VS Code + esp-idf-v4.3
  • ESP32-S2-HMI-DevKit-1开发板

正文

1. 关于开发板的LVGL初始化

首先,开发板Demo中的main函数里调用了lvgl_init()的函数,

这个函数定义在lvlg_port.c文件中, 在其源码里, 实现了上面所列文档中的大部分步骤:

  • Call lv_init()
  • Create a draw buffer: LVGL will render the graphics here first, and send the rendered image to the display.
  • Implement and register a function which can copy the rendered image to an area of your display.
  • Implement and register a function which can read an input device.
  • Call lv_timer_handler() periodically every few milliseconds in the main while(1) loop or in an operating system task. It will redraw the screen if required, handle input devices, animation etc.

2. 关于屏幕旋转

LVGL官方在线手册-关于Rotation中有描述:
在这里插入图片描述
翻译并提炼一下:

  • 设置sw_rotate标志为1, 可软件实现屏幕旋转
  • LV_DISP_ROT_NONE, LV_DISP_ROT_90, LV_DISP_ROT_180, or LV_DISP_ROT_270 这些宏定义代表了旋转角度
  • 程序运行时, 可通过lv_disp_set_rotation(disp, rot)函数来改变旋转角度

3. 代码实现

ESP32的LVGL初始化过程都在lvgl_init()函数中,可追溯进去了解;

sw_rotate和旋转角度实际上是lv_disp_drv_t结构体中的一个成员,
此结构体的定义在…/lv_hal/lv_hal_disp.h文件中;

/**
* Display Driver structure to be registered by HAL
*/
typedef struct _disp_drv_t {

lv_coord_t hor_res; /**< Horizontal resolution. */
lv_coord_t ver_res; /**< Vertical resolution. */

/** Pointer to a buffer initialized with `lv_disp_buf_init()`.
* LVGL will use this buffer(s) to draw the screens contents */
lv_disp_buf_t * buffer;

#if LV_ANTIALIAS
uint32_t antialiasing : 1; /**< 1: antialiasing is enabled on this display. */
#endif
uint32_t rotated : 2;
uint32_t sw_rotate : 1; /**< 1: use software rotation (slower) */
......
...
.
} lv_disp_drv_t;

lvgl_init()函数中,可以找到lv_disp_drv_t结构体定义的一个变量disp_drv,修改disp_drv这两个参数的值即可实现旋转;

...
/*Create a display*/
lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
disp_drv.buffer = &disp_buf;
disp_drv.flush_cb = lvgl_flush_cb;
disp_drv.sw_rotate = 1;   // add for rotation
disp_drv.rotated = LV_DISP_ROT_90;   // add for rotation
lv_disp_drv_register(&disp_drv);
...

4. 关于运行时旋转屏幕

可以在运行过程中,某个条件触发时,
调用lv_disp_set_rotation(NULL, LV_DISP_ROT_NONE);函数即可旋转到第二个参数的角度。


参考

  • 12
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
在使用 LVGL(LittlevGL)框架进行按键初始化时,你可以按照以下步骤进行操作: 1. 创建一个按键对象:使用 `lv_btn_create(parent, copy)` 函数创建一个按钮对象,并将它添加到指定的父对象上。`parent` 是父对象的指针,`copy` 是要复制的按钮对象(可选,如果不需要复制则传入 `NULL`)。 2. 设置按钮的位置和大小:使用 `lv_obj_set_pos(btn, x, y)` 和 `lv_obj_set_size(btn, width, height)` 函数设置按钮的位置和大小。`btn` 是按钮对象的指针,`x` 和 `y` 是按钮的左上角坐标,`width` 和 `height` 是按钮的宽度和高度。 3. 设置按钮的样式:使用 `lv_btn_set_style(btn, type, style)` 函数设置按钮的样式。`btn` 是按钮对象的指针,`type` 是样式类型(例如 `LV_BTN_STYLE_REL`, `LV_BTN_STYLE_PR`, `LV_BTN_STYLE_TGL_REL` 等),`style` 是样式对象的指针。 4. 设置按钮的回调函数:使用 `lv_btn_set_action(btn, type, callback)` 函数为按钮设置回调函数。`btn` 是按钮对象的指针,`type` 是事件类型(例如 `LV_EVENT_CLICKED`, `LV_EVENT_LONG_PRESSED` 等),`callback` 是回调函数的指针。 5. 添加按键事件处理:使用 `lv_obj_set_event_cb(btn, event_cb)` 函数为按钮添加事件处理函数。`btn` 是按钮对象的指针,`event_cb` 是事件处理函数的指针。 6. 最后,记得在主循环中调用 `lv_task_handler()` 函数以处理 LVGL 的任务。 这些是按键初始化的基本步骤,你可以根据自己的需求进行进一步的设置和定制。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值