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_NONE
, LV_DISP_ROT_90
, LV_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); }
...