网站模板下载公司的网站怎么建设

张小明 2025/12/30 8:30:02
网站模板下载,公司的网站怎么建设,黑糖主题2.0wordpress,软件公司排名国内LVGL9 双物理屏幕驱动入门教程 下面以 C LVGL v9 为例#xff0c;介绍如何在一个 MCU 上同时驱动两个独立的物理屏幕#xff08;两个 lv_display_t#xff09;#xff0c;并在每个屏上加载自己的界面。示例代码严格按照工程中 lvgl__lvgl 组件#xff08;LVGL v9 原生 AP…LVGL9 双物理屏幕驱动入门教程下面以C LVGL v9为例介绍如何在一个 MCU 上同时驱动两个独立的物理屏幕两个lv_display_t并在每个屏上加载自己的界面。示例代码严格按照工程中lvgl__lvgl组件LVGL v9 原生 API例如lv_display_create、lv_display_set_buffers、lv_screen_load等来写再按实际硬件做适配。一、总体思路LVGL v9 原生 API每块物理屏 一个显示控制器 (lv_display_t)使用lv_display_create(hor_res, ver_res)创建显示对象使用lv_display_set_flush_cb(disp, my_flush_cb)绑定刷新回调使用lv_display_set_buffers(disp, buf1, buf2, buf_size, LV_DISPLAY_RENDER_MODE_*)绑定帧缓冲每个显示器有自己的根 Screen用lv_obj_create(NULL)创建 Screen根对象用lv_screen_load(screen)把 Screen 设置为当前显示器的活动 Screen与lv_display_set_default(disp)配合使用一个lv_timer_handler()轮询即可所有显示器共用一套 LVGL 任务处理。二、初始化两个显示器Display假设有两块 240×320 的屏幕各自有独立的刷新函数my_flush_cb1/my_flush_cb2。#includelvgl.h#defineSCREEN1_HOR_RES240#defineSCREEN1_VER_RES320#defineSCREEN2_HOR_RES240#defineSCREEN2_VER_RES320#defineDISP_BUF_LINES20staticlv_display_t*disp1;staticlv_display_t*disp2;/* 屏幕1 刷新回调LVGL v9px_map 是 uint8_t* 原始像素 */staticvoidmy_flush_cb1(lv_display_t*disp,constlv_area_t*area,uint8_t*px_map){LV_UNUSED(disp);/* TODO: 把 px_map 中的像素按 area-x1..x2, area-y1..y2 写入屏幕1 *//* 刷新结束后必须调用*/lv_display_flush_ready(disp);}/* 屏幕2 刷新回调 */staticvoidmy_flush_cb2(lv_display_t*disp,constlv_area_t*area,uint8_t*px_map){LV_UNUSED(disp);/* TODO: 把 px_map 写入屏幕2 */lv_display_flush_ready(disp);}voidgui_dual_disp_init(void){lv_init();/* -------- 显示器1创建 display 并绑定缓冲和刷新回调 -------- */disp1lv_display_create(SCREEN1_HOR_RES,SCREEN1_VER_RES);/* 计算缓冲区大小PARTIAL 渲染模式按行数 * color_size */uint32_tbuf1_sizeSCREEN1_HOR_RES*DISP_BUF_LINES*lv_color_format_get_size(lv_display_get_color_format(disp1));staticuint8_tbuf1_a[SCREEN1_HOR_RES*DISP_BUF_LINES*4];// 预留足够字节可按 buf1_size 调整staticuint8_tbuf1_b[SCREEN1_HOR_RES*DISP_BUF_LINES*4];lv_display_set_flush_cb(disp1,my_flush_cb1);lv_display_set_buffers(disp1,buf1_a,buf1_b,buf1_size,LV_DISPLAY_RENDER_MODE_PARTIAL);/* -------- 显示器2同样方式创建 -------- */disp2lv_display_create(SCREEN2_HOR_RES,SCREEN2_VER_RES);uint32_tbuf2_sizeSCREEN2_HOR_RES*DISP_BUF_LINES*lv_color_format_get_size(lv_display_get_color_format(disp2));staticuint8_tbuf2_a[SCREEN2_HOR_RES*DISP_BUF_LINES*4];staticuint8_tbuf2_b[SCREEN2_HOR_RES*DISP_BUF_LINES*4];lv_display_set_flush_cb(disp2,my_flush_cb2);lv_display_set_buffers(disp2,buf2_a,buf2_b,buf2_size,LV_DISPLAY_RENDER_MODE_PARTIAL);}提示工程里的lvgl__lvgl组件使用的就是这套 v9 API见lv_display.h、lcd_stm32_guide.rst等lv_disp_drv_t/lv_disp_draw_buf_t已被新的lv_display_*API 取代老名字只是通过lv_api_map_v8.h做了兼容映射。三、可选为每块屏单独配置触摸输入如果两块屏都要触控需要两个lv_indev_t并分别绑定到disp1/disp2v9 原生用lv_indev_set_display你工程里也可以继续用兼容宏。staticlv_indev_t*indev1;staticlv_indev_t*indev2;/* 触摸读取回调1 */staticvoidmy_touch_read1(lv_indev_drv_t*drv,lv_indev_data_t*data){// TODO: 读取触摸屏1坐标填充>}/* 触摸读取回调2 */staticvoidmy_touch_read2(lv_indev_drv_t*drv,lv_indev_data_t*data){// TODO: 读取触摸屏2坐标}voidgui_dual_input_init(void){/* 屏幕1输入 */staticlv_indev_drv_tindev_drv1;lv_indev_drv_init(indev_drv1);indev_drv1.typeLV_INDEV_TYPE_POINTER;indev_drv1.read_cbmy_touch_read1;indev1lv_indev_drv_register(indev_drv1);lv_indev_set_display(indev1,disp1);// 绑定到显示器1/* 屏幕2输入 */staticlv_indev_drv_tindev_drv2;lv_indev_drv_init(indev_drv2);indev_drv2.typeLV_INDEV_TYPE_POINTER;indev_drv2.read_cbmy_touch_read2;indev2lv_indev_drv_register(indev_drv2);lv_indev_set_display(indev2,disp2);// 绑定到显示器2}四、为每个显示器创建并加载 Screen关键点是在创建 Screen 或控件前先用lv_disp_set_default(dispX)切换当前显示器或者用lv_disp_get_scr_act(disp)拿到该显示器的根对象。staticlv_obj_t*scr1;staticlv_obj_t*scr2;staticvoidcreate_screens_for_dual_display(void){/* 显示器1的界面 */lv_disp_set_default(disp1);// 切换当前默认显示器scr1lv_obj_create(NULL);// 新建一个 Screen根对象lv_obj_set_style_bg_color(scr1,lv_color_hex(0x000000),0);lv_scr_load(scr1);// 或lv_disp_load_scr(disp1, scr1);// 在屏幕1上创建控件lv_obj_t*label1lv_label_create(scr1);lv_label_set_text(label1,Hello, Display 1);lv_obj_align(label1,LV_ALIGN_CENTER,0,0);/* 显示器2的界面 */lv_disp_set_default(disp2);// 切换到第二个显示器scr2lv_obj_create(NULL);lv_obj_set_style_bg_color(scr2,lv_color_hex(0x202020),0);lv_scr_load(scr2);// 或lv_disp_load_scr(disp2, scr2);lv_obj_t*label2lv_label_create(scr2);lv_label_set_text(label2,Hello, Display 2);lv_obj_align(label2,LV_ALIGN_CENTER,0,0);}也可以不调用lv_scr_load()而是使用lv_disp_load_scr(disp1,scr1);lv_disp_load_scr(disp2,scr2);效果是一样的只是更明确指定了要加载到哪个显示器。五、在某个屏上切换界面可选带动画如果某个物理屏需要在多个界面之间切换比如副屏加载不同的菜单可以在对应的disp上用lv_scr_load或lv_scr_load_anim。// 为屏幕2预先创建另一个界面staticlv_obj_t*scr2_altNULL;staticvoidcreate_alt_screen_for_disp2(void){lv_disp_set_default(disp2);scr2_altlv_obj_create(NULL);lv_obj_set_style_bg_color(scr2_alt,lv_color_hex(0x003366),0);lv_obj_t*labellv_label_create(scr2_alt);lv_label_set_text(label,Display 2 - ALT);lv_obj_align(label,LV_ALIGN_CENTER,0,0);}/* 在某个事件中调用这个函数 */voidswitch_disp2_to_alt(void){if(scr2_altNULL){create_alt_screen_for_disp2();}lv_disp_set_default(disp2);// 确保当前默认显示器是第二个// 直接切换// lv_scr_load(scr2_alt);// 或使用带动画的切换lv_scr_load_anim(scr2_alt,LV_SCR_LOAD_ANIM_MOVE_LEFT,300,0,false);}如果你已经有自己的封装比如SwitchToScreenWithAnim只要在调用前先lv_disp_set_default(dispX)再调用你自己的封装即可。六、主循环共享lv_timer_handler无论有几个显示器、多少个 Screen主循环只需要一个lv_timer_handler()voidapp_main(void){gui_dual_disp_init();gui_dual_input_init();// 如有触摸create_screens_for_dual_display();while(1){lv_timer_handler();// LVGL 9 对应的处理函数delay_ms(5);// 根据系统换成 vTaskDelay / HAL_Delay}}七、常见注意事项内存占用两块 240×320×16bpp 的屏如果每块屏用 1 个SCREEN_HOR_RES * 20的缓冲区大约每块缓冲区240 * 20 * 2 byte ≈ 9.6 KB两块 ≈ 19 KB不含 LVGL 内部堆和控件开销如果内存紧张可以减少缓冲区高度例如*10行使用单缓冲second buffer NULL多线程 / RTOS在 FreeRTOS / ESP-IDF 下通常会用一个 GUI 任务任务里循环调用lv_timer_handler()其他任务通过消息队列或事件向 GUI 任务请求界面更新避免多任务同时操作 LVGL不同分辨率 / 方向每个显示器可以有自己的hor_res/ver_res。需要旋转时可使用disp_drv.sw_rotate和disp_drv.rotated若硬件不支持旋转。输入设备绑定一个输入设备可以指定绑定到某个lv_disp_t这样同一个坐标系只作用在对应的屏幕上lv_indev_set_disp(indev, disp)。通过以上步骤就可以在 LVGL9 中同时驱动两个物理屏幕并在每个屏上加载不同的界面、独立处理输入。如果你已经有单屏工程只需要再注册一个lv_disp_drv_t和flush_cb作为第二块屏为第二块屏创建自己的 Screen 并lv_disp_load_scr(disp2, scr2)保持原有lv_timer_handler()循环不变即可完成双屏扩展。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做视频网站 带宽多少才合适wordpress生成微信小程序

