千家信息网

AWTK 中怎么实现一个 LCD 接口

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这期内容当中小编将会给大家带来有关AWTK 中怎么实现一个 LCD 接口,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、基于寄存器实现的 LCD在低端的嵌入式平台
千家信息网最后更新 2026年11月01日AWTK 中怎么实现一个 LCD 接口

这期内容当中小编将会给大家带来有关AWTK 中怎么实现一个 LCD 接口,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

一、基于寄存器实现的 LCD

在低端的嵌入式平台上,内存只有几十 KB,没有足够的内存使用 framebuffer,通常直接向寄存器中写入坐标和颜色数据。lcd_reg.inc 提供了基于寄存器实现的 LCD,用它实现不同平台的 LCD 时,只需要提供两个宏即可:

  • set_window_func 设置要写入颜色数据的区域,相对于每次设置坐标而言,可以极大提高工作效率。

  • write_data_func 写入颜色数据。

下面是 STMF103ze 上 LCD 的实现,这里把 set_window_func 定义为 TFT_SetWindow,把 write_data_func 定义为 TFT_WriteData:

#include "tftlcd.h"#include "tkc/mem.h"#include "lcd/lcd_reg.h"typedef uint16_t pixel_t;#define LCD_FORMAT BITMAP_FMT_BGR565#define pixel_from_rgb(r, g, b)                                                \  ((((r) >> 3) << 11) | (((g) >> 2) << 5) | ((b) >> 3))#define pixel_to_rgba(p)                                                       \  { (0xff & ((p >> 11) << 3)), (0xff & ((p >> 5) << 2)), (0xff & (p << 3)) }#define set_window_func LCD_Set_Window#define write_data_func LCD_WriteData_Color#include "base/pixel.h"#include "blend/pixel_ops.inc"#include "lcd/lcd_reg.inc"

基于寄存器实现的实现有几个限制:

  • 由于内存和 CPU 性能的问题,不提供任何类型的动画。

  • 由于读取 LCD 当前内容速度很慢,所以需要与底色进行混合时,由 GUI 自己处理 (APP 无需关心)。

  • 屏幕大时会出现闪烁。

在 AWTK 中,不再推荐此方法,基于片段帧缓冲实现的 LCD 是更好的选择。

二、基于片段帧缓冲实现的 LCD

在低端的嵌入式平台上,内存只有几十 KB,没有足够的内存创建一屏的帧缓冲,而使用基于寄存器的方式屏幕容易闪烁。

比较好的办法是,创建一小块帧缓冲,把屏幕分成很多小块,一次只绘制一小块。由于有脏矩形机制,除了打开新窗口时,在正常情况下,绘制速度仍然很快,可以有效的解决闪速问题。

lcd_mem_fragment.inc 提供了基于片段帧缓冲实现的 LCD,用它实现不同平台的 LCD 时,只需要提供两个宏即可:

  • set_window_func 设置要写入颜色数据的区域,相对于每次设置坐标而言,可以极大提高工作效率。

  • write_data_func 写入颜色数据。

下面是 STMF103ze 上 LCD 的实现,这里把 set_window_func 定义为 TFT_SetWindow,把 write_data_func 定义为 TFT_WriteData:

#include "tftlcd.h"#include "tkc/mem.h"#include "lcd/lcd_mem_fragment.h"typedef uint16_t pixel_t;#define LCD_FORMAT BITMAP_FMT_BGR565#define pixel_from_rgb(r, g, b)                                                \  ((((r) >> 3) << 11) | (((g) >> 2) << 5) | ((b) >> 3))#define pixel_to_rgba(p)                                                       \  { (0xff & ((p >> 11) << 3)), (0xff & ((p >> 5) << 2)), (0xff & (p << 3)) }#define set_window_func LCD_Set_Window#define write_data_func LCD_WriteData_Color#include "base/pixel.h"#include "blend/pixel_ops.inc"#include "lcd/lcd_mem_fragment.inc"

三、基于 framebuffer 实现的 LCD

这是在嵌入式平台上最常见的方式。一般有两个 framebuffer,一个称为 online framebuffer,一个称为 offline framebuffer。online framebuffer 是当前现实的内容,offline framebuffer 是 GUI 当前正在绘制的内容。lcd_mem_rgb565 提供了 rgb565 格式的 LCD 实现,lcd_mem_rgba8888 提供了 rgba8888 格式的 LCD 实现,它们都是在 lcd_mem.inc 基础上实现的,要增加新的格式也是很方便的。

下面是 STMF429 上 LCD 的实现:

extern u32 *ltdc_framebuf[2];#define online_fb_addr (uint8_t*)ltdc_framebuf[0]#define offline_fb_addr (uint8_t*)ltdc_framebuf[1]lcd_t* platform_create_lcd(wh_t w, wh_t h) {  return lcd_mem_rgb565_create_double_fb(w, h, online_fb_addr, offline_fb_addr);}

四、基于 vgcanvas 实现的 LCD

在支持 OpenGL 3D 硬件加速的平台上(如 PC 和手机),我们使用 nanovg 把 OpenGL 封装成 vgcanvas 的接口,在 vgcanvas 基础之上实现 LCD。lcd_vgcanvas.inc 将 vgcanvas 封装成 LCD 的接口,这里出于可移植性考虑,并没有直接基于 nanovg 的函数,而是基于 vgcanvas 的接口,所以在没有 GPU 时,如果 CPU 够强大,也是可以基于 agg/picasso 去实现的 LCD。

上述就是小编为大家分享的AWTK 中怎么实现一个 LCD 接口了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

平台 接口 内存 内容 寄存器 数据 颜色 缓冲 两个 坐标 屏幕 嵌入式 格式 片段 不同 低端 区域 只有 基础 效率 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 深圳九邦互联网科技有限公司 广州百单互联网科技有限公司 互联网 的科技创新 互联网科技美容 互联网科技英文翻译 互联网科技宣传片 移动互联网科技股 中化能源互联网科技招聘 互联网在线教育科技创业 工业互联网展湾科技股份有限公司 城市宝互联网科技有限公司 广州有谷有贝互联网科技有限公司 万物互联网智能科技 广州智享互联网科技 科技互联网公司两年变化 青岛易易互联网科技 平安好医生打造互联网科技医疗 互联网企业和网络科技有限公司 科技美学互联网 艺术 互联网科技快速发展优美句子 耶加雪菲 广州慧亚互联网科技怎么样 互联网大会黑科技排名 互联网媒体平台算高科技产业 宇信科技在杭州互联网排第几 福建互联网展示科技馆设计 东风日产互联网科技公司叫什么 科技美学互联网 艺术 伍佰万互联网科技是干嘛的 中国主要互联网科技公司
0