HLK-W801-LVGL8之横屏显示

  • 前言
  • 剖析正常竖屏显示
  • 剖析横屏显示
  • 显示效果


前言

前几天已经完成了关于W801移植LVGL,实现效果如下图所示:

PictureSelector横屏_横屏


图片是竖屏显示的,因为屏幕就是240x320 分辨率的,如果要横屏显示呢,即把屏幕看成是320x240的该如何配置。原来本想直接通过配置LVGL中的一些配置参数来达到这个目的,但实际操作起来有几个问题,LVGL中可以通过sw_rotate=1,rotated=LV_DISP_ROT_90来达到旋转目的,而实际效果确实软件实现带来的帧率低和CPU占有高,且图片旋转后也只能显示240*320效果,不能宽屏显示。所以这里在思考如何利用ILI9325里面的显示驱动功能来实现(即ILI9235驱动配置显示旋转90°)

剖析正常竖屏显示

如图所示,F1区域竖屏显示:

PictureSelector横屏_ui_02


屏幕水平H :垂直V = 240 :320

屏幕原点坐标 O1(0,0)

在lvgl的接口函数flush需实现区域填充,具体详见 LCD驱动 这里说明基本步骤:

1)配置Entry Mode (R03h)

Bit3 AM,Bit4:5=ID0:1

AM=0,ID0:1=3

PictureSelector横屏_ui_03


2) F1区域填充时Window Area((R50h, R51h, R52h, R53h) 和起始坐标(R20h,R21h)

  • 设置填充区域起始/终止坐标
    reg :
    0x50 set h1
    0x51 set h2
    0x52 set v1
    0x53 set v2
  • 设置起始坐标地址
    reg:
    0x20 set h1
    0x21 set v1

剖析横屏显示

如图所示,F1区域横屏显示:

PictureSelector横屏_单片机_04


横屏显示看作将屏幕顺时针旋转90°,但这时屏幕水平X:垂直Y= 320 :240

显示起点坐标变成O2(0,0)

在lvgl的接口函数flush需实现区域填充,

1)配置Entry Mode (R03h)

Bit3 AM,Bit4:5=ID0:1

AM=1,ID0:1=2 ,这里设置ORG=1,此时起点坐标由O1(0,0)变成O2(0,0)

PictureSelector横屏_PictureSelector横屏_05


2)F1区域填充时Window Area((R50h, R51h, R52h, R53h) 和起始坐标(R20h,R21h)

这里是关键点:因为填充区域的起点和终点仍然由屏幕原点坐标O1(0,0)决定,所以当调整ORG=1后,O2坐标系所填充的区域需要转换成O1坐标系

如图F1区域的起点和终点坐标O2(x1,y1),O2(x2,y2),

在配置window area时需配置为 O1(h1,v1),O1(h2,v2)

根据屏幕的坐标关系可以得出:

  • 设置填充区域起始/终止坐标
    reg :
    0x50 set h1=239-y2
    0x51 set h2=239-y1
    0x52 set v1=x1
    0x53 set v2=x2
  • 设置起始坐标地址
    reg:
    0x20 set x1
    0x21 set y1
    对于flush接口实现如下图:

显示效果

PictureSelector横屏_单片机_06


这里注意触摸的坐标也需要转换一些坐标:

O1(h3,v3) -> O2(x3=v3,y3=239-h3)