深入了解Tree Widget 1. 引言 Tree Widget主要用于展示具有层次结构的数据。GtkTree 是一种垂直容器,用于存放 GtkTreeItem 类型的小部件。它与 GtkList 有相似之处,二者都直接继承自 GtkContainer,GtkContainer 的方法在这两种小部件上的工作方式相同。但不同的是,GtkTr…

张小明 2025/12/23 3:47:45 网站建设

沈阳市网站建设wordpress文章修改大小

本文围绕变形监测技术的革新,特别强调北斗系统在国内应用的优势。随着技术的迅猛发展,GNSS形变监测及单北斗GNSS应用逐渐成为关键领域。在基础设施安全监测方面,北斗形变监测传感器提供了毫米级的精准定位能力,确保了实时数据信息…

张小明 2025/12/23 3:45:39 网站建设

承德网站建设怎么做怎么做钓鱼网站生成器

量子谐振子与光的正则量子化:理论与应用 1. 量子谐振子的狄拉克形式主义 1.1 量子谐振子的基本特征 量子谐振子(QHO)具有一个重要特征,即存在最小能量(基态能量)$E_0 = \frac{1}{2}\hbar\omega$,对应于特定方程中的$n = 0$情况。这一基态能量的存在是量子谐振子区别于…

张小明 2025/12/23 3:44:37 网站建设

做网站淘宝条形码怎样建立自己的销售网站

开源项目架构设计终极指南:从单体到微服务的演进之路 【免费下载链接】GmsCore Free implementation of Play Services 项目地址: https://gitcode.com/GitHub_Trending/gm/GmsCore GmsCore作为Play Services的免费替代实现,其架构演进历程为开源…

张小明 2025/12/23 3:43:34 网站建设

网站建设的主要工作流程为什么不能用来名字做网站名

探索AI应用架构师增量学习应用实践的新边界:从技术选型到落地的全链路思考 摘要/引言 当你花费数周训练的AI模型上线后,却发现它对新数据的适应性越来越差——电商推荐系统推荐的商品总跟不上用户最新的购物兴趣,工业质检模型对新出现的缺陷类型视而不见,金融风控模型无法…

张小明 2025/12/23 3:42:32 网站建设

江苏优化网站哪家好网站设计可以吗

【摘要】OpenAI以高校批量采购推动AI合规落地,叠加政策、技术、市场共振,AI教育从工具走向工作流与规模化变现。引言生成式AI进入教育行业,最先突破的往往不是课堂,而是组织的态度与流程。过去一年里,许多高校对AI的立…

张小明 2025/12/23 3:41:30 网站建设