代码

#include <lvgl.h>
#include <TFT_eSPI.h>/*If you want to use the LVGL examples,make sure to install the lv_examples Arduino libraryand uncomment the following line.
#include <lv_examples.h>
*/// #include <lv_demo.h>#define LV_USE_LOG 1TFT_eSPI tft = TFT_eSPI(); /* TFT instance *//*Change to your screen resolution*/
static const uint32_t screenWidth  = 320;
static const uint32_t screenHeight = 240;static lv_disp_draw_buf_t draw_buf;
static lv_color_t buf[ screenWidth * 10 ];static lv_style_t style_btn;
static lv_style_t style_slider;
#if LV_USE_LOG != 0
/* Serial debugging */
void my_print( lv_log_level_t level, const char * file, uint32_t line, const char * fn_name, const char * dsc )
{Serial.printf( "%s(%s)@%d->%s\r\n", file, fn_name, line, dsc );Serial.flush();
}
#endif/* Display flushing */
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 );
}/*Read the touchpad*/
void my_touchpad_read( lv_indev_drv_t * indev_driver, lv_indev_data_t * data )
{uint16_t touchX, touchY;bool touched = tft.getTouch( &touchX, &touchY, 600 );if( !touched ){data->state = LV_INDEV_STATE_REL;}else{data->state = LV_INDEV_STATE_PR;/*Set the coordinates*/data->point.x = touchX;data->point.y = touchY;Serial.print( "Data x " );Serial.println( touchX );Serial.print( "Data y " );Serial.println( touchY );}
}
/*
static void btn_event_callback(lv_event_t* event)
{static uint32_t counter = 1;lv_obj_t* btn = lv_event_get_target(event); //获取事件对象if (btn != NULL){lv_obj_t* label = lv_obj_get_child(btn, 0); // 获取第一个子对象if (label != NULL){lv_label_set_text_fmt(label, "%d", counter); //设置显示内容counter++;}}
}void lv_button_click_event_test()
{lv_obj_t* btn = lv_btn_create(lv_scr_act()); // 创建Button对象if (btn != NULL){lv_obj_add_style(btn, &style_btn, LV_STATE_DEFAULT); // 给按钮对象添加默认样式lv_style_set_bg_color(&style_btn, lv_palette_main(LV_PALETTE_YELLOW)); // 样式背景色为黄色lv_obj_set_style_radius(btn, LV_RADIUS_CIRCLE, 0);  // 添加按钮对象的圆角弧度样lv_obj_set_size(btn, 100, 50); // 设置对象大小,宽度和高度lv_obj_set_pos(btn, 110, 100);; // 设置按钮位置,即X和Y坐标lv_obj_add_event_cb(btn, btn_event_callback, LV_EVENT_CLICKED, NULL); // 给对象添加CLICK事件和事件处理回调函数lv_obj_t* label = lv_label_create(btn); // 基于Button对象创建Label对象if (label != NULL){lv_label_set_text(label, "Click me!"); // 设置显示内容lv_obj_center(label); // 对象居中显示}}
}*/
/*
static void slider_event_callback(lv_event_t* event)
{lv_obj_t * slider = lv_event_get_target(event);if (slider != NULL){lv_obj_add_style(slider, &style_slider, LV_STATE_DEFAULT); // 给按钮对象添加默认样式lv_style_set_bg_color(&style_slider, lv_palette_main(LV_PALETTE_YELLOW)); // 样式背景色为黄色lv_obj_t* label = (lv_obj_t* )lv_event_get_user_data(event);if (label != NULL){// 刷新label对象的文本lv_label_set_text_fmt(label, "%d", lv_slider_get_value(slider));lv_obj_align_to(label, slider, LV_ALIGN_OUT_TOP_MID, 0, -15);  // 设置对齐,label对象在slider对象上方中间位置}}
}void lv_slider_test()
{lv_obj_t * slider = lv_slider_create(lv_scr_act()); // 创建滑块对象if (slider != NULL){lv_obj_set_width(slider, 200); // 设置slider的宽度lv_obj_center(slider);  // 对样显示在屏幕中央lv_slider_set_range(slider, 0, 1024); // 设置滑块值的变化范围0-1024lv_obj_t* label = lv_label_create(lv_scr_act()); // 创建一个标签,用于显示滑块的滑动值if (label != NULL){lv_label_set_text_fmt(label, "%d", lv_slider_get_min_value(slider)); // 标签默认显示滑块的最小值lv_obj_align_to(label, slider, LV_ALIGN_OUT_TOP_MID, 0, -15);  // 标签对象放在slider对象的上方中间位置// 添加滑块值变化事件和事件回调函数,并将label对象最为事件的user_datalv_obj_add_event_cb(slider, slider_event_callback, LV_EVENT_VALUE_CHANGED, (void *)label);}}
}
*/
/*
void lv_size_style_test()
{static lv_style_t style; // 注意:这个变量不能为局部变量,必须是static/全局/动态申请的变量lv_style_init(&style);lv_style_reset(&style); // 重置样式lv_style_set_radius(&style, 5); // 设置样式圆角弧度lv_style_set_width(&style, 150); // 设置样式宽度lv_style_set_height(&style, LV_SIZE_CONTENT); // 设置样式高度lv_style_set_pad_ver(&style, 20); // 设置垂直方向的填充,即padding top和padding bottom分别填充20lv_style_set_pad_left(&style, 5); // 设置左边填充lv_style_set_x(&style, lv_pct(30)); // 设置水平坐标,lv_pct转换百分比到坐标值,即X坐标为屏幕宽度的20%lv_style_set_y(&style, 100); // 设置垂直坐标// 基于屏幕创建一个对象并添加样式lv_obj_t * obj = lv_obj_create(lv_scr_act());if (obj != NULL){lv_obj_add_style(obj, &style, 0);lv_obj_t * label = lv_label_create(obj); // 基于obj创建一个label对象if (label != NULL){lv_label_set_text(label, "Hello World!");}}}*/
/*
void lv_example_bar_1(void)
{lv_obj_t * bar1 = lv_bar_create(lv_scr_act());//构建进度条对象lv_obj_set_size(bar1, 200, 20);//设置宽度和高度lv_obj_center(bar1);//居中lv_bar_set_value(bar1, 20, LV_ANIM_OFF);//设置加载进度}
*/
/*
static void event_handler(lv_event_t * e)
{lv_event_code_t code = lv_event_get_code(e);lv_obj_t * obj = lv_event_get_target(e);if(code == LV_EVENT_VALUE_CHANGED) {//如果开关的状态变化了LV_LOG_USER("State: %s\n", lv_obj_has_state(obj, LV_STATE_CHECKED) ? "On" : "Off");Serial.println(lv_obj_has_state(obj, LV_STATE_CHECKED));//打印出开关的值if(lv_obj_has_state(obj, LV_STATE_CHECKED)== 1){Serial.println("on");}else{Serial.println("off");}}
}void lv_example_switch_1(void)
{lv_obj_set_flex_flow(lv_scr_act(), LV_FLEX_FLOW_COLUMN);lv_obj_set_flex_align(lv_scr_act(), LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);lv_obj_t * sw;sw = lv_switch_create(lv_scr_act());lv_obj_add_event_cb(sw, event_handler, LV_EVENT_ALL, NULL);sw = lv_switch_create(lv_scr_act());lv_obj_add_state(sw, LV_STATE_CHECKED);lv_obj_add_event_cb(sw, event_handler, LV_EVENT_ALL, NULL);
}*/
/*
void lv_example_arc_1(void)
{lv_obj_t * arc = lv_arc_create(lv_scr_act());//创建一个对象lv_obj_set_size(arc, 150, 150);//设置大小lv_arc_set_rotation(arc, 135);//设置值的范围lv_arc_set_bg_angles(arc, 0, 270);//设置弧的大小,360为一个圆lv_arc_set_value(arc, 40);//设置现在的值lv_obj_center(arc);
}*/
/*
static void event_handler(lv_event_t * e)
{lv_event_code_t code = lv_event_get_code(e);lv_obj_t * obj = lv_event_get_target(e);if(code == LV_EVENT_VALUE_CHANGED) {uint32_t id = lv_btnmatrix_get_selected_btn(obj);const char * txt = lv_btnmatrix_get_btn_text(obj, id);LV_LOG_USER("%s was pressed\n", txt);Serial.println(txt);}
}static const char * btnm_map[] = {"1", "2", "3", "4", "5", "\n","6", "7", "8", "9", "0", "\n","Action1", "Action2", ""};void lv_example_btnmatrix_1(void)
{lv_obj_t * btnm1 = lv_btnmatrix_create(lv_scr_act());lv_btnmatrix_set_map(btnm1, btnm_map);lv_btnmatrix_set_btn_width(btnm1, 10, 2);        //Make "Action1" twice as wide as "Action2"lv_btnmatrix_set_btn_ctrl(btnm1, 10, LV_BTNMATRIX_CTRL_CHECKABLE);lv_btnmatrix_set_btn_ctrl(btnm1, 11, LV_BTNMATRIX_CTRL_CHECKED);lv_obj_align(btnm1, LV_ALIGN_CENTER, 0, 0);lv_obj_add_event_cb(btnm1, event_handler, LV_EVENT_ALL, NULL);
}*/
/*
static void event_handler(lv_event_t * e)
{lv_event_code_t code = lv_event_get_code(e);lv_obj_t * obj = lv_event_get_target(e);if(code == LV_EVENT_VALUE_CHANGED) {const char * txt = lv_checkbox_get_text(obj);const char * state = lv_obj_get_state(obj) & LV_STATE_CHECKED ? "Checked" : "Unchecked";LV_LOG_USER("%s: %s", txt, state);}
}void lv_example_checkbox_1(void)
{lv_obj_set_flex_flow(lv_scr_act(), LV_FLEX_FLOW_COLUMN);lv_obj_set_flex_align(lv_scr_act(), LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER);lv_obj_t * cb;cb = lv_checkbox_create(lv_scr_act());lv_checkbox_set_text(cb, "Apple");lv_obj_add_event_cb(cb, event_handler, LV_EVENT_ALL, NULL);cb = lv_checkbox_create(lv_scr_act());lv_checkbox_set_text(cb, "Banana");lv_obj_add_state(cb, LV_STATE_CHECKED);lv_obj_add_event_cb(cb, event_handler, LV_EVENT_ALL, NULL);cb = lv_checkbox_create(lv_scr_act());lv_checkbox_set_text(cb, "Lemon");lv_obj_add_state(cb, LV_STATE_DISABLED);lv_obj_add_event_cb(cb, event_handler, LV_EVENT_ALL, NULL);cb = lv_checkbox_create(lv_scr_act());lv_obj_add_state(cb, LV_STATE_CHECKED | LV_STATE_DISABLED);lv_checkbox_set_text(cb, "Melon\nand a new line");lv_obj_add_event_cb(cb, event_handler, LV_EVENT_ALL, NULL);lv_obj_update_layout(cb);
}
*/
/*
static void event_handler(lv_event_t * e)
{lv_event_code_t code = lv_event_get_code(e);lv_obj_t * obj = lv_event_get_target(e);if(code == LV_EVENT_VALUE_CHANGED) {char buf[32];lv_dropdown_get_selected_str(obj, buf, sizeof(buf));LV_LOG_USER("Option: %s", buf);Serial.println(buf);}
}void lv_example_dropdown_1(void)
{//Create a normal drop down listlv_obj_t * dd = lv_dropdown_create(lv_scr_act());lv_dropdown_set_options(dd, "Apple\n""Banana\n""Orange\n""Cherry\n""Grape\n""Raspberry\n""Melon\n""Orange\n""Lemon\n""Nuts");lv_obj_align(dd, LV_ALIGN_TOP_MID, 0, 20);lv_obj_add_event_cb(dd, event_handler, LV_EVENT_ALL, NULL);
}
*/
/*
void lv_example_label_1(void)
{lv_obj_t * label1 = lv_label_create(lv_scr_act());lv_label_set_long_mode(label1, LV_LABEL_LONG_WRAP);     //Break the long lineslv_label_set_recolor(label1, true);                      //Enable re-coloring by commands in the textlv_label_set_text(label1, "#0000ff Re-color# #ff00ff words# #ff0000 of a# label, align the lines to the center""and  wrap long text automatically.");lv_obj_set_width(label1, 150);  //Set smaller width to make the lines wraplv_obj_set_style_text_align(label1, LV_TEXT_ALIGN_CENTER, 0);lv_obj_align(label1, LV_ALIGN_CENTER, 0, -40);lv_obj_t * label2 = lv_label_create(lv_scr_act());lv_label_set_long_mode(label2, LV_LABEL_LONG_SCROLL_CIRCULAR);     //Circular scrolllv_obj_set_width(label2, 150);lv_label_set_text(label2, "It is a circularly scrolling text. ");lv_obj_align(label2, LV_ALIGN_CENTER, 0, 40);
}*/
/*
void lv_example_line_1(void)
{//Create an array for the points of the linestatic lv_point_t line_points[] = { {5, 5}, {70, 70}, {120, 10}, {180, 60}, {240, 10} };//Create stylestatic lv_style_t style_line;lv_style_init(&style_line);lv_style_set_line_width(&style_line, 8);lv_style_set_line_color(&style_line, lv_palette_main(LV_PALETTE_BLUE));lv_style_set_line_rounded(&style_line, true);//Create a line and apply the new stylelv_obj_t * line1;line1 = lv_line_create(lv_scr_act());lv_line_set_points(line1, line_points, 5);     //Set the pointslv_obj_add_style(line1, &style_line, 0);lv_obj_center(line1);
}
*/
static void event_handler(lv_event_t * e)
{lv_event_code_t code = lv_event_get_code(e);lv_obj_t * obj = lv_event_get_target(e);if(code == LV_EVENT_VALUE_CHANGED) {char buf[32];lv_roller_get_selected_str(obj, buf, sizeof(buf));LV_LOG_USER("Selected month: %s\n", buf);Serial.println(buf);}
}/*** An infinite roller with the name of the months*/
void lv_example_roller_1(void)
{lv_obj_t *roller1 = lv_roller_create(lv_scr_act());lv_roller_set_options(roller1,"January\n""February\n""March\n""April\n""May\n""June\n""July\n""August\n""September\n""October\n""November\n""December",LV_ROLLER_MODE_INFINITE);lv_roller_set_visible_row_count(roller1, 4);lv_obj_center(roller1);lv_obj_add_event_cb(roller1, event_handler, LV_EVENT_ALL, NULL);
}
void setup()
{Serial.begin( 115200 ); /* prepare for possible serial debug */Serial.println( "Hello Arduino! (V8.0.X)" );Serial.println( "I am LVGL_Arduino" );lv_init();#if LV_USE_LOG != 0// lv_log_register_print_cb( my_print ); /* register print function for debugging */
#endiftft.begin();          /* TFT init */tft.setRotation( 1 ); /* Landscape orientation, flipped *//*Set the touchscreen calibration data,the actual data for your display can be aquired usingthe Generic -> Touch_calibrate example from the TFT_eSPI library*/uint16_t calData[5] = { 442, 3414, 336, 3425, 3 };tft.setTouch(calData);lv_disp_draw_buf_init( &draw_buf, buf, NULL, screenWidth * 10 );/*Initialize the display*/static lv_disp_drv_t disp_drv;lv_disp_drv_init( &disp_drv );/*Change the following line to your display resolution*/disp_drv.hor_res = screenWidth;disp_drv.ver_res = screenHeight;disp_drv.flush_cb = my_disp_flush;disp_drv.draw_buf = &draw_buf;lv_disp_drv_register( &disp_drv );/*Initialize the (dummy) input device driver*/static lv_indev_drv_t indev_drv;lv_indev_drv_init( &indev_drv );indev_drv.type = LV_INDEV_TYPE_POINTER;indev_drv.read_cb = my_touchpad_read;lv_indev_drv_register( &indev_drv );//   lv_button_click_event_test();
//     lv_slider_test();
//   lv_size_style_test();
//     lv_example_bar_1();
//      lv_example_switch_1();
//   lv_example_arc_1();
//   lv_example_btnmatrix_1();
//     lv_example_checkbox_1();
//   lv_example_dropdown_1();
//  lv_example_label_1();
//   lv_example_line_1();lv_example_roller_1();Serial.println( "Setup done" );
}void loop()
{lv_timer_handler(); /* let the GUI do its work */lv_tick_inc(5);delay(5);
}

效果

串口打印滚轮选择的值

LVGL学习记录:Roller滚轮相关推荐

  1. LVGL学习笔记 20 - 滚轮Roller

    目录 1. Parts 2. 设置 2.1 设置选项 2.2 设置可见行 2.3 设置选中项 3. 样式 3.1 设置选项之间的间隔 3.2设置滚动效果时间 3.3 设置选中项的字体 3.4 设置选中 ...

  2. LVGL学习记录:按键

    按键按下加一 程序 #include <lvgl.h> #include <TFT_eSPI.h>/*If you want to use the LVGL examples, ...

  3. Cadence Allegro 17.4学习记录开始06-PCB Editor 17.4快捷键的说明和中英文的切换和操作界面放大缩小设置

    目录 Cadence Allegro 17.4学习记录开始06-PCB Editor 17.4快捷键的说明和中英文的切换和操作界面放大缩小设置 PCB Editor 17.4快捷键的说明 第一:env ...

  4. linux个人学习记录

    linux学习记录 资料: Linux 黑马程序员_bilibili AcWing Linux基础课 可能是东半球最全面易懂的 Tmux 使用教程! Shell 教程 | 菜鸟教程 (runoob.c ...

  5. 【Blender2.82a】学习记录

    [Blender2.82a]学习记录 1. 基本操作 1.1 界面操作 1.2 物体操作 1.3 建模基础 2021/12/13 最近的项目又要用到blender了,已经一年半没用过了.现在用的版本为 ...

  6. 微信小游戏开发学习记录2

    接上一篇:微信小游戏开发学习记录_寂静流年韶华舞的博客-CSDN博客_微信小游戏开发学习 目录 一.UI系统 1.基础渲染组件-精灵组件 (1)操作: (2)Sprite 属性 (3)渲染模式 2.L ...

  7. QT子线程实现串口通信_学习记录

    QT子线程实现串口通信_学习记录 1 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容 ...

  8. Pytorch学习记录-torchtext和Pytorch的实例( 使用神经网络训练Seq2Seq代码)

    Pytorch学习记录-torchtext和Pytorch的实例1 0. PyTorch Seq2Seq项目介绍 1. 使用神经网络训练Seq2Seq 1.1 简介,对论文中公式的解读 1.2 数据预 ...

  9. HTML5与CSS3权威指南之CSS3学习记录

    title: HTML5与CSS3权威指南之CSS3学习记录 toc: true date: 2018-10-14 00:06:09 学习资料--<HTML5与CSS3权威指南>(第3版) ...

  10. springboot @cacheable不起作用_Springboot学习记录13 使用缓存:整合redis

    本学习记录的代码,部分参考自gitee码云的如下工程.这个工程有详尽的Spingboot1.x教程.鸣谢! https://gitee.com/didispace/SpringBoot-Learnin ...

最新文章

  1. matlab中tic,toc的用法
  2. one order event handling - event filtering
  3. springboot主线程_Springboot对多线程的支持详解
  4. java 解析日期格式_日期/时间格式/解析,Java 8样式
  5. css文字不被点击,css 让文字不被选中之-moz-user-select 属性介绍
  6. [翻译]超炫列表动画的实现
  7. Win7(64位)上编译、安装、配置、运行hadoop-Ver2.5.2---单机版配置运行
  8. python程序写完怎么保存_python程序如何进行保存
  9. github免费空间玩法
  10. 数据的更新(update的用法)笔记
  11. 2022山东省软件设计大赛备赛建议
  12. 5G NR 信道质量指示(CQI)概述
  13. 生物特征识别性能的不同衡量标准以及python源代码
  14. IPv6的DNS服务器
  15. 用手机远程控制扫描仪
  16. HTML旅游网站设计与实现——东江湖旅游网站6个网页HTML+CSS+JavaScript
  17. Win10系统antimalware service executable进程占用cpu过高的问题
  18. vscode配置php运行环境以及xdebug
  19. gif制作转换器免费推荐,动图制作什么软件好用
  20. 无论是狗粮还是降落伞,反正WeLink来了……

热门文章

  1. idea怎么集成svn服务端,使用Mac自带svn搭建服务器,并使用idea进行连接(示例代码)...
  2. Hexo 好看的主题推荐
  3. 2022 年顶级网络安全专家最爱用的10大工具
  4. python读取dbf并导出excel格式_Python导出DBF文件到Excel的方法
  5. 声音采集播放以及I2S接口
  6. axure element ui素材_Element - 饿了么团队出品的神级桌面 UI 组件库
  7. 免费的录屏软件Capture
  8. Android扫描二维码,生成二维码
  9. linux自动内存清理
  10. unity 2018.3.0版本界面汉化