查看: 685|回复: 0
打印 上一主题 下一主题

[评测分享] 【Avnet | NXP FRDM-MCXN947试用活动】测评7-LVGL移植触摸屏

[复制链接]
  • TA的每日心情
    开心
    4 天前
  • 签到天数: 62 天

    连续签到: 1 天

    [LV.6]常住居民II

    跳转到指定楼层
    楼主
    发表于 2024-11-29 10:16:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    分享到:

    背景

    前面的帖子已经实现了触摸屏的触摸效果,但是没有接入到 LVGL,现在开干。

    LVGL 移植触摸屏详解

    1. 对应的输入设备文件

    LVGL 接入输入设备,可以参考其自带的示例,即 examples/porting/lv_port_indev_template.c 文件和对应的头文件。咱们先把这两个文件拷贝出来,放到 bsp/lvgl_port/ 目录下,并重命名为 lv_port_indev.clv_port_indev.h

    2. 修改 lv_port_indev.c/.h

    这两个文件都使用 #if 0 括了起来,需要改成 #if 1 使能,然后包含正确的头文件,如下图所示,仅包含 lv_port_indev.htouch.h 文件即可。

    Pastedimage20241129001239.png

    3. 关键函数 lv_port_indev_init()

    文件 lv_port_indev.c 文件中的 lv_port_indev_init() 函数非常关键,从它注册输入设备到 LVGL。它支持的输入设备有多种类型:

    • 最常见的是触摸屏 LV_INDEV_TYPE_POINTER
    • 鼠标,对应 LV_INDEV_TYPE_MOUSE
    • 键盘,对应 LV_INDEV_TYPE_KEYPAD
    • 编码器,对应 LV_INDEV_TYPE_ENCODER
    • 按键,对应 LV_INDEV_TYPE_BUTTON

    这里只需要关注触摸屏,其他的全部用 #if 0 括起来。

    最终 lv_port_indev_init() 函数简化如下:

    void lv_port_indev_init(void) { static lv_indev_drv_t indev_drv; /*------------------ * Touchpad * -----------------*/ /*Initialize your touchpad if you have*/ touchpad_init(); /*Register a touchpad input device*/ lv_indev_drv_init(&indev_drv); indev_drv.type = LV_INDEV_TYPE_POINTER; indev_drv.read_cb = touchpad_read; indev_touchpad = lv_indev_drv_register(&indev_drv); }

    从这个代码片段看出,我们只需要实现 touchpad_init()touchpad_read() 函数即可。

    4. touchpad_init()

    这个函数的实现非常简单,调用我们之间写好的触摸屏初始化函数 TP_Init() 即可。

    static void touchpad_init(void) { /*Your code comes here*/ // NOTE: 触摸屏已经在别的地方初始化了 TP_Init(); }

    5. touchpad_read()

    这个函数是 LVGL 提供的模版函数,我们不用做什么改动,只需要实现其中的 touchpad_is_pressed()touchpad_get_xy() 即可。

    从下面代码可以看出, touchpad_is_pressed() 只需要调用 TP_Scan() ,如果有触摸则发回非0值即可,如果没有触摸则返回0,最终 touchpad_is_pressed() 返回逻辑值。

    touchpad_get_xy() 更简单,直接调用 TP_Get_XY() 返回最近一次触摸的坐标即可。

    /*Will be called by the library to read the touchpad*/ 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; /*Save the pressed coordinates and the state*/ if(touchpad_is_pressed()) { touchpad_get_xy(&last_x, &last_y); data->state = LV_INDEV_STATE_PR; } else { data->state = LV_INDEV_STATE_REL; } /*Set the last pressed coordinates*/ data->point.x = last_x; data->point.y = last_y; } /*Return true is the touchpad is pressed*/ static bool touchpad_is_pressed(void) { /*Your code comes here*/ // TODO: 从这里开始一次扫描,获取触摸屏状态 if (TP_Scan()) { return true; } return false; } /*Get the x and y coordinates if the touchpad is pressed*/ static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y) { /*Your code comes here*/ TP_Get_XY((uint16_t*)x, (uint16_t*)y); }

    演示

    运行 LVGL 几个示例程序,比之前的屏幕模组厂商的示例程序丝滑多了。主要是LVGL刷屏采用了 DMA,比逐个打点方式快多了。

    视频参见B站:

    回复

    举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 4/5 下一条

    【预约参会三重礼】2025 瑞萨电子工业以太网技术日
    2025瑞萨电子工业以太网技术日聚焦工业4.0核心需求,为工程师与企业决策者提供实时通信技术最佳解决方案,通过案例剖析、现场演示、动手实践,全方位解读瑞萨电子最新实时通信技术解决方案,洞察行业发展趋势,助力企业高效开发更具竞争力工业以太网产品。

    查看 »

    手机版|小黑屋|与非网

    GMT+8, 2025-4-29 19:04 , Processed in 0.131865 second(s), 24 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.5

    Copyright © 2001-2024, Tencent Cloud.