#include <lvgl.h>
#include <TFT_eSPI.h>
#include <Arduino.h>
/* Physical screen (ILI9341) */
#define TFT_HOR_RES 320
#define TFT_VER_RES 240
/* Logical UI size (Waveshare 1.47") */
#define UI_HOR_RES 172
#define UI_VER_RES 320
static lv_disp_draw_buf_t draw_buf;
static lv_color_t buf1[TFT_HOR_RES * 20];
TFT_eSPI tft = TFT_eSPI();
/* Flush callback */
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);
}
/* Button callback */
static void btn_event_cb(lv_event_t *e) {
lv_event_code_t code = lv_event_get_code(e);
if (code == LV_EVENT_CLICKED) {
Serial.println("Button clicked!");
lv_obj_t *label = lv_event_get_user_data(e);
lv_label_set_text(label, "Clicked!");
}
}
void setup() {
Serial.begin(115200);
lv_init();
tft.begin();
tft.setRotation(1);
lv_disp_draw_buf_init(&draw_buf, buf1, NULL, TFT_HOR_RES * 20);
static lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
disp_drv.hor_res = TFT_HOR_RES;
disp_drv.ver_res = TFT_VER_RES;
disp_drv.flush_cb = my_disp_flush;
disp_drv.draw_buf = &draw_buf;
lv_disp_drv_register(&disp_drv);
/* ===== UI ROOT (letterbox) ===== */
lv_obj_t *root = lv_obj_create(lv_scr_act());
lv_obj_set_size(root, UI_HOR_RES, UI_VER_RES);
lv_obj_center(root);
lv_obj_set_style_bg_color(root, lv_color_black(), 0);
lv_obj_set_style_pad_all(root, 0, 0);
/* Button */
lv_obj_t *btn = lv_btn_create(root);
lv_obj_set_size(btn, 120, 50);
lv_obj_align(btn, LV_ALIGN_CENTER, 0, 0);
lv_obj_t *label = lv_label_create(btn);
lv_label_set_text(label, "Press me");
lv_obj_center(label);
lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_CLICKED, label);
}
void loop() {
lv_timer_handler();
delay(5);
}
Loading
ili9341-cap-touch
ili9341-cap-touch