Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Question about settings for monochrome display of LCD screens. #1

Open
nezumimrx opened this issue Nov 30, 2022 · 1 comment
Open

Comments

@nezumimrx
Copy link

Hi Daumemo,
So glad to find your post on "How to use LVGL library – Arduino on an ESP-32 and SPI LCD". It's really really helpful to my kind of beginners of LVGL lib.

I am currently working on a project that requires a monochrome display on a 240*320-pixel LCD screen to show color-depth 1 BMP format images. But I can't get my code to show images properly. Could you be so kind as to give some examples, please? I am desperate in need of some help.... Especially on those callback functions. I have no idea how to write void my_disp_flush() properly to display monochrome images.

I have did some changes to lv_conf.h.:
#define USE_LV_THEME_MONO 1 /Mono color theme for monochrome displays/
#define LV_USE_BMP 1
#define LV_COLOR_DEPTH 1
#define LV_COLOR_16_SWAP 0

and I read another post (https://maldus512.medium.com/porting-littlevgl-for-a-monochrome-display-6c7be58851ce). So I added some functions.
void my_set_px_cb(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa)
void my_rounder_cb(lv_disp_drv_t * disp_drv, lv_area_t * area)

ln setup function, I wrote:
static lv_disp_drv_t disp_drv;
lv_disp_drv_init( &disp_drv );
disp_drv.hor_res = screenWidth;
disp_drv.ver_res = screenHeight;
disp_drv.flush_cb = my_disp_flush; /Callback/
disp_drv.set_px_cb = my_set_px_cb; /Callback/
disp_drv.rounder_cb = my_rounder_cb; /Callback/
disp_drv.draw_buf = &draw_buf;
lv_disp_t * disp;
disp = lv_disp_drv_register(&disp_drv);

but I think the real problem is the my_disp_flush callback function doesn't match with monochrome settings.
void my_disp_flush( lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p )
{
uint32_t w = ( area->x2 - area->x1 + 1 );
uint32_t h = ( area->y2 - area->y1 + 1 );
tft.startWrite();
tft.setAddrWindow( area->x1, area->y1, w, h );
tft.pushColors( ( uint16_t * )&color_p->full, w * h, true );
tft.endWrite();
lv_disp_flush_ready( disp );
}

since this function display 16bit color.

What should I do to solve this problem?

@daumemo
Copy link
Owner

daumemo commented Jan 3, 2024

Hi, sorry for a one year late replay from me - somehow I have missed your question.
First of all - I myself am no professional in LVGL - I have learned everything by just try-and-test method. The monochrome display use case makes even more difficult to answer your question, as I personally don't have any experience with such type of displays.
One of ideas, that you have proposed yourself, could be checking my_disp_flush function. It uses tft.* method which might be more or less display specific functions. Especially tft.pushColors is used for displaying colored images and not bitmap images - which might need changing to another function altogether.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants