ili9325屏幕横屏竖屏方向

首先这个屏幕默认就是竖着的,他的240方向排列着子像素  是行扫描方向也就是x轴,这个是无法改变的。 所以对于显示驱动来书  有三个寄存器会影响显示的扫描顺序

     // R1是SS:选择源极驱动器输出的移位方向。 这里以竖屏,排线在下确定说原点位置 屏幕在240分辨率方向是三像素,子像素排列在240方向
        //  当 SS = 0 时,输出的移位方向是从 S1 到 S720 s1在右边  s720在左边
        //  当 SS = 1 时,输出的移位方向是从 S720 到 S1。

             LCD_WriteReg(LCD_REG_1, 0x0000);  // ss sm bit 240方向扫描方向(左右) 0100 从右往左/0000从左往右
             // scan line原点设置(320方向上下) a700在上/2700原点在下
             LCD_WriteReg(LCD_REG_96, 0x2700); // scan line原点设置(320方向上下) a700在上/2700原点在下

        /* set GRAM write direction and BGR = 1 */
        /* I/D=00第四位  (Horizontal : increment, Vertical : decrement) */
         /* AM=1 第三位 (address is updated in vertical writing direction) */
        /* 设置 GRAM 写入方向和 BGR = 1 */
        /* I/D=00第四位(水平:递增,垂直:递减)*/
        /* AM=1(垂直写入方向更新地址)*/
             LCD_WriteReg(LCD_REG_3, 0x1000 | 0x0020 | 0x0010 | 0x0000); // RGB&GBR/左右0010/0000、上下0000/0020、水平垂直0000/0008 如果要用lvgl横屏,那么给lvgl写个填充disp的函数要交换xy

 

如果图像是镜像,可以调整reg1根reg96

reg3跟lvgl的disp驱动写法密切相关,这限制了lvgl的屏幕方向,如果想旋转lvgl的显示  ,可以使用软件旋转。或者对调起点xy坐标

 

 

在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_ROT_NONELV_DISP_ROT_90LV_DISP_ROT_180, or LV_DISP_ROT_270 这些宏定义代表了旋转角度


lv_disp_drv_register(&disp_drv);

 

 

最后是我试出来的lvgl横屏的设置

            LCD_WriteReg(LCD_REG_1, 0x0100);  // ss sm bit 240方向扫描方向(左右) 0100 从右往左/0000从左往右
             // scan line原点设置(320方向上下) a700在上/2700原点在下
             LCD_WriteReg(LCD_REG_96, 0x2700); // scan line原点设置(320方向上下) a700在上/2700原点在下

        /* set GRAM write direction and BGR = 1 */
        /* I/D=00第四位  (Horizontal : increment, Vertical : decrement) */
         /* AM=1 第三位 (address is updated in vertical writing direction) */
        /* 设置 GRAM 写入方向和 BGR = 1 */
        /* I/D=00第四位(水平:递增,垂直:递减)*/
        /* AM=1(垂直写入方向更新地址)*/
             LCD_WriteReg(LCD_REG_3, 0x1000 | 0x0020 | 0x0010 | 0x0008); // RGB&GBR/左右0010/0000、上下0000/0020、水平垂直0000/0008 lvgl008需要对调xy坐标

 

disp要对调 LCD_SetCursor的 xy

void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p)
{
    uint16_t i, j;
    uint32_t w = (area->x2 - area->x1 + 1); //得到填充的宽度,area只会更新需要更新的像素
    uint32_t h = (area->y2 - area->y1 + 1); //高度

    
    for (i = 0; i < h; i++)
    {
        // LCD_SetCursor(area->x1, area->y1 + i); //设置光标位置
        LCD_SetCursor(area->y1 + i, area->x1); //横屏要对调光标位置
        LCD_WriteRAM_Prepare();                //开始写入GRAM

        for (j = 0; j < w; j++)
        {

            LCD_WR_DATA(color_p->full); //写入数据

            color_p++;
            //  delayMicroseconds(1000); //加延时,观察实际扫描过程
        }
    }

    lv_disp_flush_ready(disp);
    }

 


...

posted @ 2022-09-18 01:03  kyo413  阅读(832)  评论(0编辑  收藏  举报