单片机 :STM32F407
开发板:DMF407电机开发板
平台:keil V5.31
HSE 为8MHZ
HSI为16MHZ
一、无操作系统移植
文件系统








int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */
tp_dev.init(); /* 触摸屏初始化 */
btim_timx_int_init(10-1,8400-1); /* 初始化定时器 */
lv_init(); /* lvgl系统初始化 */
lv_port_disp_init(); /* lvgl显示接口初始化,放在lv_init()的后面 */
lv_port_indev_init(); /* lvgl输入接口初始化,放在lv_init()的后面 */
lv_demo_stress(); /* 测试的demo */
while(1)
{
lv_timer_handler(); /* LVGL计时器 */
}
}
void lv_demo_stress(void)
{
lv_timer_create(obj_test_task_cb, TIME_STEP, NULL);
}
static void obj_test_task_cb(lv_timer_t * tmr)
{
(void) tmr; /*Unused*/
static int16_t state = -1;
lv_anim_t a;
lv_obj_t * obj;
// printf("step start: %d\n", state);
switch(state) {
case -1:
{
lv_res_t res = lv_mem_test();
if(res != LV_RES_OK) {
LV_LOG_ERROR("Memory integrity error");
}
lv_mem_monitor_t mon;
lv_mem_monitor(&mon);
if(mem_free_start == 0) mem_free_start = mon.free_size;
LV_LOG_USER("mem leak since start: %d, frag: %3d %%", mem_free_start - mon.free_size, mon.frag_pct);
}
break;
case 0:
/* Holder for all object types */
main_page = lv_obj_create(lv_scr_act());
lv_obj_set_size(main_page, LV_HOR_RES / 2 , LV_VER_RES);
lv_obj_set_flex_flow(main_page, LV_FLEX_FLOW_COLUMN);
obj = lv_btn_create(main_page);
lv_obj_set_size(obj, 100, 70);
obj = lv_label_create(obj);
lv_label_set_text(obj, "Multi line\n"LV_SYMBOL_OK LV_SYMBOL_CLOSE LV_SYMBOL_WIFI);
break;
case 1:
{
obj = lv_tabview_create(lv_scr_act(), LV_DIR_TOP, 50);
lv_obj_set_size(obj, LV_HOR_RES / 2, LV_VER_RES / 2);
lv_obj_align(obj, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
lv_obj_t * t = lv_tabview_add_tab(obj, "First");
t = lv_tabview_add_tab(obj, "Second");
lv_obj_t * c = lv_colorwheel_create(t, true);
lv_obj_set_size(c, 150, 150);
// c = lv_led_create(t, NULL);
// lv_obj_set_pos(c, 160, 20);
t = lv_tabview_add_tab(obj, LV_SYMBOL_EDIT " Edit");
t = lv_tabview_add_tab(obj, LV_SYMBOL_CLOSE);
lv_tabview_set_act(obj, 1, LV_ANIM_ON);
auto_del(obj, TIME_STEP * 5 + 30);
}
break;
case 2:
obj = lv_btn_create(main_page);
lv_obj_set_size(obj, 200, 70);
/*Move to disabled state very slowly*/
lv_obj_add_state(obj, LV_STATE_DISABLED);
/*Add an infinite width change animation*/
lv_anim_init(&a);
lv_anim_set_var(&a, obj);
lv_anim_set_time(&a, TIME_STEP * 2);
lv_anim_set_exec_cb(&a, set_width_anim);
lv_anim_set_values(&a, 100, 200);
lv_anim_set_playback_time(&a, TIME_STEP * 2);
lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
lv_anim_start(&a);
/*Delete the object a few sec later*/
auto_del(obj, TIME_STEP * 10);
obj = lv_label_create(obj);
lv_label_set_text_fmt(obj, "Formatted:\n%d %s", 12, "Volt");
break;
case 3:
ta = lv_textarea_create(lv_scr_act());
lv_obj_align_to(ta, main_page, LV_ALIGN_OUT_RIGHT_TOP, 10, 10);
lv_obj_set_size(ta, LV_HOR_RES / 3, LV_VER_RES / 4);
lv_textarea_set_placeholder_text(ta, "The placeholder");
break;
case 4:
obj = lv_btn_create(main_page);
lv_obj_set_size(obj, 100, 70);
lv_obj_set_style_bg_img_src(obj, LV_SYMBOL_DUMMY"Text from\nstyle", 0);
lv_obj_del_async(obj); /*Delete on next call of `lv_task_handler` (so not now)*/
// obj = lv_btn_create(main_page);
// lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
// lv_obj_set_style_bg_img_src(obj, LV_SYMBOL_LEFT);
// lv_obj_set_style_bg_img_opa(obj, LV_OPA_50);
// lv_obj_set_style_bg_img_tiled(obj, true);
// lv_obj_scroll_to_view(obj, LV_ANIM_ON);
break;
case 5:
lv_textarea_set_one_line(ta, true);
break;
case 6:
lv_obj_set_flex_flow(main_page, LV_FLEX_FLOW_COLUMN_WRAP);
break;
case 7:
obj = lv_bar_create(main_page);
lv_bar_set_range(obj, -1000, 2000);
lv_bar_set_value(obj, 1800, LV_ANIM_ON);
lv_bar_set_start_value(obj, -500, LV_ANIM_ON);
auto_del(obj, TIME_STEP * 2 + 70);
obj = lv_slider_create(main_page);
lv_obj_set_style_anim_time(obj, TIME_STEP * 8, 0);
lv_slider_set_value(obj, 5000, LV_ANIM_ON); /*Animate to out of range value*/
auto_del(obj, TIME_STEP * 5 + 22);
obj = lv_switch_create(main_page);
obj = lv_switch_create(main_page);
lv_obj_add_state(obj, LV_STATE_CHECKED);
auto_del(obj, 730);
break;
case 8:
obj = lv_win_create(lv_scr_act(), 50);
lv_obj_set_size(obj, LV_HOR_RES / 2, LV_VER_RES / 2);
lv_obj_align(obj, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
lv_win_add_title(obj, "Window title");
lv_win_add_btn(obj, LV_SYMBOL_CLOSE, 40);
lv_win_add_btn(obj, LV_SYMBOL_DOWN, 40);
auto_del(obj, TIME_STEP * 3 + 5);
obj = lv_calendar_create(lv_win_get_content(obj));
break;
case 9:
lv_textarea_set_text(ta, "A very very long text which will should make the text area scrollable"
"Here area some dummy sentences to be sure the text area will be really scrollable.");
break;
case 10:
obj = lv_keyboard_create(lv_scr_act());
lv_keyboard_set_mode(obj, LV_KEYBOARD_MODE_TEXT_UPPER);
lv_anim_init(&a);
lv_anim_set_var(&a, obj);
lv_anim_set_values(&a, LV_VER_RES, LV_VER_RES - lv_obj_get_height(obj));
lv_anim_set_time(&a, TIME_STEP + 3);
lv_anim_set_exec_cb(&a, set_y_anim);
lv_anim_start(&a);
auto_del(obj, TIME_STEP * 2 + 18);
break;
case 11:
obj = lv_dropdown_create(main_page);
lv_dropdown_set_options(obj, "Zero\nOne\nTwo\nThree\nFour\nFive\nSix\nSeven\nEight");
lv_dropdown_open(obj);
lv_dropdown_set_selected(obj, 2);
auto_del(obj, TIME_STEP * 3 + 11);
break;
case 12:
obj = lv_roller_create(main_page);
lv_roller_set_options(obj, "Zero\nOne\nTwo\nThree\nFour\nFive\nSix\nSeven\nEight", LV_ROLLER_MODE_INFINITE);
lv_roller_set_selected(obj, 2, LV_ANIM_ON);
auto_del(obj, TIME_STEP * 20 + 22);
break;
case 13:
obj = lv_arc_create(main_page);
lv_anim_init(&a);
lv_anim_set_var(&a, obj);
lv_anim_set_values(&a, 180, 400);
lv_anim_set_time(&a, TIME_STEP * 2);
lv_anim_set_delay(&a, TIME_STEP + 25);
lv_anim_set_playback_time(&a, TIME_STEP * 5);
lv_anim_set_repeat_count(&a, 3);
lv_anim_set_exec_cb(&a, arc_set_end_angle_anim);
lv_anim_start(&a);
obj = lv_meter_create(main_page);
lv_obj_scroll_to_view(obj, LV_ANIM_ON);
lv_meter_scale_t * scale = lv_meter_add_scale(obj);
lv_meter_add_needle_line(obj, scale, 3, lv_palette_main(LV_PALETTE_RED), -10);
auto_del(obj, TIME_STEP * 6 + 30);
break;
case 14:
obj = lv_msgbox_create(NULL, "Title", "Some text on the message box with average length", mbox_btns, true);
lv_timer_t * msgbox_tmr = lv_timer_create(msgbox_del, TIME_STEP * 5 + 30, obj);
lv_timer_set_repeat_count(msgbox_tmr, 1);
lv_obj_align(obj, LV_ALIGN_RIGHT_MID, -10, 0);
break;
case 15:
lv_textarea_set_one_line(ta, false);
break;
case 16:
{
lv_obj_t * tv = lv_tileview_create(lv_scr_act());
lv_obj_set_size(tv, 200, 200);
auto_del(tv, TIME_STEP * 4 + 5);
obj = lv_tileview_add_tile(tv, 0, 0, LV_DIR_ALL);
obj = lv_label_create(obj);
lv_label_set_text(obj, "Tile: 0;0");
obj = lv_tileview_add_tile(tv, 0, 1, LV_DIR_ALL);
obj = lv_label_create(obj);
lv_label_set_text(obj, "Tile: 0;1");
obj = lv_tileview_add_tile(tv, 1, 1, LV_DIR_ALL);
obj = lv_label_create(obj);
lv_label_set_text(obj, "Tile: 1;1");
lv_obj_set_tile_id(tv, 1, 1, LV_ANIM_ON);
}
break;
case 18:
obj = lv_list_create(main_page);
{
lv_obj_t * b;
b = lv_list_add_btn(obj, LV_SYMBOL_OK, "1. Some very long text to scroll");
auto_del(b, 10);
lv_list_add_btn(obj, LV_SYMBOL_OK, "2. Some very long text to scroll");
lv_list_add_btn(obj, LV_SYMBOL_OK, "3. Some very long text to scroll");
b = lv_list_add_btn(obj, LV_SYMBOL_OK, "4. Some very long text to scroll");
auto_del(b, TIME_STEP);
b = lv_list_add_btn(obj, LV_SYMBOL_OK, "5. Some very long text to scroll");
auto_del(b, TIME_STEP + 90);
b = lv_list_add_btn(obj, LV_SYMBOL_OK, "6. Some very long text to scroll");
auto_del(b, TIME_STEP + 10);
lv_obj_scroll_to_view(lv_obj_get_child(obj, -1), LV_ANIM_ON);
}
auto_del(obj, TIME_STEP * 5 + 15);
obj = lv_table_create(main_page);
lv_table_set_cell_value(obj, 0, 0, "0,0");
lv_table_set_cell_value_fmt(obj, 3, 0, "%d,%d", 5, 0);
lv_table_set_row_cnt(obj, 5);
lv_table_set_cell_value_fmt(obj, 1, 0, "%s", "1,0");
lv_table_set_cell_value(obj, 1, 3, "1,3");
break;
case 19:
lv_textarea_set_cursor_pos(ta, 10);
lv_textarea_set_text(ta, "__INSERTED TEXT" LV_SYMBOL_EDIT"__");
break;
case 20:
lv_obj_set_flex_flow(main_page, LV_FLEX_FLOW_ROW_WRAP);
break;
case 21:
lv_textarea_set_cursor_pos(ta, 0);
lv_textarea_add_char(ta, '0');
lv_textarea_add_char(ta, '1');
lv_textarea_add_char(ta, '2');
lv_textarea_add_char(ta, '3');
lv_textarea_add_char(ta, '4');
lv_textarea_add_char(ta, '5');
lv_textarea_add_char(ta, '6');
lv_textarea_add_char(ta, '7');
lv_textarea_add_char(ta, '8');
lv_textarea_add_char(ta, '9');
lv_textarea_add_char(ta, 'A');
lv_textarea_add_char(ta, 'B');
lv_textarea_add_char(ta, 'C');
lv_textarea_add_char(ta, 'D');
lv_textarea_add_char(ta, 'E');
lv_textarea_add_char(ta, 'F');
lv_textarea_add_text(ta, LV_SYMBOL_OK);
lv_textarea_add_text(ta, LV_SYMBOL_CLOSE);
lv_textarea_add_text(ta, LV_SYMBOL_COPY);
lv_textarea_add_text(ta, LV_SYMBOL_SAVE);
lv_textarea_add_text(ta, LV_SYMBOL_PASTE);
break;
case 22:
obj = lv_spinbox_create(main_page);
lv_spinbox_set_digit_format(obj, 6, 3);
lv_spinbox_set_value(obj, 5678);
lv_spinbox_set_step(obj, 10);
lv_spinbox_increment(obj);
lv_spinbox_increment(obj);
lv_spinbox_increment(obj);
lv_spinbox_set_step(obj, 100);
lv_spinbox_increment(obj);
lv_spinbox_increment(obj);
lv_spinbox_set_step(obj, 1);
lv_spinbox_increment(obj);
lv_spinbox_increment(obj);
auto_del(obj, TIME_STEP * 2 + 15);
lv_obj_scroll_by(main_page, 0, 20, LV_ANIM_ON);
break;
case 23:
obj = lv_chart_create(main_page);
{
lv_chart_series_t * s1 = lv_chart_add_series(obj, lv_palette_main(LV_PALETTE_RED), LV_CHART_AXIS_PRIMARY_Y);
lv_chart_set_next_value(obj, s1, 36);
lv_chart_set_next_value(obj, s1, -29);
lv_chart_set_next_value(obj, s1, 51);
lv_chart_set_next_value(obj, s1, 107);
lv_chart_set_next_value(obj, s1, 70);
lv_chart_set_next_value(obj, s1, 36);
lv_chart_set_next_value(obj, s1, -2);
lv_chart_set_next_value(obj, s1, 63);
lv_chart_set_next_value(obj, s1, 48);
lv_chart_set_next_value(obj, s1, 72);
auto_del(obj, TIME_STEP * 3);
}
lv_obj_scroll_by(main_page, 0, 20, LV_ANIM_ON);
break;
case 24:
obj = lv_checkbox_create(main_page);
lv_checkbox_set_text(obj, "An option to select");
auto_del(obj, TIME_STEP * 2 + 20);
obj = lv_checkbox_create(main_page);
lv_obj_add_state(obj, LV_STATE_CHECKED);
obj = lv_checkbox_create(main_page);
lv_obj_add_state(obj, LV_STATE_CHECKED | LV_STATE_DISABLED);
auto_del(obj, TIME_STEP * 1 + 60);
lv_obj_scroll_by(main_page, 0, 20, LV_ANIM_ON);
break;
case 25:
lv_textarea_set_cursor_pos(ta, 20);
{
uint16_t i;
for(i = 0; i < 64; i++) {
lv_textarea_del_char_forward(ta);
}
}
break;
case 26:
lv_textarea_set_one_line(ta, true);
break;
case 29:
lv_obj_clean(main_page);
lv_obj_del(ta);
ta = NULL;
break;
case 31:
lv_obj_clean(lv_scr_act());
main_page = NULL;
state = -2;
break;
default:
break;
}
// printf("step end: %d\n", state);
state ++;
}
LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void)
{
TIMER_TRACE("begin");
/*Avoid concurrent running of the timer handler*/
static bool already_running = false;
if(already_running) {
TIMER_TRACE("already running, concurrent calls are not allow, returning");
return 1;
}
already_running = true;
if(lv_timer_run == false) {
already_running = false; /*Release mutex*/
return 1;
}
static uint32_t idle_period_start = 0;
static uint32_t busy_time = 0;
uint32_t handler_start = lv_tick_get();
if(handler_start == 0) {
static uint32_t run_cnt = 0;
run_cnt++;
if(run_cnt > 100) {
run_cnt = 0;
LV_LOG_WARN("It seems lv_tick_inc() is not called.");
}
}
/*Run all timer from the list*/
lv_timer_t * next;
do {
timer_deleted = false;
timer_created = false;
LV_GC_ROOT(_lv_timer_act) = _lv_ll_get_head(&LV_GC_ROOT(_lv_timer_ll));
while(LV_GC_ROOT(_lv_timer_act)) {
/*The timer might be deleted if it runs only once ('repeat_count = 1')
*So get next element until the current is surely valid*/
next = _lv_ll_get_next(&LV_GC_ROOT(_lv_timer_ll), LV_GC_ROOT(_lv_timer_act));
if(lv_timer_exec(LV_GC_ROOT(_lv_timer_act))) {
/*If a timer was created or deleted then this or the next item might be corrupted*/
if(timer_created || timer_deleted) {
TIMER_TRACE("Start from the first timer again because a timer was created or deleted");
break;
}
}
LV_GC_ROOT(_lv_timer_act) = next; /*Load the next timer*/
}
} while(LV_GC_ROOT(_lv_timer_act));
uint32_t time_till_next = LV_NO_TIMER_READY;
next = _lv_ll_get_head(&LV_GC_ROOT(_lv_timer_ll));
while(next) {
if(!next->paused) {
uint32_t delay = lv_timer_time_remaining(next);
if(delay < time_till_next)
time_till_next = delay;
}
next = _lv_ll_get_next(&LV_GC_ROOT(_lv_timer_ll), next); /*Find the next timer*/
}
busy_time += lv_tick_elaps(handler_start);
uint32_t idle_period_time = lv_tick_elaps(idle_period_start);
if(idle_period_time >= IDLE_MEAS_PERIOD) {
idle_last = (busy_time * 100) / idle_period_time; /*Calculate the busy percentage*/
idle_last = idle_last > 100 ? 0 : 100 - idle_last; /*But we need idle time*/
busy_time = 0;
idle_period_start = lv_tick_get();
}
already_running = false; /*Release the mutex*/
TIMER_TRACE("finished (%d ms until the next timer call)", time_till_next);
return time_till_next;
}
测试结果:

二、操作系统移植
文件系统

主函数
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */
lvgl_demo(); /* 运行FreeRTOS例程 */
}
void lvgl_demo(void)
{
lv_init(); /* lvgl系统初始化 */
lv_port_disp_init(); /* lvgl显示接口初始化,放在lv_init()的后面 */
lv_port_indev_init(); /* lvgl输入接口初始化,放在lv_init()的后面 */
xTaskCreate((TaskFunction_t )start_task, /* 任务函数 */
(const char* )"start_task", /* 任务名称 */
(uint16_t )START_STK_SIZE, /* 任务堆栈大小 */
(void* )NULL, /* 传递给任务函数的参数 */
(UBaseType_t )START_TASK_PRIO, /* 任务优先级 */
(TaskHandle_t* )&StartTask_Handler); /* 任务句柄 */
vTaskStartScheduler(); /* 开启任务调度 */
}
void start_task(void *pvParameters)
{
taskENTER_CRITICAL(); /* 进入临界区 */
/* 创建LVGL任务 */
xTaskCreate((TaskFunction_t )lv_demo_task,
(const char* )"lv_demo_task",
(uint16_t )LV_DEMO_STK_SIZE,
(void* )NULL,
(UBaseType_t )LV_DEMO_TASK_PRIO,
(TaskHandle_t* )&LV_DEMOTask_Handler);
/* LED测试任务 */
xTaskCreate((TaskFunction_t )led_task,
(const char* )"led_task",
(uint16_t )LED_STK_SIZE,
(void* )NULL,
(UBaseType_t )LED_TASK_PRIO,
(TaskHandle_t* )&LEDTask_Handler);
taskEXIT_CRITICAL(); /* 退出临界区 */
vTaskDelete(StartTask_Handler); /* 删除开始任务 */
}
void lv_demo_task(void *pvParameters)
{
lv_demo_stress(); /* 测试的demo */
while(1)
{
lv_timer_handler(); /* LVGL计时器 */
vTaskDelay(5);
}
}
void lv_demo_stress(void)
{
lv_timer_create(obj_test_task_cb, TIME_STEP, NULL);
}
static void obj_test_task_cb(lv_timer_t * tmr)
{
(void) tmr; /*Unused*/
static int16_t state = -1;
lv_anim_t a;
lv_obj_t * obj;
// printf("step start: %d\n", state);
switch(state) {
case -1:
{
lv_res_t res = lv_mem_test();
if(res != LV_RES_OK) {
LV_LOG_ERROR("Memory integrity error");
}
lv_mem_monitor_t mon;
lv_mem_monitor(&mon);
if(mem_free_start == 0) mem_free_start = mon.free_size;
LV_LOG_USER("mem leak since start: %d, frag: %3d %%", mem_free_start - mon.free_size, mon.frag_pct);
}
break;
case 0:
/* Holder for all object types */
main_page = lv_obj_create(lv_scr_act());
lv_obj_set_size(main_page, LV_HOR_RES / 2 , LV_VER_RES);
lv_obj_set_flex_flow(main_page, LV_FLEX_FLOW_COLUMN);
obj = lv_btn_create(main_page);
lv_obj_set_size(obj, 100, 70);
obj = lv_label_create(obj);
lv_label_set_text(obj, "Multi line\n"LV_SYMBOL_OK LV_SYMBOL_CLOSE LV_SYMBOL_WIFI);
break;
case 1:
{
obj = lv_tabview_create(lv_scr_act(), LV_DIR_TOP, 50);
lv_obj_set_size(obj, LV_HOR_RES / 2, LV_VER_RES / 2);
lv_obj_align(obj, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
lv_obj_t * t = lv_tabview_add_tab(obj, "First");
t = lv_tabview_add_tab(obj, "Second");
lv_obj_t * c = lv_colorwheel_create(t, true);
lv_obj_set_size(c, 150, 150);
// c = lv_led_create(t, NULL);
// lv_obj_set_pos(c, 160, 20);
t = lv_tabview_add_tab(obj, LV_SYMBOL_EDIT " Edit");
t = lv_tabview_add_tab(obj, LV_SYMBOL_CLOSE);
lv_tabview_set_act(obj, 1, LV_ANIM_ON);
auto_del(obj, TIME_STEP * 5 + 30);
}
break;
case 2:
obj = lv_btn_create(main_page);
lv_obj_set_size(obj, 200, 70);
/*Move to disabled state very slowly*/
lv_obj_add_state(obj, LV_STATE_DISABLED);
/*Add an infinite width change animation*/
lv_anim_init(&a);
lv_anim_set_var(&a, obj);
lv_anim_set_time(&a, TIME_STEP * 2);
lv_anim_set_exec_cb(&a, set_width_anim);
lv_anim_set_values(&a, 100, 200);
lv_anim_set_playback_time(&a, TIME_STEP * 2);
lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
lv_anim_start(&a);
/*Delete the object a few sec later*/
auto_del(obj, TIME_STEP * 10);
obj = lv_label_create(obj);
lv_label_set_text_fmt(obj, "Formatted:\n%d %s", 12, "Volt");
break;
case 3:
ta = lv_textarea_create(lv_scr_act());
lv_obj_align_to(ta, main_page, LV_ALIGN_OUT_RIGHT_TOP, 10, 10);
lv_obj_set_size(ta, LV_HOR_RES / 3, LV_VER_RES / 4);
lv_textarea_set_placeholder_text(ta, "The placeholder");
break;
case 4:
obj = lv_btn_create(main_page);
lv_obj_set_size(obj, 100, 70);
lv_obj_set_style_bg_img_src(obj, LV_SYMBOL_DUMMY"Text from\nstyle", 0);
lv_obj_del_async(obj); /*Delete on next call of `lv_task_handler` (so not now)*/
// obj = lv_btn_create(main_page);
// lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
// lv_obj_set_style_bg_img_src(obj, LV_SYMBOL_LEFT);
// lv_obj_set_style_bg_img_opa(obj, LV_OPA_50);
// lv_obj_set_style_bg_img_tiled(obj, true);
// lv_obj_scroll_to_view(obj, LV_ANIM_ON);
break;
case 5:
lv_textarea_set_one_line(ta, true);
break;
case 6:
lv_obj_set_flex_flow(main_page, LV_FLEX_FLOW_COLUMN_WRAP);
break;
case 7:
obj = lv_bar_create(main_page);
lv_bar_set_range(obj, -1000, 2000);
lv_bar_set_value(obj, 1800, LV_ANIM_ON);
lv_bar_set_start_value(obj, -500, LV_ANIM_ON);
auto_del(obj, TIME_STEP * 2 + 70);
obj = lv_slider_create(main_page);
lv_obj_set_style_anim_time(obj, TIME_STEP * 8, 0);
lv_slider_set_value(obj, 5000, LV_ANIM_ON); /*Animate to out of range value*/
auto_del(obj, TIME_STEP * 5 + 22);
obj = lv_switch_create(main_page);
obj = lv_switch_create(main_page);
lv_obj_add_state(obj, LV_STATE_CHECKED);
auto_del(obj, 730);
break;
case 8:
obj = lv_win_create(lv_scr_act(), 50);
lv_obj_set_size(obj, LV_HOR_RES / 2, LV_VER_RES / 2);
lv_obj_align(obj, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
lv_win_add_title(obj, "Window title");
lv_win_add_btn(obj, LV_SYMBOL_CLOSE, 40);
lv_win_add_btn(obj, LV_SYMBOL_DOWN, 40);
auto_del(obj, TIME_STEP * 3 + 5);
obj = lv_calendar_create(lv_win_get_content(obj));
break;
case 9:
lv_textarea_set_text(ta, "A very very long text which will should make the text area scrollable"
"Here area some dummy sentences to be sure the text area will be really scrollable.");
break;
case 10:
obj = lv_keyboard_create(lv_scr_act());
lv_keyboard_set_mode(obj, LV_KEYBOARD_MODE_TEXT_UPPER);
lv_anim_init(&a);
lv_anim_set_var(&a, obj);
lv_anim_set_values(&a, LV_VER_RES, LV_VER_RES - lv_obj_get_height(obj));
lv_anim_set_time(&a, TIME_STEP + 3);
lv_anim_set_exec_cb(&a, set_y_anim);
lv_anim_start(&a);
auto_del(obj, TIME_STEP * 2 + 18);
break;
case 11:
obj = lv_dropdown_create(main_page);
lv_dropdown_set_options(obj, "Zero\nOne\nTwo\nThree\nFour\nFive\nSix\nSeven\nEight");
lv_dropdown_open(obj);
lv_dropdown_set_selected(obj, 2);
auto_del(obj, TIME_STEP * 3 + 11);
break;
case 12:
obj = lv_roller_create(main_page);
lv_roller_set_options(obj, "Zero\nOne\nTwo\nThree\nFour\nFive\nSix\nSeven\nEight", LV_ROLLER_MODE_INFINITE);
lv_roller_set_selected(obj, 2, LV_ANIM_ON);
auto_del(obj, TIME_STEP * 20 + 22);
break;
case 13:
obj = lv_arc_create(main_page);
lv_anim_init(&a);
lv_anim_set_var(&a, obj);
lv_anim_set_values(&a, 180, 400);
lv_anim_set_time(&a, TIME_STEP * 2);
lv_anim_set_delay(&a, TIME_STEP + 25);
lv_anim_set_playback_time(&a, TIME_STEP * 5);
lv_anim_set_repeat_count(&a, 3);
lv_anim_set_exec_cb(&a, arc_set_end_angle_anim);
lv_anim_start(&a);
obj = lv_meter_create(main_page);
lv_obj_scroll_to_view(obj, LV_ANIM_ON);
lv_meter_scale_t * scale = lv_meter_add_scale(obj);
lv_meter_add_needle_line(obj, scale, 3, lv_palette_main(LV_PALETTE_RED), -10);
auto_del(obj, TIME_STEP * 6 + 30);
break;
case 14:
obj = lv_msgbox_create(NULL, "Title", "Some text on the message box with average length", mbox_btns, true);
lv_timer_t * msgbox_tmr = lv_timer_create(msgbox_del, TIME_STEP * 5 + 30, obj);
lv_timer_set_repeat_count(msgbox_tmr, 1);
lv_obj_align(obj, LV_ALIGN_RIGHT_MID, -10, 0);
break;
case 15:
lv_textarea_set_one_line(ta, false);
break;
case 16:
{
lv_obj_t * tv = lv_tileview_create(lv_scr_act());
lv_obj_set_size(tv, 200, 200);
auto_del(tv, TIME_STEP * 4 + 5);
obj = lv_tileview_add_tile(tv, 0, 0, LV_DIR_ALL);
obj = lv_label_create(obj);
lv_label_set_text(obj, "Tile: 0;0");
obj = lv_tileview_add_tile(tv, 0, 1, LV_DIR_ALL);
obj = lv_label_create(obj);
lv_label_set_text(obj, "Tile: 0;1");
obj = lv_tileview_add_tile(tv, 1, 1, LV_DIR_ALL);
obj = lv_label_create(obj);
lv_label_set_text(obj, "Tile: 1;1");
lv_obj_set_tile_id(tv, 1, 1, LV_ANIM_ON);
}
break;
case 18:
obj = lv_list_create(main_page);
{
lv_obj_t * b;
b = lv_list_add_btn(obj, LV_SYMBOL_OK, "1. Some very long text to scroll");
auto_del(b, 10);
lv_list_add_btn(obj, LV_SYMBOL_OK, "2. Some very long text to scroll");
lv_list_add_btn(obj, LV_SYMBOL_OK, "3. Some very long text to scroll");
b = lv_list_add_btn(obj, LV_SYMBOL_OK, "4. Some very long text to scroll");
auto_del(b, TIME_STEP);
b = lv_list_add_btn(obj, LV_SYMBOL_OK, "5. Some very long text to scroll");
auto_del(b, TIME_STEP + 90);
b = lv_list_add_btn(obj, LV_SYMBOL_OK, "6. Some very long text to scroll");
auto_del(b, TIME_STEP + 10);
lv_obj_scroll_to_view(lv_obj_get_child(obj, -1), LV_ANIM_ON);
}
auto_del(obj, TIME_STEP * 5 + 15);
obj = lv_table_create(main_page);
lv_table_set_cell_value(obj, 0, 0, "0,0");
lv_table_set_cell_value_fmt(obj, 3, 0, "%d,%d", 5, 0);
lv_table_set_row_cnt(obj, 5);
lv_table_set_cell_value_fmt(obj, 1, 0, "%s", "1,0");
lv_table_set_cell_value(obj, 1, 3, "1,3");
break;
case 19:
lv_textarea_set_cursor_pos(ta, 10);
lv_textarea_set_text(ta, "__INSERTED TEXT" LV_SYMBOL_EDIT"__");
break;
case 20:
lv_obj_set_flex_flow(main_page, LV_FLEX_FLOW_ROW_WRAP);
break;
case 21:
lv_textarea_set_cursor_pos(ta, 0);
lv_textarea_add_char(ta, '0');
lv_textarea_add_char(ta, '1');
lv_textarea_add_char(ta, '2');
lv_textarea_add_char(ta, '3');
lv_textarea_add_char(ta, '4');
lv_textarea_add_char(ta, '5');
lv_textarea_add_char(ta, '6');
lv_textarea_add_char(ta, '7');
lv_textarea_add_char(ta, '8');
lv_textarea_add_char(ta, '9');
lv_textarea_add_char(ta, 'A');
lv_textarea_add_char(ta, 'B');
lv_textarea_add_char(ta, 'C');
lv_textarea_add_char(ta, 'D');
lv_textarea_add_char(ta, 'E');
lv_textarea_add_char(ta, 'F');
lv_textarea_add_text(ta, LV_SYMBOL_OK);
lv_textarea_add_text(ta, LV_SYMBOL_CLOSE);
lv_textarea_add_text(ta, LV_SYMBOL_COPY);
lv_textarea_add_text(ta, LV_SYMBOL_SAVE);
lv_textarea_add_text(ta, LV_SYMBOL_PASTE);
break;
case 22:
obj = lv_spinbox_create(main_page);
lv_spinbox_set_digit_format(obj, 6, 3);
lv_spinbox_set_value(obj, 5678);
lv_spinbox_set_step(obj, 10);
lv_spinbox_increment(obj);
lv_spinbox_increment(obj);
lv_spinbox_increment(obj);
lv_spinbox_set_step(obj, 100);
lv_spinbox_increment(obj);
lv_spinbox_increment(obj);
lv_spinbox_set_step(obj, 1);
lv_spinbox_increment(obj);
lv_spinbox_increment(obj);
auto_del(obj, TIME_STEP * 2 + 15);
lv_obj_scroll_by(main_page, 0, 20, LV_ANIM_ON);
break;
case 23:
obj = lv_chart_create(main_page);
{
lv_chart_series_t * s1 = lv_chart_add_series(obj, lv_palette_main(LV_PALETTE_RED), LV_CHART_AXIS_PRIMARY_Y);
lv_chart_set_next_value(obj, s1, 36);
lv_chart_set_next_value(obj, s1, -29);
lv_chart_set_next_value(obj, s1, 51);
lv_chart_set_next_value(obj, s1, 107);
lv_chart_set_next_value(obj, s1, 70);
lv_chart_set_next_value(obj, s1, 36);
lv_chart_set_next_value(obj, s1, -2);
lv_chart_set_next_value(obj, s1, 63);
lv_chart_set_next_value(obj, s1, 48);
lv_chart_set_next_value(obj, s1, 72);
auto_del(obj, TIME_STEP * 3);
}
lv_obj_scroll_by(main_page, 0, 20, LV_ANIM_ON);
break;
case 24:
obj = lv_checkbox_create(main_page);
lv_checkbox_set_text(obj, "An option to select");
auto_del(obj, TIME_STEP * 2 + 20);
obj = lv_checkbox_create(main_page);
lv_obj_add_state(obj, LV_STATE_CHECKED);
obj = lv_checkbox_create(main_page);
lv_obj_add_state(obj, LV_STATE_CHECKED | LV_STATE_DISABLED);
auto_del(obj, TIME_STEP * 1 + 60);
lv_obj_scroll_by(main_page, 0, 20, LV_ANIM_ON);
break;
case 25:
lv_textarea_set_cursor_pos(ta, 20);
{
uint16_t i;
for(i = 0; i < 64; i++) {
lv_textarea_del_char_forward(ta);
}
}
break;
case 26:
lv_textarea_set_one_line(ta, true);
break;
case 29:
lv_obj_clean(main_page);
lv_obj_del(ta);
ta = NULL;
break;
case 31:
lv_obj_clean(lv_scr_act());
main_page = NULL;
state = -2;
break;
default:
break;
}
// printf("step end: %d\n", state);
state ++;
}
LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void)
{
TIMER_TRACE("begin");
/*Avoid concurrent running of the timer handler*/
static bool already_running = false;
if(already_running) {
TIMER_TRACE("already running, concurrent calls are not allow, returning");
return 1;
}
already_running = true;
if(lv_timer_run == false) {
already_running = false; /*Release mutex*/
return 1;
}
static uint32_t idle_period_start = 0;
static uint32_t busy_time = 0;
uint32_t handler_start = lv_tick_get();
if(handler_start == 0) {
static uint32_t run_cnt = 0;
run_cnt++;
if(run_cnt > 100) {
run_cnt = 0;
LV_LOG_WARN("It seems lv_tick_inc() is not called.");
}
}
/*Run all timer from the list*/
lv_timer_t * next;
do {
timer_deleted = false;
timer_created = false;
LV_GC_ROOT(_lv_timer_act) = _lv_ll_get_head(&LV_GC_ROOT(_lv_timer_ll));
while(LV_GC_ROOT(_lv_timer_act)) {
/*The timer might be deleted if it runs only once ('repeat_count = 1')
*So get next element until the current is surely valid*/
next = _lv_ll_get_next(&LV_GC_ROOT(_lv_timer_ll), LV_GC_ROOT(_lv_timer_act));
if(lv_timer_exec(LV_GC_ROOT(_lv_timer_act))) {
/*If a timer was created or deleted then this or the next item might be corrupted*/
if(timer_created || timer_deleted) {
TIMER_TRACE("Start from the first timer again because a timer was created or deleted");
break;
}
}
LV_GC_ROOT(_lv_timer_act) = next; /*Load the next timer*/
}
} while(LV_GC_ROOT(_lv_timer_act));
uint32_t time_till_next = LV_NO_TIMER_READY;
next = _lv_ll_get_head(&LV_GC_ROOT(_lv_timer_ll));
while(next) {
if(!next->paused) {
uint32_t delay = lv_timer_time_remaining(next);
if(delay < time_till_next)
time_till_next = delay;
}
next = _lv_ll_get_next(&LV_GC_ROOT(_lv_timer_ll), next); /*Find the next timer*/
}
busy_time += lv_tick_elaps(handler_start);
uint32_t idle_period_time = lv_tick_elaps(idle_period_start);
if(idle_period_time >= IDLE_MEAS_PERIOD) {
idle_last = (busy_time * 100) / idle_period_time; /*Calculate the busy percentage*/
idle_last = idle_last > 100 ? 0 : 100 - idle_last; /*But we need idle time*/
busy_time = 0;
idle_period_start = lv_tick_get();
}
already_running = false; /*Release the mutex*/
TIMER_TRACE("finished (%d ms until the next timer call)", time_till_next);
return time_till_next;
}
测试结果:

三、内部字库读取
主函数
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */
lvgl_demo(); /* 运行FreeRTOS例程 */
}
void lvgl_demo(void)
{
lv_init(); /* lvgl系统初始化 */
lv_port_disp_init(); /* lvgl显示接口初始化,放在lv_init()的后面 */
lv_port_indev_init(); /* lvgl输入接口初始化,放在lv_init()的后面 */
xTaskCreate((TaskFunction_t )start_task, /* 任务函数 */
(const char* )"start_task", /* 任务名称 */
(uint16_t )START_STK_SIZE, /* 任务堆栈大小 */
(void* )NULL, /* 传递给任务函数的参数 */
(UBaseType_t )START_TASK_PRIO, /* 任务优先级 */
(TaskHandle_t* )&StartTask_Handler); /* 任务句柄 */
vTaskStartScheduler(); /* 开启任务调度 */
}
void start_task(void *pvParameters)
{
taskENTER_CRITICAL(); /* 进入临界区 */
/* 创建LVGL任务 */
xTaskCreate((TaskFunction_t )lv_demo_task,
(const char* )"lv_demo_task",
(uint16_t )LV_DEMO_STK_SIZE,
(void* )NULL,
(UBaseType_t )LV_DEMO_TASK_PRIO,
(TaskHandle_t* )&LV_DEMOTask_Handler);
/* LED测试任务 */
xTaskCreate((TaskFunction_t )led_task,
(const char* )"led_task",
(uint16_t )LED_STK_SIZE,
(void* )NULL,
(UBaseType_t )LED_TASK_PRIO,
(TaskHandle_t* )&LEDTask_Handler);
taskEXIT_CRITICAL(); /* 退出临界区 */
vTaskDelete(StartTask_Handler); /* 删除开始任务 */
}
void lv_demo_task(void *pvParameters)
{
lv_mainstart(); /* 测试的demo */
while(1)
{
lv_timer_handler(); /* LVGL计时器 */
vTaskDelay(5);
}
}
void lv_mainstart(void)
{
lv_obj_set_style_bg_color(lv_scr_act(),lv_palette_main(LV_PALETTE_BLUE),LV_STATE_DEFAULT); /* 设置背景颜色 */
font_label = lv_label_create(lv_scr_act());
lv_obj_set_style_text_font(font_label,&myFont14,LV_STATE_DEFAULT);
lv_label_set_text(font_label, "LVGL 正点原子内部字库读取");
lv_obj_center(font_label);
}
LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void)
{
TIMER_TRACE("begin");
/*Avoid concurrent running of the timer handler*/
static bool already_running = false;
if(already_running) {
TIMER_TRACE("already running, concurrent calls are not allow, returning");
return 1;
}
already_running = true;
if(lv_timer_run == false) {
already_running = false; /*Release mutex*/
return 1;
}
static uint32_t idle_period_start = 0;
static uint32_t busy_time = 0;
uint32_t handler_start = lv_tick_get();
if(handler_start == 0) {
static uint32_t run_cnt = 0;
run_cnt++;
if(run_cnt > 100) {
run_cnt = 0;
LV_LOG_WARN("It seems lv_tick_inc() is not called.");
}
}
/*Run all timer from the list*/
lv_timer_t * next;
do {
timer_deleted = false;
timer_created = false;
LV_GC_ROOT(_lv_timer_act) = _lv_ll_get_head(&LV_GC_ROOT(_lv_timer_ll));
while(LV_GC_ROOT(_lv_timer_act)) {
/*The timer might be deleted if it runs only once ('repeat_count = 1')
*So get next element until the current is surely valid*/
next = _lv_ll_get_next(&LV_GC_ROOT(_lv_timer_ll), LV_GC_ROOT(_lv_timer_act));
if(lv_timer_exec(LV_GC_ROOT(_lv_timer_act))) {
/*If a timer was created or deleted then this or the next item might be corrupted*/
if(timer_created || timer_deleted) {
TIMER_TRACE("Start from the first timer again because a timer was created or deleted");
break;
}
}
LV_GC_ROOT(_lv_timer_act) = next; /*Load the next timer*/
}
} while(LV_GC_ROOT(_lv_timer_act));
uint32_t time_till_next = LV_NO_TIMER_READY;
next = _lv_ll_get_head(&LV_GC_ROOT(_lv_timer_ll));
while(next) {
if(!next->paused) {
uint32_t delay = lv_timer_time_remaining(next);
if(delay < time_till_next)
time_till_next = delay;
}
next = _lv_ll_get_next(&LV_GC_ROOT(_lv_timer_ll), next); /*Find the next timer*/
}
busy_time += lv_tick_elaps(handler_start);
uint32_t idle_period_time = lv_tick_elaps(idle_period_start);
if(idle_period_time >= IDLE_MEAS_PERIOD) {
idle_last = (busy_time * 100) / idle_period_time; /*Calculate the busy percentage*/
idle_last = idle_last > 100 ? 0 : 100 - idle_last; /*But we need idle time*/
busy_time = 0;
idle_period_start = lv_tick_get();
}
already_running = false; /*Release the mutex*/
TIMER_TRACE("finished (%d ms until the next timer call)", time_till_next);
return time_till_next;
}
测试结果

四、基础对象
主函数
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */
lvgl_demo(); /* 运行FreeRTOS例程 */
}
void lvgl_demo(void)
{
lv_init(); /* lvgl系统初始化 */
lv_port_disp_init(); /* lvgl显示接口初始化,放在lv_init()的后面 */
lv_port_indev_init(); /* lvgl输入接口初始化,放在lv_init()的后面 */
xTaskCreate((TaskFunction_t )start_task, /* 任务函数 */
(const char* )"start_task", /* 任务名称 */
(uint16_t )START_STK_SIZE, /* 任务堆栈大小 */
(void* )NULL, /* 传递给任务函数的参数 */
(UBaseType_t )START_TASK_PRIO, /* 任务优先级 */
(TaskHandle_t* )&StartTask_Handler); /* 任务句柄 */
vTaskStartScheduler(); /* 开启任务调度 */
}
void start_task(void *pvParameters)
{
taskENTER_CRITICAL(); /* 进入临界区 */
/* 创建LVGL任务 */
xTaskCreate((TaskFunction_t )lv_demo_task,
(const char* )"lv_demo_task",
(uint16_t )LV_DEMO_STK_SIZE,
(void* )NULL,
(UBaseType_t )LV_DEMO_TASK_PRIO,
(TaskHandle_t* )&LV_DEMOTask_Handler);
/* LED测试任务 */
xTaskCreate((TaskFunction_t )led_task,
(const char* )"led_task",
(uint16_t )LED_STK_SIZE,
(void* )NULL,
(UBaseType_t )LED_TASK_PRIO,
(TaskHandle_t* )&LEDTask_Handler);
taskEXIT_CRITICAL(); /* 退出临界区 */
vTaskDelete(StartTask_Handler); /* 删除开始任务 */
}
void lv_demo_task(void *pvParameters)
{
lv_mainstart(); /* 测试的demo */
while(1)
{
lv_timer_handler(); /* LVGL计时器 */
vTaskDelay(5);
}
}
void lv_mainstart(void)
{
/* 动态获取屏幕大小 */
scr_act_width = lv_obj_get_width(lv_scr_act()); /* 获取活动屏幕的宽度 */
scr_act_height = lv_obj_get_height(lv_scr_act()); /* 获取活动屏幕的高度 */
/* 父对象 */
parent_obj = lv_obj_create(lv_scr_act()); /* 创建父对象 */
lv_obj_set_size(parent_obj, scr_act_width * 2/3, scr_act_height * 2/3); /* 设置父对象的大小 */
lv_obj_align(parent_obj, LV_ALIGN_TOP_MID, 0, 0); /* 设置父对象的位置:顶部居中 */
lv_obj_set_style_bg_color(parent_obj, lv_color_hex(0x99ccff), 0); /* 设置父对象的背景色:浅蓝色 */
lv_obj_add_event_cb(parent_obj, obj_event_cb, LV_EVENT_LONG_PRESSED, NULL); /* 为父对象添加事件:长按触发 */
/* 子对象 */
child_obj = lv_obj_create(parent_obj); /* 创建子对象 */
lv_obj_set_size(child_obj, scr_act_width / 3, scr_act_height / 3); /* 设置子对象的大小 */
lv_obj_align(child_obj, LV_ALIGN_CENTER, 0, 0); /* 设置子对象的位置:居中 */
lv_obj_set_style_bg_color(child_obj, lv_color_hex(0x003366), 0); /* 设置子对象的背景色:深蓝色 */
lv_obj_add_event_cb(child_obj, obj_event_cb, LV_EVENT_CLICKED, NULL); /* 为子对象添加事件:按下释放后触发 */
}
LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void)
{
TIMER_TRACE("begin");
/*Avoid concurrent running of the timer handler*/
static bool already_running = false;
if(already_running) {
TIMER_TRACE("already running, concurrent calls are not allow, returning");
return 1;
}
already_running = true;
if(lv_timer_run == false) {
already_running = false; /*Release mutex*/
return 1;
}
static uint32_t idle_period_start = 0;
static uint32_t busy_time = 0;
uint32_t handler_start = lv_tick_get();
if(handler_start == 0) {
static uint32_t run_cnt = 0;
run_cnt++;
if(run_cnt > 100) {
run_cnt = 0;
LV_LOG_WARN("It seems lv_tick_inc() is not called.");
}
}
/*Run all timer from the list*/
lv_timer_t * next;
do {
timer_deleted = false;
timer_created = false;
LV_GC_ROOT(_lv_timer_act) = _lv_ll_get_head(&LV_GC_ROOT(_lv_timer_ll));
while(LV_GC_ROOT(_lv_timer_act)) {
/*The timer might be deleted if it runs only once ('repeat_count = 1')
*So get next element until the current is surely valid*/
next = _lv_ll_get_next(&LV_GC_ROOT(_lv_timer_ll), LV_GC_ROOT(_lv_timer_act));
if(lv_timer_exec(LV_GC_ROOT(_lv_timer_act))) {
/*If a timer was created or deleted then this or the next item might be corrupted*/
if(timer_created || timer_deleted) {
TIMER_TRACE("Start from the first timer again because a timer was created or deleted");
break;
}
}
LV_GC_ROOT(_lv_timer_act) = next; /*Load the next timer*/
}
} while(LV_GC_ROOT(_lv_timer_act));
uint32_t time_till_next = LV_NO_TIMER_READY;
next = _lv_ll_get_head(&LV_GC_ROOT(_lv_timer_ll));
while(next) {
if(!next->paused) {
uint32_t delay = lv_timer_time_remaining(next);
if(delay < time_till_next)
time_till_next = delay;
}
next = _lv_ll_get_next(&LV_GC_ROOT(_lv_timer_ll), next); /*Find the next timer*/
}
busy_time += lv_tick_elaps(handler_start);
uint32_t idle_period_time = lv_tick_elaps(idle_period_start);
if(idle_period_time >= IDLE_MEAS_PERIOD) {
idle_last = (busy_time * 100) / idle_period_time; /*Calculate the busy percentage*/
idle_last = idle_last > 100 ? 0 : 100 - idle_last; /*But we need idle time*/
busy_time = 0;
idle_period_start = lv_tick_get();
}
already_running = false; /*Release the mutex*/
TIMER_TRACE("finished (%d ms until the next timer call)", time_till_next);
return time_till_next;
}
测试结果:

五、圆弧
void lv_example_arc1(void)
{
/* 根据活动屏幕宽度选择字体 */
if (scr_act_width() <= 480)
{
font = &lv_font_montserrat_14;
arc_width = 10;
}
else
{
font = &lv_font_montserrat_30;
arc_width = 20;
}
/* 左侧圆弧 */
arc_left = lv_arc_create(lv_scr_act()); /* 创建圆弧 */
lv_obj_set_size(arc_left, scr_act_height() * 3/8, scr_act_height() * 3/8); /* 设置大小 */
lv_obj_align(arc_left, LV_ALIGN_CENTER, -scr_act_width()/5, 0); /* 设置位置 */
lv_arc_set_value(arc_left, 0); /* 设置当前值 */
lv_obj_set_style_arc_width(arc_left, arc_width, LV_PART_MAIN); /* 设置背景弧宽度 */
lv_obj_set_style_arc_width(arc_left, arc_width, LV_PART_INDICATOR); /* 设置前景弧宽度 */
lv_obj_add_event_cb(arc_left, arc_event_cb, LV_EVENT_VALUE_CHANGED, NULL); /* 添加事件 */
/* 左侧百分比标签 */
label_left = lv_label_create(lv_scr_act()); /* 创建百分比标签 */
lv_obj_align(label_left, LV_ALIGN_CENTER, -scr_act_width()/5, 0); /* 设置位置 */
lv_label_set_text(label_left, "0%"); /* 设置文本 */
lv_obj_set_style_text_font(label_left, font, LV_STATE_DEFAULT); /* 设置字体 */
}
/**
* @brief 右侧圆弧
* @param 无
* @return 无
*/
void lv_example_arc2(void)
{
/* 右侧圆弧 */
arc_right = lv_arc_create(lv_scr_act()); /* 创建圆弧 */
lv_obj_set_size(arc_right, scr_act_height() * 3/8, scr_act_height() * 3/8); /* 设置大小 */
lv_obj_align(arc_right, LV_ALIGN_CENTER, scr_act_width()/5, 0); /* 设置位置 */
lv_arc_set_value(arc_right, 0); /* 设置当前值 */
lv_arc_set_bg_angles(arc_right, 0, 360); /* 设置背景弧角度 */
lv_arc_set_rotation(arc_right, 270); /* 设置旋转角度 */
lv_obj_remove_style(arc_right, NULL, LV_PART_KNOB); /* 去除旋钮 */
lv_obj_clear_flag(arc_right, LV_OBJ_FLAG_CLICKABLE); /* 去除可点击属性 */
lv_obj_set_style_arc_width(arc_right, arc_width, LV_PART_MAIN); /* 设置背景弧宽度 */
lv_obj_set_style_arc_width(arc_right, arc_width, LV_PART_INDICATOR); /* 设置前景弧宽度 */
/* 右侧百分比标签 */
label_right = lv_label_create(lv_scr_act()); /* 创建百分比标签 */
lv_obj_align(label_right, LV_ALIGN_CENTER, scr_act_width()/5, 0); /* 设置位置 */
lv_label_set_text(label_right, "0%"); /* 设置文本 */
lv_obj_set_style_text_font(label_right, font, LV_STATE_DEFAULT); /* 设置字体 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_arc1(); /* 左侧圆弧 */
lv_example_arc2(); /* 右侧圆弧 */
}
测试结果:

六、进度条
主函数
static void timer_cb(lv_timer_t *timer)
{
if(val < 100) /* 当前值小于100 */
{
val ++;
lv_bar_set_value(bar, val, LV_ANIM_ON); /* 设置当前值 */
lv_label_set_text_fmt(label_per, "%d %%", lv_bar_get_value(bar)); /* 获取当前值,更新显示 */
}
else /* 当前值大于等于100 */
{
lv_label_set_text(label_per, "finished!"); /* 加载完成 */
}
}
/**
* @brief 加载提示标签
* @param 无
* @return 无
*/
static void lv_example_label(void)
{
/* 根据活动屏幕宽度选择字体 */
if (scr_act_width() <= 480)
{
font = &lv_font_montserrat_14;
}
else
{
font = &lv_font_montserrat_20;
}
/* 加载标题标签 */
label_load = lv_label_create(lv_scr_act());
lv_label_set_text(label_load, "LOADING...");
lv_obj_set_style_text_font(label_load, font, LV_STATE_DEFAULT);
lv_obj_align(label_load, LV_ALIGN_CENTER, 0, -scr_act_height() / 10 );
/* 百分比标签 */
label_per = lv_label_create(lv_scr_act());
lv_label_set_text(label_per, "%0");
lv_obj_set_style_text_font(label_per, font, LV_STATE_DEFAULT);
lv_obj_align(label_per, LV_ALIGN_CENTER, 0, scr_act_height() / 10 );
}
/**
* @brief 加载进度条
* @param 无
* @return 无
*/
static void lv_example_bar(void)
{
bar = lv_bar_create(lv_scr_act()); /* 创建进度条 */
lv_obj_set_align(bar, LV_ALIGN_CENTER); /* 设置位置 */
lv_obj_set_size(bar, scr_act_width() * 3 / 5, 20); /* 设置大小 */
lv_obj_set_style_anim_time(bar, 100, LV_STATE_DEFAULT); /* 设置动画时间 */
lv_timer_create(timer_cb, 100, NULL); /* 初始化定时器 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_label(); /* 加载提示标签 */
lv_example_bar(); /* 加载进度条 */
}
测试结果:

七、按钮
static void btn_event_cb(lv_event_t * e)
{
lv_obj_t *target = lv_event_get_target(e); /* 获取触发源 */
if(target == btn_speed_up) /* 加速按钮 */
{
speed_val += 30;
}
else if(target == btn_speed_down) /* 减速按钮 */
{
speed_val -= 30;
}
else if(target == btn_stop) /* 急停按钮 */
{
speed_val = 0;
}
lv_label_set_text_fmt(label_speed, "Speed : %d RPM", speed_val); /* 更新速度值 */
}
/**
* @brief 速度值提示标签
* @param 无
* @return 无
*/
static void lv_example_label(void)
{
/* 根据活动屏幕宽度选择字体 */
if (scr_act_width() <= 320)
{
font = &lv_font_montserrat_10;
}
else if (scr_act_width() <= 480)
{
font = &lv_font_montserrat_14;
}
else
{
font = &lv_font_montserrat_20;
}
label_speed = lv_label_create(lv_scr_act()); /* 创建速度显示标签 */
lv_obj_set_style_text_font(label_speed, font, LV_PART_MAIN); /* 设置字体 */
lv_label_set_text(label_speed, "Speed : 0 RPM"); /* 设置文本 */
lv_obj_align(label_speed, LV_ALIGN_CENTER, 0, -scr_act_height() / 3); /* 设置标签位置 */
}
/**
* @brief 加速按钮
* @param 无
* @return 无
*/
static void lv_example_btn_up(void)
{
btn_speed_up = lv_btn_create(lv_scr_act()); /* 创建加速按钮 */
lv_obj_set_size(btn_speed_up, scr_act_width() / 4, scr_act_height() / 6); /* 设置按钮大小 */
lv_obj_align(btn_speed_up, LV_ALIGN_CENTER, -scr_act_width() / 3, 0); /* 设置按钮位置 */
lv_obj_add_event_cb(btn_speed_up, btn_event_cb, LV_EVENT_CLICKED, NULL); /* 设置按钮事件 */
lv_obj_t* label = lv_label_create(btn_speed_up); /* 创建加速按钮标签 */
lv_obj_set_style_text_font(label, font, LV_PART_MAIN); /* 设置字体 */
lv_label_set_text(label, "Speed +"); /* 设置标签文本 */
lv_obj_set_align(label,LV_ALIGN_CENTER); /* 设置标签位置 */
}
/**
* @brief 减速按钮
* @param 无
* @return 无
*/
static void lv_example_btn_down(void)
{
btn_speed_down = lv_btn_create(lv_scr_act()); /* 创建加速按钮 */
lv_obj_set_size(btn_speed_down, scr_act_width() / 4, scr_act_height() / 6); /* 设置按钮大小 */
lv_obj_align(btn_speed_down, LV_ALIGN_CENTER, 0, 0); /* 设置按钮位置 */
lv_obj_add_event_cb(btn_speed_down, btn_event_cb, LV_EVENT_CLICKED, NULL); /* 设置按钮事件 */
lv_obj_t* label = lv_label_create(btn_speed_down); /* 创建减速按钮标签 */
lv_obj_set_style_text_font(label, font, LV_PART_MAIN); /* 设置字体 */
lv_label_set_text(label, "Speed -"); /* 设置标签文本 */
lv_obj_set_align(label,LV_ALIGN_CENTER); /* 设置标签位置 */
}
/**
* @brief 急停按钮
* @param 无
* @return 无
*/
static void lv_example_btn_stop(void)
{
btn_stop = lv_btn_create(lv_scr_act()); /* 创建急停按钮 */
lv_obj_set_size(btn_stop, scr_act_width() / 4, scr_act_height() / 6); /* 设置按钮大小 */
lv_obj_align(btn_stop, LV_ALIGN_CENTER, scr_act_width() / 3, 0); /* 设置按钮位置 */
lv_obj_set_style_bg_color(btn_stop, lv_color_hex(0xef5f60), LV_STATE_DEFAULT); /* 设置按钮背景颜色(默认) */
lv_obj_set_style_bg_color(btn_stop, lv_color_hex(0xff0000), LV_STATE_PRESSED); /* 设置按钮背景颜色(按下) */
lv_obj_add_event_cb(btn_stop, btn_event_cb, LV_EVENT_CLICKED, NULL); /* 设置按钮事件 */
lv_obj_t* label = lv_label_create(btn_stop); /* 创建急停按钮标签 */
lv_obj_set_style_text_font(label, font, LV_PART_MAIN); /* 设置字体 */
lv_label_set_text(label, "Stop"); /* 设置标签文本 */
lv_obj_set_align(label,LV_ALIGN_CENTER); /* 设置标签位置 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_label(); /* 速度提示标签 */
lv_example_btn_up(); /* 加速按钮 */
lv_example_btn_down(); /* 减速按钮 */
lv_example_btn_stop(); /* 急停按钮 */
}
测试结果

八、按钮矩阵
主函数
static void btnm_event_cb(lv_event_t* e)
{
uint8_t id;
lv_event_code_t code = lv_event_get_code(e); /* 获取事件类型 */
lv_obj_t *target = lv_event_get_target(e); /* 获取触发源 */
if (code == LV_EVENT_VALUE_CHANGED)
{
id = lv_btnmatrix_get_selected_btn(target); /* 获取按键索引 */
lv_label_set_text(label_input, lv_btnmatrix_get_btn_text(target, id)); /* 更新输入框标签文本 */
lv_obj_align_to(label_input, obj_input, LV_ALIGN_CENTER, 0, 0); /* 设置标签位置 */
}
}
/**
* @brief 密码输入界面
* @param 无
* @return 无
*/
static void lv_example_btnmatrix(void)
{
/* 根据屏幕宽度选择字体和图片缩放系数 */
if (scr_act_width() <= 480)
{
font = &lv_font_montserrat_14;
zoom_val = 128;
}
else
{
font = &lv_font_montserrat_30;
zoom_val = 256;
}
/* 图片显示 */
lv_obj_t *img = lv_img_create(lv_scr_act()); /* 创建图片部件 */
lv_img_set_src(img, &img_user); /* 设置图片源 */
lv_img_set_zoom(img, zoom_val); /* 设置图片缩放 */
lv_obj_align(img, LV_ALIGN_CENTER, -scr_act_width()/4, -scr_act_height()/7); /* 设置位置 */
lv_obj_set_style_img_recolor(img, lv_color_hex(0xf2f2f2),0); /* 设置重新着色 */
lv_obj_set_style_img_recolor_opa(img,100,0); /* 设置着色透明度 */
/* 用户标签 */
lv_obj_t *label_user = lv_label_create(lv_scr_act()); /* 创建标签 */
lv_label_set_text(label_user, "USER"); /* 设置文本 */
lv_obj_set_style_text_font(label_user, font, LV_PART_MAIN); /* 设置字体 */
lv_obj_set_style_text_align(label_user, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN); /* 设置文本居中 */
lv_obj_align_to(label_user, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); /* 设置位置 */
/* 输入框背景 */
obj_input = lv_obj_create(lv_scr_act()); /* 创建基础对象 */
lv_obj_set_size(obj_input, scr_act_width()/4, scr_act_height()/12); /* 设置大小 */
lv_obj_align_to(obj_input, label_user, LV_ALIGN_OUT_BOTTOM_MID, 0, scr_act_height()/20); /* 设置位置 */
lv_obj_set_style_bg_color(obj_input, lv_color_hex(0xcccccc),0); /* 设置背景颜色 */
lv_obj_set_style_bg_opa(obj_input, 150,0); /* 设置透明度 */
lv_obj_set_style_border_width(obj_input, 0 , 0); /* 去除边框 */
lv_obj_set_style_radius(obj_input, 20, 0); /* 设置圆角 */
lv_obj_remove_style(obj_input, NULL, LV_PART_SCROLLBAR); /* 移除滚动条 */
/* 输入框文本标签 */
label_input = lv_label_create(lv_scr_act()); /* 创建标签 */
lv_label_set_text(label_input, ""); /* 设置文本 */
lv_obj_set_style_text_font(label_input, font, LV_PART_MAIN); /* 设置字体 */
lv_obj_set_style_text_align(label_input, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN); /* 设置文本居中 */
lv_obj_align_to(label_input, obj_input, LV_ALIGN_CENTER, 0, 0); /* 设置位置 */
/* 分隔线 */
lv_obj_t *line = lv_line_create(lv_scr_act()); /* 创建线条 */
lv_line_set_points(line, points, 2); /* 设置线条坐标点 */
lv_obj_align(line, LV_ALIGN_CENTER, 0, 0); /* 设置位置 */
lv_obj_set_style_line_color(line, lv_color_hex(0xcdcdcd),0); /* 设置线条颜色 */
/* 按钮矩阵(创建) */
lv_obj_t *btnm = lv_btnmatrix_create(lv_scr_act()); /* 创建按钮矩阵 */
lv_obj_set_size(btnm, scr_act_width()* 2/5, scr_act_width()* 2/5); /* 设置大小 */
lv_btnmatrix_set_map(btnm, num_map); /* 设置按钮 */
lv_obj_align(btnm, LV_ALIGN_RIGHT_MID, -scr_act_width()/16, 0); /* 设置位置 */
lv_obj_set_style_text_font(btnm, font, LV_PART_ITEMS); /* 设置字体 */
/* 按钮矩阵(优化界面) */
lv_obj_set_style_border_width(btnm, 0, LV_PART_MAIN); /* 去除主体边框 */
lv_obj_set_style_bg_opa(btnm, 0, LV_PART_MAIN); /* 设置主体背景透明度 */
lv_obj_set_style_bg_opa(btnm, 0, LV_PART_ITEMS); /* 设置按钮背景透明度 */
lv_obj_set_style_shadow_width(btnm, 0, LV_PART_ITEMS); /* 去除按钮阴影 */
lv_obj_add_event_cb(btnm, btnm_event_cb, LV_EVENT_VALUE_CHANGED, NULL); /* 设置按钮矩阵回调 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_btnmatrix();
}
测试结果

九、复选框
static void checkbox_event_cb(lv_event_t *e)
{
lv_obj_t *target = lv_event_get_target(e); /* 获取触发源 */
if(target == checkbox1) /* 复选框1触发 */
{
lv_obj_has_state(checkbox1, LV_STATE_CHECKED) ? (aggregate += 19) : (aggregate -= 19);
}
else if(target == checkbox2) /* 复选框2触发 */
{
lv_obj_has_state(checkbox2, LV_STATE_CHECKED) ? (aggregate += 29) : (aggregate -= 29);
}
lv_label_set_text_fmt(label_aggregate, "Aggregate : $%d", aggregate); /* 更新总价格标签 */
}
/**
* @brief 标题、总价格标签
* @param 无
* @return 无
*/
static void lv_example_label(void)
{
/* 根据活动屏幕宽度选择字体 */
if (scr_act_width() <= 480)
{
font = &lv_font_montserrat_14;
}
else
{
font = &lv_font_montserrat_20;
}
/* 菜单标题标签 */
label_menu = lv_label_create(lv_scr_act());
lv_label_set_text(label_menu, "MENU");
lv_obj_set_style_text_font(label_menu, font, LV_STATE_DEFAULT);
lv_obj_align(label_menu, LV_ALIGN_CENTER, 0, -scr_act_height() * 2 / 5 );
/* 总价格标签 */
label_aggregate = lv_label_create(lv_scr_act());
lv_label_set_text(label_aggregate, "Aggregate : $0");
lv_obj_set_style_text_font(label_aggregate, font, LV_STATE_DEFAULT);
lv_obj_align(label_aggregate, LV_ALIGN_CENTER, 0, scr_act_height() * 2 / 5 );
}
/**
* @brief 菜品复选框
* @param 无
* @return 无
*/
static void lv_example_checkbox(void)
{
/* 创建基础对象作为背景 */
lv_obj_t *obj = lv_obj_create(lv_scr_act());
lv_obj_set_size(obj, scr_act_width() * 4 /5 , scr_act_height() * 3 /5);
lv_obj_align(obj, LV_ALIGN_CENTER, 0 , 0);
/* 菜品1复选框 */
checkbox1 = lv_checkbox_create(obj);
lv_checkbox_set_text(checkbox1, "Roast chicken $19");
lv_obj_set_style_text_font(checkbox1, font, LV_STATE_DEFAULT);
lv_obj_align(checkbox1, LV_ALIGN_LEFT_MID, 0, -scr_act_height() / 5 );
lv_obj_add_event_cb(checkbox1, checkbox_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
/* 菜品2复选框 */
checkbox2 = lv_checkbox_create(obj);
lv_checkbox_set_text(checkbox2, "Roast duck $29");
lv_obj_set_style_text_font(checkbox2, font, LV_STATE_DEFAULT);
lv_obj_align_to(checkbox2, checkbox1, LV_ALIGN_OUT_BOTTOM_LEFT, 0, scr_act_height() / 16);
lv_obj_add_event_cb(checkbox2, checkbox_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
/* 菜品3复选框 */
checkbox3 = lv_checkbox_create(obj);
lv_checkbox_set_text(checkbox3, "Roast fish $39");
lv_obj_set_style_text_font(checkbox3, font, LV_STATE_DEFAULT);
lv_obj_align_to(checkbox3, checkbox2, LV_ALIGN_OUT_BOTTOM_LEFT, 0, scr_act_height() / 16);
lv_obj_add_state(checkbox3, LV_STATE_DISABLED);
/* 菜品4复选框 */
checkbox4 = lv_checkbox_create(obj);
lv_checkbox_set_text(checkbox4, "Roast lamb $69");
lv_obj_set_style_text_font(checkbox4, font, LV_STATE_DEFAULT);
lv_obj_align_to(checkbox4, checkbox3, LV_ALIGN_OUT_BOTTOM_LEFT, 0, scr_act_height() / 16);
lv_obj_add_state(checkbox4, LV_STATE_DISABLED);
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_label(); /* 菜单标题、总价标签 */
lv_example_checkbox(); /* 菜品复选框 */
}
测试结果

十、下拉列表
主函数
static void dropdown_event_cb(lv_event_t* e)
{
lv_event_code_t code = lv_event_get_code(e); /* 获取事件类型 */
lv_obj_t *dropdown = lv_event_get_target(e); /* 获取触发源 */
if (LV_EVENT_VALUE_CHANGED == code) /* 判断事件类型 */
{
char buf[10];
lv_dropdown_get_selected_str(dropdown, buf, sizeof(buf)); /* 获取当前选项文本 */
lv_label_set_text(label, buf); /* 显示当前选项文本 */
}
}
/**
* @brief 例1
* @param 无
* @return 无
*/
static void lv_example_dropdown_1(void)
{
/* 根据屏幕宽度选择字体和列表宽度 */
if (scr_act_width() <= 320)
{
dropdown_font = &lv_font_montserrat_14;
dropdown_width = 90;
}
else if (scr_act_width() <= 480)
{
dropdown_font = &lv_font_montserrat_18;
dropdown_width = 120;
}
else
{
dropdown_font = &lv_font_montserrat_22;
dropdown_width = 150;
}
lv_obj_t* dropdown = lv_dropdown_create(lv_scr_act()); /* 定义并创建下拉列表 */
lv_dropdown_set_options_static(dropdown, options); /* 添加下拉列表选项 */
lv_obj_set_style_text_font(dropdown, dropdown_font, LV_PART_MAIN); /* 设置下拉列表字体 */
lv_obj_set_width(dropdown, dropdown_width); /* 设置下拉列表宽度 */
lv_obj_align(dropdown, LV_ALIGN_CENTER, -scr_act_width() / 3, 0); /* 设置下拉列表位置 */
label = lv_label_create(lv_scr_act()); /* 定义并创建标签 */
lv_obj_set_style_text_font(label, dropdown_font, LV_PART_MAIN); /* 设置标签表字体 */
lv_obj_set_width(label, dropdown_width); /* 设置标签宽度 */
lv_obj_align_to(label, dropdown, LV_ALIGN_OUT_TOP_MID, 15, -scr_act_height() / 8); /* 设置标签位置 */
lv_label_set_text(label, "option 1"); /* 设置标签文本 */
lv_obj_add_event_cb(dropdown, dropdown_event_cb, LV_EVENT_VALUE_CHANGED, NULL); /* 添加下拉列表回调 */
}
/**
* @brief 例2
* @param 无
* @return 无
*/
static void lv_example_dropdown_2(void)
{
lv_obj_t* dropdown; /* 定义下拉列表 */
dropdown = lv_dropdown_create(lv_scr_act()); /* 创建下拉列表 */
lv_dropdown_set_options_static(dropdown, options); /* 添加下拉列表选项 */
lv_obj_set_style_text_font(dropdown, dropdown_font, LV_PART_MAIN); /* 设置下拉列表字体 */
lv_obj_set_width(dropdown, dropdown_width); /* 设置下拉列表宽度 */
lv_dropdown_set_dir(dropdown, LV_DIR_BOTTOM); /* 设置下拉列表方向 */
lv_dropdown_set_symbol(dropdown, LV_SYMBOL_DOWN); /* 设置下拉列表符号 */
lv_obj_align(dropdown, LV_ALIGN_CENTER, scr_act_width() / 8, -3 * scr_act_height() / 8); /* 设置下拉列表位置 */
dropdown = lv_dropdown_create(lv_scr_act()); /* 创建下拉列表 */
lv_dropdown_set_options_static(dropdown, options); /* 添加下拉列表选项 */
lv_obj_set_style_text_font(dropdown, dropdown_font, LV_PART_MAIN); /* 设置下拉列表字体 */
lv_obj_set_width(dropdown, dropdown_width); /* 设置下拉列表宽度 */
lv_dropdown_set_dir(dropdown, LV_DIR_LEFT); /* 设置下拉列表方向 */
lv_dropdown_set_symbol(dropdown, LV_SYMBOL_LEFT); /* 设置下拉列表符号 */
lv_obj_align(dropdown, LV_ALIGN_CENTER, scr_act_width() / 8, -1 * scr_act_height() / 8); /* 设置下拉列表位置 */
dropdown = lv_dropdown_create(lv_scr_act()); /* 创建下拉列表 */
lv_dropdown_set_options_static(dropdown, options); /* 添加下拉列表选项 */
lv_obj_set_style_text_font(dropdown, dropdown_font, LV_PART_MAIN); /* 设置下拉列表字体 */
lv_obj_set_width(dropdown, dropdown_width); /* 设置下拉列表宽度 */
lv_dropdown_set_dir(dropdown, LV_DIR_RIGHT); /* 设置下拉列表方向 */
lv_dropdown_set_symbol(dropdown, LV_SYMBOL_RIGHT); /* 设置下拉列表符号 */
lv_obj_align(dropdown, LV_ALIGN_CENTER, scr_act_width() / 8, 1 * scr_act_height() / 8); /* 设置下拉列表位置 */
dropdown = lv_dropdown_create(lv_scr_act()); /* 创建下拉列表 */
lv_dropdown_set_options_static(dropdown, options); /* 添加下拉列表选项 */
lv_obj_set_style_text_font(dropdown, dropdown_font, LV_PART_MAIN); /* 设置下拉列表字体 */
lv_obj_set_width(dropdown, dropdown_width); /* 设置下拉列表宽度 */
lv_dropdown_set_dir(dropdown, LV_DIR_TOP); /* 设置下拉列表方向 */
lv_dropdown_set_symbol(dropdown, LV_SYMBOL_UP); /* 设置下拉列表符号 */
lv_obj_align(dropdown, LV_ALIGN_CENTER, scr_act_width() / 8, 3 * scr_act_height() / 8); /* 设置下拉列表位置 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_dropdown_1();
lv_example_dropdown_2();
}
测试结果

十一、图片
主函数
static void slider_event_cb(lv_event_t *e)
{
lv_img_set_zoom(img, lv_slider_get_value(slider_zoom)); /* 设置图片缩放 */
lv_img_set_angle(img, lv_slider_get_value(slider_angle)); /* 设置图片旋转角度 */
/* 设置图片重新着色 */
lv_obj_set_style_img_recolor(img,
lv_color_make(lv_slider_get_value(slider_r), lv_slider_get_value(slider_g), lv_slider_get_value(slider_b)),
LV_PART_MAIN);
lv_obj_set_style_img_recolor_opa(img, lv_slider_get_value(slider_opa), LV_PART_MAIN); /* 设置重新着色透明度 */
}
/**
* @brief 创建滑块
* @param color:颜色值
* @return *slider:创建成功的滑块部件
*/
static lv_obj_t *my_slider_create(lv_color_t color)
{
lv_obj_t *slider = lv_slider_create(lv_scr_act()); /* 创建滑块 */
lv_obj_set_height(slider, scr_act_height() / 20); /* 设置高度 */
lv_obj_set_width(slider, scr_act_width() / 3); /* 设置宽度 */
lv_obj_remove_style(slider, NULL, LV_PART_KNOB); /* 移除旋钮 */
lv_obj_set_style_bg_color(slider,color,LV_PART_INDICATOR); /* 设置滑块指示器颜色 */
lv_obj_set_style_bg_color(slider,lv_color_darken(color, 100),LV_PART_MAIN); /* 设置滑块主体颜色、透明度 */
lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL); /* 设置滑块回调 */
return slider;
}
/**
* @brief 图片部件实例
* @param 无
* @return 无
*/
static void lv_example_img(void)
{
img = lv_img_create(lv_scr_act()); /* 创建图片部件 */
lv_img_set_src(img, &img_gear); /* 设置图片源 */
lv_obj_align(img, LV_ALIGN_CENTER, -scr_act_width() / 5, 0); /* 设置图片位置 */
lv_obj_update_layout(img); /* 更新图片参数 */
/* 图片缩放控制滑块 */
slider_zoom = my_slider_create(lv_color_hex(0x989c98)); /* 创建滑块 */
lv_slider_set_range(slider_zoom, 128, 512); /* 设置滑块的范围 */
lv_slider_set_value(slider_zoom, 256, LV_ANIM_OFF); /* 设置滑块的值 */
lv_obj_align(slider_zoom, LV_ALIGN_CENTER, scr_act_width() / 4, -scr_act_height() / 4); /* 设置滑块位置 */
/* 旋转角度控制滑块 */
slider_angle = my_slider_create(lv_color_hex(0x989c98)); /* 创建滑块 */
lv_slider_set_range(slider_angle, 0, 3600); /* 设置滑块的范围 */
lv_obj_align_to(slider_angle, slider_zoom, LV_ALIGN_OUT_BOTTOM_LEFT, 0, scr_act_height() / 20); /* 设置滑块位置 */
/* 红色通道控制滑块 */
slider_r = my_slider_create(lv_color_hex(0xff0000)); /* 创建滑块 */
lv_slider_set_range(slider_r, 0, 255); /* 设置滑块的范围 */
lv_obj_align_to(slider_r, slider_angle, LV_ALIGN_OUT_BOTTOM_LEFT, 0, scr_act_height() / 20); /* 设置滑块位置 */
/* 绿色通道控制滑块 */
slider_g = my_slider_create(lv_color_hex(0x00ff00)); /* 创建滑块 */
lv_slider_set_range(slider_g, 0, 255); /* 设置滑块的范围 */
lv_obj_align_to(slider_g, slider_r, LV_ALIGN_OUT_BOTTOM_LEFT, 0, scr_act_height() / 20); /* 设置滑块位置 */
/* 蓝色通道控制滑块 */
slider_b = my_slider_create(lv_color_hex(0x0000ff)); /* 创建滑块 */
lv_slider_set_range(slider_b, 0, 255); /* 设置滑块的范围 */
lv_obj_align_to(slider_b, slider_g, LV_ALIGN_OUT_BOTTOM_LEFT, 0, scr_act_height() / 20); /* 设置滑块位置 */
/* 着色透明度控制滑块 */
slider_opa = my_slider_create(lv_color_hex(0x000000)); /* 创建滑块 */
lv_slider_set_range(slider_opa, 0, 255); /* 设置滑块的范围 */
lv_slider_set_value(slider_opa, 150, LV_ANIM_OFF); /* 设置滑块的值 */
lv_obj_align_to(slider_opa, slider_b, LV_ALIGN_OUT_BOTTOM_LEFT, 0, scr_act_height() / 20); /* 设置滑块位置 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_img();
}
测试结果

十二、标签
主函数
static void lv_example_label_1(void)
{
if (scr_act_width() <= 320)
font = &lv_font_montserrat_10;
else if (scr_act_width() <= 480)
font = &lv_font_montserrat_14;
else
font = &lv_font_montserrat_20;
lv_obj_t* label = lv_label_create(lv_scr_act()); /* 定义并创建标签 */
lv_label_set_text(label, "#0000ff Re-color# #ff00ff words# #ff0000 of a# " /* 设置标签文本 */
"label, align the lines to the center"
"and wrap long text automatically.");
lv_label_set_recolor(label, true); /* 启用标签文本重新着色 */
lv_obj_set_style_text_font(label, font, LV_PART_MAIN); /* 设置标签文本字体 */
lv_obj_set_width(label, scr_act_width() / 3); /* 设置标签宽度 */
lv_obj_align(label, LV_ALIGN_CENTER, -scr_act_width() / 3, 0); /* 设置标签位置 */
lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN); /* 设置标签文本对齐方式 */
}
/**
* @brief 例2
* @param 无
* @return 无
*/
static void lv_example_label_2(void)
{
lv_obj_t* label = lv_label_create(lv_scr_act()); /* 定义并创建标签 */
lv_label_set_text(label, "It is a circularly scrolling text. "); /* 设置标签文本 */
lv_obj_set_style_text_font(label, font, LV_PART_MAIN); /* 设置标签文本字体 */
lv_obj_set_width(label, scr_act_width() / 3); /* 设置标签宽度 */
lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR); /* 设置标签长模式:循环滚动 */
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0); /* 设置标签位置 */
}
/**
* @brief 例3
* @param 无
* @return 无
*/
static void lv_example_label_3(void)
{
lv_obj_t* label = lv_label_create(lv_scr_act()); /* 定义并创建标签 */
lv_label_set_text_fmt(label, "Label can set text like %s", "printf"); /* 设置标签文本 */
lv_obj_set_style_text_font(label, font, LV_PART_MAIN); /* 设置标签文本字体 */
lv_obj_set_width(label, scr_act_width() / 3); /* 设置标签宽度 */
lv_obj_align(label, LV_ALIGN_CENTER, scr_act_width() / 3, 0); /* 设置标签位置 */
lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN); /* 设置标签文本对齐方式 */
lv_obj_t* label_shadow = lv_label_create(lv_scr_act()); /* 定义并创建阴影标签 */
lv_label_set_text(label_shadow, lv_label_get_text(label)); /* 设置标签文本 */
lv_obj_set_style_text_font(label_shadow, font, LV_PART_MAIN); /* 设置标签文本字体 */
lv_obj_set_width(label_shadow, scr_act_width() / 3); /* 设置标签宽度 */
lv_obj_set_style_text_opa(label_shadow, LV_OPA_30, LV_PART_MAIN); /* 设置标签文本透明度 */
lv_obj_set_style_text_color(label_shadow, lv_color_black(), LV_PART_MAIN); /* 设置标签文本颜色 */
lv_obj_set_style_text_align(label_shadow, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN); /* 设置标签文本对齐方式 */
lv_obj_align_to(label_shadow, label, LV_ALIGN_TOP_LEFT, 3, 3); /* 设置标签位置 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_label_1();
lv_example_label_2();
lv_example_label_3();
}
测试结果

十三、线条
主函数
static void create_sin_buf(uint16_t maxval, uint16_t samples)
{
uint16_t i;
float y = 0;
/*
* 正弦波最小正周期为2π,约等于2 * 3.1415926
* 曲线上相邻的两个点在x轴上的间隔 = 2 * 3.1415926 / 采样点数量
*/
float inc = (2 * 3.1415926) / samples; /* 计算相邻两个点的x轴间隔 */
for (i = 0; i < samples; i++) /* 连续产生samples个点 */
{
/*
* 正弦波函数解析式:y = Asin(wx + φ)+ b
* 计算每个点的y值,将峰值放大maxval倍,并将曲线向上偏移maxval到正数区域
*/
y = maxval * sin(inc * i) + maxval;
sin_line_points[i].x = 2 * i; /* 存入x轴坐标 */
sin_line_points[i].y = y; /* 存入y轴坐标 */
}
}
/**
* @brief 正弦波实例
* @param 无
* @return 无
*/
static void lv_example_line(void)
{
/* 根据活动屏幕宽度选择字体 */
if (scr_act_width() <= 480)
{
font = &lv_font_montserrat_14;
}
else
{
font = &lv_font_montserrat_30;
}
/* 标题 */
lv_obj_t *label = lv_label_create(lv_scr_act()); /* 创建标签 */
lv_label_set_text(label, "Line"); /* 设置文本内容 */
lv_obj_set_style_text_font(label, font, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_align(label, LV_ALIGN_TOP_LEFT, scr_act_width() / 20, scr_act_height()/16); /* 设置位置 */
/* 直线(用作下划线)*/
lv_obj_t *straigh_line = lv_line_create(lv_scr_act()); /* 创建线条 */
lv_line_set_points(straigh_line, straigh_line_points, 2); /* 设置线条坐标点 */
lv_obj_align_to(straigh_line, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0); /* 设置位置 */
/* 正弦波 */
lv_obj_t *sin_line = lv_line_create(lv_scr_act()); /* 创建线条 */
create_sin_buf(scr_act_height()/4, SIN_POINTS_NUM); /* 产生正弦波坐标点 */
lv_line_set_points(sin_line, sin_line_points, SIN_POINTS_NUM); /* 设置线条坐标点 */
lv_obj_center(sin_line); /* 设置位置 */
lv_obj_set_style_line_width(sin_line, 8, LV_PART_MAIN); /* 设置线的宽度 */
lv_obj_set_style_line_color(sin_line, lv_palette_main(LV_PALETTE_BLUE), LV_PART_MAIN); /* 设置线的颜色 */
lv_obj_set_style_line_rounded(sin_line, true, LV_PART_MAIN); /* 设置线条圆角 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_line(); /* 正弦波实例 */
}
测试结果

十四、滚轮
主函数
static void roller_event_cb(lv_event_t* e)
{
lv_obj_t *target = lv_event_get_target(e); /* 获取触发源 */
if(lv_roller_get_selected(target) == 0) /* 获取索引,判断是否为Auto选项 */
{
lv_obj_add_state(temp_roller, LV_STATE_DISABLED); /* 设置温度滚轮为不可选状态 */
lv_obj_add_state(hum_roller, LV_STATE_DISABLED); /* 设置湿度滚轮为不可选状态 */
}
else
{
lv_obj_clear_state(temp_roller, LV_STATE_DISABLED); /* 解除温度滚轮不可选状态 */
lv_obj_clear_state(hum_roller, LV_STATE_DISABLED); /* 解除湿度滚轮不可选状态 */
}
}
/**
* @brief 模式设置
* @param 无
* @return 无
*/
static void lv_example_roller1(void)
{
/* 根据活动屏幕宽度选择字体 */
if (scr_act_width() <= 480)
{
font = &lv_font_montserrat_14;
}
else
{
font = &lv_font_montserrat_20;
}
lv_obj_t *mode_roller = lv_roller_create(lv_scr_act()); /* 创建模式设置滚轮 */
lv_roller_set_options(mode_roller, mode_options, LV_ROLLER_MODE_NORMAL); /* 滚轮添加选项、设置正常模式 */
lv_obj_align(mode_roller, LV_ALIGN_CENTER, -scr_act_width() / 4, 0); /* 设置滚轮位置 */
lv_obj_set_width(mode_roller, scr_act_width() / 6); /* 设置滚轮宽度 */
lv_obj_set_style_text_font(mode_roller, font, LV_STATE_DEFAULT); /* 设置滚轮字体 */
lv_roller_set_visible_row_count(mode_roller, 3); /* 设置滚轮可见选项个数 */
lv_roller_set_selected(mode_roller, 2, LV_ANIM_OFF); /* 设置滚轮当前所选项 */
lv_obj_add_event_cb(mode_roller, roller_event_cb, LV_EVENT_VALUE_CHANGED, NULL); /* 添加事件回调 */
lv_obj_t *label = lv_label_create(lv_scr_act()); /* 创建标签 */
lv_label_set_text(label, "MODE"); /* 设置文本内容 */
lv_obj_set_style_text_font(label, font, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_align_to(label, mode_roller, LV_ALIGN_OUT_TOP_MID, 0, -15 ); /* 设置位置 */
}
/**
* @brief 温度设置
* @param 无
* @return 无
*/
static void lv_example_roller2(void)
{
temp_roller = lv_roller_create(lv_scr_act()); /* 创建温度设置滚轮 */
lv_roller_set_options(temp_roller, temp_options, LV_ROLLER_MODE_NORMAL); /* 滚轮添加选项、设置正常模式 */
lv_obj_align(temp_roller, LV_ALIGN_CENTER, 0, 0); /* 设置滚轮位置 */
lv_obj_set_width(temp_roller, scr_act_width() / 6); /* 设置滚轮宽度 */
lv_obj_set_style_text_font(temp_roller, font, LV_STATE_DEFAULT); /* 设置滚轮字体 */
lv_roller_set_visible_row_count(temp_roller, 3); /* 设置滚轮可见选项个数 */
lv_roller_set_selected(temp_roller, 2, LV_ANIM_OFF); /* 设置滚轮当前所选项 */
lv_obj_t *label = lv_label_create(lv_scr_act()); /* 创建标签 */
lv_label_set_text(label, "TEMP"); /* 设置文本内容 */
lv_obj_set_style_text_font(label, font, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_align_to(label, temp_roller, LV_ALIGN_OUT_TOP_MID, 0, -15 ); /* 设置位置 */
}
/**
* @brief 湿度设置
* @param 无
* @return 无
*/
static void lv_example_roller3(void)
{
hum_roller = lv_roller_create(lv_scr_act()); /* 创建湿度设置滚轮 */
lv_roller_set_options(hum_roller, hum_options, LV_ROLLER_MODE_NORMAL); /* 滚轮添加选项、设置正常模式 */
lv_obj_align(hum_roller, LV_ALIGN_CENTER, scr_act_width() / 4, 0); /* 设置滚轮位置 */
lv_obj_set_width(hum_roller, scr_act_width() / 6); /* 设置滚轮宽度 */
lv_obj_set_style_text_font(hum_roller, font, LV_STATE_DEFAULT); /* 设置滚轮字体 */
lv_roller_set_visible_row_count(hum_roller, 3); /* 设置滚轮可见选项个数 */
lv_roller_set_selected(hum_roller, 2, LV_ANIM_OFF); /* 设置滚轮当前所选项 */
lv_obj_t *label = lv_label_create(lv_scr_act()); /* 创建标签 */
lv_label_set_text(label, "HUM"); /* 设置文本内容 */
lv_obj_set_style_text_font(label, font, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_align_to(label, hum_roller, LV_ALIGN_OUT_TOP_MID, 0, -15 ); /* 设置位置 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_roller1(); /* 模式设置滚轮 */
lv_example_roller2(); /* 温度设置滚轮 */
lv_example_roller3(); /* 湿度设置滚轮 */
}
测试结果

十六、滑块
主函数
static void slider_event_cb(lv_event_t *e)
{
lv_obj_t *target = lv_event_get_target(e); /* 获取触发源 */
lv_event_code_t code = lv_event_get_code(e); /* 获取事件类型 */
if(code == LV_EVENT_VALUE_CHANGED)
{
lv_label_set_text_fmt(slider_label, "%d%%", lv_slider_get_value(target)); /* 获取当前值,更新进度条百分比 */
}
}
/**
* @brief 音量调节滑块
* @param 无
* @return 无
*/
static void lv_example_slider(void)
{
/* 根据活动屏幕宽度选择字体 */
if (scr_act_width() <= 480)
{
font = &lv_font_montserrat_14;
}
else
{
font = &lv_font_montserrat_20;
}
/* 滑块 */
lv_obj_t * slider = lv_slider_create(lv_scr_act()); /* 创建滑块 */
lv_obj_set_size(slider, scr_act_width() / 2, 20); /* 设置大小 */
lv_obj_center(slider); /* 设置位置 */
lv_slider_set_value(slider, 50, LV_ANIM_OFF); /* 设置当前值 */
lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL); /* 添加事件 */
/* 百分比标签 */
slider_label = lv_label_create(lv_scr_act()); /* 创建百分比标签 */
lv_label_set_text(slider_label, "50%"); /* 设置文本内容 */
lv_obj_set_style_text_font(slider_label, font, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_align_to(slider_label, slider, LV_ALIGN_OUT_RIGHT_MID, 20, 0); /* 设置位置 */
/* 音量图标 */
lv_obj_t *sound_label = lv_label_create(lv_scr_act()); /* 创建音量标签 */
lv_label_set_text(sound_label, LV_SYMBOL_VOLUME_MAX); /* 设置文本内容:音量图标 */
lv_obj_set_style_text_font(sound_label, font, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_align_to(sound_label, slider, LV_ALIGN_OUT_LEFT_MID, -20, 0); /* 设置位置 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_slider();
}
测试结果

十七、开关
主函数
static void switch_event_cb(lv_event_t *e)
{
lv_obj_t *target = lv_event_get_target(e); /* 获取触发源 */
if(target == switch_cool) /* 制冷开关触发 */
{
if(lv_obj_has_state(switch_cool, LV_STATE_CHECKED)) /* 判断开关状态 */
{
lv_obj_clear_state(switch_heat, LV_STATE_CHECKED); /* 制冷模式已打开,关闭制暖模式 */
}
}
else if(target == switch_heat) /* 制暖开关触发 */
{
if(lv_obj_has_state(switch_heat, LV_STATE_CHECKED)) /* 判断开关状态 */
{
lv_obj_clear_state(switch_cool, LV_STATE_CHECKED); /* 制暖模式已打开,关闭制冷模式 */
}
}
}
/**
* @brief 功能文本标签
* @param 无
* @return 无
*/
static void lv_example_label(void)
{
/* 根据活动屏幕宽度选择字体 */
if (scr_act_width() <= 320)
{
font = &lv_font_montserrat_10;
}
else if (scr_act_width() <= 480)
{
font = &lv_font_montserrat_14;
}
else
{
font = &lv_font_montserrat_20;
}
lv_obj_t *label = lv_label_create(lv_scr_act()); /* 创建标签 */
lv_label_set_text(label, "Control Center"); /* 设置文本内容 */
lv_obj_set_style_text_font(label, font, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_align(label, LV_ALIGN_CENTER, 0, -scr_act_height() / 3 ); /* 设置位置 */
}
/**
* @brief 制冷功能开关
* @param 无
* @return 无
*/
static void lv_example_switch1(void)
{
/* 制冷模式基础对象(矩形背景) */
lv_obj_t *obj_cool = lv_obj_create(lv_scr_act()); /* 创建基础对象 */
lv_obj_set_size(obj_cool,scr_act_height() / 3, scr_act_height() / 3 ); /* 设置大小 */
lv_obj_align(obj_cool, LV_ALIGN_CENTER, -scr_act_width() / 4, 0 ); /* 设置位置 */
/* 制冷模式开关标签 */
lv_obj_t *label_cool = lv_label_create(obj_cool); /* 创建标签 */
lv_label_set_text(label_cool, "Cool"); /* 设置文本内容 */
lv_obj_set_style_text_font(label_cool, font, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_align(label_cool, LV_ALIGN_CENTER, 0, -scr_act_height() / 16 ); /* 设置位置 */
/* 制冷模式开关 */
switch_cool = lv_switch_create(obj_cool); /* 创建开关 */
lv_obj_set_size(switch_cool,scr_act_height() / 6, scr_act_height() / 12 ); /* 设置大小 */
lv_obj_align(switch_cool, LV_ALIGN_CENTER, 0, scr_act_height() / 16 ); /* 设置位置 */
lv_obj_add_event_cb(switch_cool, switch_event_cb, LV_EVENT_VALUE_CHANGED, NULL);/* 添加事件 */
}
/**
* @brief 制暖功能开关
* @param 无
* @return 无
*/
static void lv_example_switch2(void)
{
/* 制暖模式基础对象(矩形背景) */
lv_obj_t *obj_heat = lv_obj_create(lv_scr_act());
lv_obj_set_size(obj_heat,scr_act_height() / 3, scr_act_height() / 3 );
lv_obj_align(obj_heat, LV_ALIGN_CENTER, 0, 0 );
/* 制暖模式开关标签 */
lv_obj_t *label_heat = lv_label_create(obj_heat);
lv_label_set_text(label_heat, "Heat");
lv_obj_set_style_text_font(label_heat, font, LV_STATE_DEFAULT);
lv_obj_align(label_heat, LV_ALIGN_CENTER, 0, -scr_act_height() / 16 );
/* 制暖模式开关 */
switch_heat = lv_switch_create(obj_heat);
lv_obj_set_size(switch_heat,scr_act_height() / 6, scr_act_height() / 12 );
lv_obj_align(switch_heat, LV_ALIGN_CENTER, 0, scr_act_height() / 16 );
lv_obj_add_event_cb(switch_heat, switch_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
}
/**
* @brief 干燥功能开关
* @param 无
* @return 无
*/
static void lv_example_switch3(void)
{
/* 干燥模式基础对象(矩形背景) */
lv_obj_t *obj_dry = lv_obj_create(lv_scr_act());
lv_obj_set_size(obj_dry,scr_act_height() / 3, scr_act_height() / 3 );
lv_obj_align(obj_dry, LV_ALIGN_CENTER, scr_act_width() / 4, 0 );
/* 干燥模式开关标签 */
lv_obj_t *label_dry = lv_label_create(obj_dry);
lv_label_set_text(label_dry, "Dry");
lv_obj_set_style_text_font(label_dry, font, LV_STATE_DEFAULT);
lv_obj_align(label_dry, LV_ALIGN_CENTER, 0, -scr_act_height() / 16 );
/* 干燥模式开关 */
switch_dry = lv_switch_create(obj_dry);
lv_obj_set_size(switch_dry,scr_act_height() / 6, scr_act_height() / 12 );
lv_obj_align(switch_dry, LV_ALIGN_CENTER, 0, scr_act_height() / 16 );
lv_obj_add_state(switch_dry, LV_STATE_CHECKED|LV_STATE_DISABLED);
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_label(); /* 功能标题 */
lv_example_switch1(); /* 制冷模式开关 */
lv_example_switch2(); /* 制暖模式开关 */
lv_example_switch3(); /* 干燥模式开关 */
}
测试结果

十八、表格
主函数
static void lv_example_table(void)
{
/* 标题 */
lv_obj_t *label_title = lv_label_create(lv_scr_act()); /* 创建标题 */
lv_obj_align(label_title, LV_ALIGN_TOP_MID, 0, scr_act_height()/8); /* 设置位置 */
lv_obj_set_style_text_font(label_title, &lv_font_montserrat_20, LV_STATE_DEFAULT); /* 设置字体 */
lv_label_set_text(label_title, "Today's prices"); /* 设置文本内容 */
/* 表格 */
lv_obj_t *table = lv_table_create(lv_scr_act()); /* 创建表格 */
lv_obj_set_height(table, scr_act_height()/2); /* 设置表格总的高度 */
lv_obj_center(table); /* 设置位置 */
/* 设置第1列单元格内容(名称) */
lv_table_set_cell_value(table, 0, 0, "Name");
lv_table_set_cell_value(table, 1, 0, "Apple");
lv_table_set_cell_value(table, 2, 0, "Banana");
lv_table_set_cell_value(table, 3, 0, "Lemon");
lv_table_set_cell_value(table, 4, 0, "Grape");
lv_table_set_cell_value(table, 5, 0, "Melon");
lv_table_set_cell_value(table, 6, 0, "Peach");
lv_table_set_cell_value(table, 7, 0, "Nuts");
/* 设置第2列单元格内容(价格) */
lv_table_set_cell_value(table, 0, 1, "Price");
lv_table_set_cell_value(table, 1, 1, "$7");
lv_table_set_cell_value(table, 2, 1, "$4");
lv_table_set_cell_value(table, 3, 1, "$6");
lv_table_set_cell_value(table, 4, 1, "$2");
lv_table_set_cell_value(table, 5, 1, "$5");
lv_table_set_cell_value(table, 6, 1, "$1");
lv_table_set_cell_value(table, 7, 1, "$9");
/* 单元格宽度 */
lv_table_set_col_width(table, 0, scr_act_width()/3);
lv_table_set_col_width(table, 1, scr_act_width()/3);
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_table();
}
测试结果:

十九、文本区域
主函数
static void name_event_cb(lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e); /* 获取事件类型 */
lv_obj_t *target = lv_event_get_target(e); /* 获取触发源 */
if(code == LV_EVENT_FOCUSED) /* 事件类型:被聚焦 */
{
lv_keyboard_set_textarea(keyboard, target); /* 关联用户名文本框和键盘 */
}
else if(code == LV_EVENT_VALUE_CHANGED) /* 事件类型:文本框的内容发生变化 */
{
const char *txt = lv_textarea_get_text(target); /* 获取文本框的文本 */
if(strcmp(txt,"admin") == 0) /* 判断用户名是否正确 */
{
lv_label_set_text(label_name, LV_SYMBOL_OK); /* 用户名正确,显示√ */
}
else
{
lv_label_set_text(label_name, ""); /* 用户名错误,不提示 */
}
}
}
/**
* @brief 密码文本框事件回调
* @param *e :事件相关参数的集合,它包含了该事件的所有数据
* @return 无
*/
static void pass_event_cb(lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e); /* 获取事件类型 */
lv_obj_t *target = lv_event_get_target(e); /* 获取触发源 */
if(code == LV_EVENT_FOCUSED) /* 事件类型:被聚焦 */
{
lv_keyboard_set_textarea(keyboard, target); /* 关联用户名文本框和键盘 */
}
else if(code == LV_EVENT_VALUE_CHANGED) /* 事件类型:文本框的内容发生变化 */
{
const char *txt = lv_textarea_get_text(target); /* 获取文本框的文本 */
if(strcmp(txt,"123456") == 0) /* 判断密码是否正确 */
{
lv_label_set_text(label_pass, LV_SYMBOL_OK); /* 密码正确,显示√ */
}
else
{
lv_label_set_text(label_pass, ""); /* 密码错误,不提示 */
}
}
}
/**
* @brief 用户登录实例
* @param 无
* @return 无
*/
static void lv_example_textarea(void)
{
/* 根据屏幕大小设置字体 */
if (scr_act_width() <= 320)
{
font = &lv_font_montserrat_12;
}
else if (scr_act_width() <= 480)
{
font = &lv_font_montserrat_14;
}
else
{
font = &lv_font_montserrat_22;
}
/* 用户名文本框 */
lv_obj_t *textarea_name = lv_textarea_create(lv_scr_act()); /* 创建文本框 */
lv_obj_set_width(textarea_name, scr_act_width()/2); /* 设置宽度 */
lv_obj_set_style_text_font(textarea_name, font, LV_PART_MAIN); /* 设置字体 */
lv_obj_align(textarea_name, LV_ALIGN_CENTER, 0, -scr_act_height()/3 ); /* 设置位置 */
lv_textarea_set_one_line(textarea_name, true); /* 设置单行模式 */
lv_textarea_set_max_length(textarea_name, 6); /* 设置输入字符的最大长度 */
lv_textarea_set_placeholder_text(textarea_name, "user name"); /* 设置占位符 */
lv_obj_add_event_cb(textarea_name, name_event_cb, LV_EVENT_ALL, NULL); /* 添加文本框事件回调 */
/* 用户名正误提示标签 */
label_name = lv_label_create(lv_scr_act()); /* 创建标签 */
lv_label_set_text(label_name, ""); /* 默认不提示 */
lv_obj_set_style_text_font(label_name, font, LV_PART_MAIN); /* 设置字体 */
lv_obj_align_to(label_name, textarea_name, LV_ALIGN_OUT_RIGHT_MID, 5, 0); /* 设置位置 */
/* 密码文本框 */
lv_obj_t *textarea_pass = lv_textarea_create(lv_scr_act()); /* 创建文本框 */
lv_obj_set_width(textarea_pass, scr_act_width()/2); /* 设置宽度 */
lv_obj_set_style_text_font(textarea_pass, font, LV_PART_MAIN); /* 设置字体 */
lv_obj_align_to(textarea_pass, textarea_name, LV_ALIGN_OUT_BOTTOM_MID, 0, scr_act_height()/20); /* 设置位置 */
lv_textarea_set_one_line(textarea_pass, true); /* 设置单行模式 */
lv_textarea_set_password_mode(textarea_pass, true); /* 设置密码模式 */
lv_textarea_set_password_show_time(textarea_pass, 1000); /* 设置密码显示时间 */
lv_textarea_set_max_length(textarea_pass, 8); /* 设置输入字符的最大长度 */
lv_textarea_set_placeholder_text(textarea_pass, "password"); /* 设置占位符 */
lv_obj_add_event_cb(textarea_pass, pass_event_cb, LV_EVENT_ALL, NULL); /* 添加文本框事件回调 */
/* 密码正误提示标签 */
label_pass = lv_label_create(lv_scr_act()); /* 创建标签 */
lv_label_set_text(label_pass, ""); /* 默认不提示 */
lv_obj_set_style_text_font(label_pass, font, LV_PART_MAIN); /* 设置字体 */
lv_obj_align_to(label_pass, textarea_pass, LV_ALIGN_OUT_RIGHT_MID, 5, 0); /* 设置位置 */
/* 键盘 */
keyboard = lv_keyboard_create(lv_scr_act()); /* 创建键盘 */
lv_obj_set_size(keyboard, scr_act_width(), scr_act_height()/2); /* 设置大小 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_textarea();
}
测试结果

二十、日历
主函数
static void event_calendar_cb(lv_event_t* e)
{
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t* obj = lv_event_get_target(e);
lv_obj_t* label = (lv_obj_t*)e->user_data;
lv_calendar_date_t date_temp;
char buf[11];
if (LV_EVENT_VALUE_CHANGED == code)
{
if (LV_RES_OK == lv_calendar_get_pressed_date(calendar, &date_temp))
{
lv_calendar_set_today_date(calendar, date_temp.year, date_temp.month, date_temp.day);
lv_snprintf(buf, sizeof(buf), "%d/%02d/%02d", date_temp.year, date_temp.month, date_temp.day);
lv_label_set_text(label, buf);
}
}
}
static lv_calendar_date_t highlight_days[2];/* 定义的日期,必须用全局或静态定义 */
/**
* @brief 例
* @param 无
* @return 无
*/
static void lv_example_calendar(void)
{
/* 定义并初始化日历 */
calendar = lv_calendar_create(lv_scr_act());
/* 设置日历的大小 */
lv_obj_set_size(calendar, scr_act_height() * 0.85, scr_act_height()* 0.85);
lv_obj_center(calendar);
/* 设置日历的日期 */
lv_calendar_set_today_date(calendar, 2022, 4, 7);
/* 设置日历显示的月份 */
lv_calendar_set_showed_date(calendar, 2022, 4);
/* 设置日历头 */
lv_calendar_header_dropdown_create(calendar);
highlight_days[0].year = 2022; /* 设置第一个日期 */
highlight_days[0].month = 4;
highlight_days[0].day = 5;
highlight_days[1].year = 2022; /* 设置第二个日期 */
highlight_days[1].month = 4;
highlight_days[1].day = 6;
lv_calendar_set_highlighted_dates(calendar, highlight_days, 3);
/* 更新日历参数 */
lv_obj_update_layout(calendar);
lv_obj_t* label = lv_label_create(lv_scr_act()); /* 定义并创建标签 */
lv_obj_set_width(label, lv_obj_get_x(calendar)); /* 设置标签宽度 */
lv_obj_align(label, LV_ALIGN_LEFT_MID, 0, 0); /* 设置标签位置 */
lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN); /* 设置标签文本对齐方式 */
lv_label_set_text(label, "Wait input..."); /* 设置标签文本 */
lv_obj_add_event_cb(calendar, event_calendar_cb, LV_EVENT_ALL, label); /* 设置日历回调 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_calendar();
}
测试结果

二十一、图表
主函数
static void event_chart_cb(lv_event_t* e)
{
lv_obj_t* chart = lv_event_get_target(e);
lv_event_code_t code = lv_event_get_code(e);
lv_chart_cursor_t* cursor = (lv_chart_cursor_t*)e->user_data;
if (LV_EVENT_VALUE_CHANGED == code) {
uint16_t point_id = lv_chart_get_pressed_point(chart);
if (LV_CHART_POINT_NONE != point_id) {
lv_chart_set_cursor_point(chart, cursor, NULL, point_id);
char buf[20];
lv_snprintf(buf, sizeof(buf), "(%d, %d)", point_id, example_data[point_id]);
lv_label_set_text(label, buf);
}
}
}
/**
* @brief X轴滑杆回调
* @param 无
* @return 无
*/
static void event_slider_x_cb(lv_event_t* e)
{
lv_obj_t* slider_x = lv_event_get_target(e);
lv_obj_t* chart = (lv_obj_t*)e->user_data;
lv_chart_set_zoom_x(chart, lv_slider_get_value(slider_x));
}
/**
* @brief Y轴滑杆回调
* @param 无
* @return 无
*/
static void event_slider_y_cb(lv_event_t* e)
{
lv_obj_t* slider_y = lv_event_get_target(e);
lv_obj_t* chart = (lv_obj_t*)e->user_data;
lv_chart_set_zoom_y(chart, lv_slider_get_value(slider_y));
}
/**
* @brief 例
* @param 无
* @return 无
*/
static void lv_example_chart(void)
{
lv_obj_t* chart = lv_chart_create(lv_scr_act()); /* 定义并初始化图表 */
lv_obj_set_size(chart, scr_act_width(), scr_act_height()); /* 设置图表大小 */
lv_obj_align(chart, LV_ALIGN_TOP_LEFT, 0, 0); /* 设置图表位置 */
lv_chart_set_range(chart, LV_CHART_AXIS_PRIMARY_Y, -5, 55); /* 设置左轴Y方向的最大最小值 */
lv_obj_set_style_size(chart, 0, LV_PART_INDICATOR); /* 不显示数据上的点 */
lv_chart_series_t* ser = lv_chart_add_series(chart, lv_palette_main(LV_PALETTE_RED), LV_CHART_AXIS_PRIMARY_Y); /* 在图表中分配并添加数据系列 */
uint32_t pcnt = sizeof(example_data) / sizeof(example_data[0]); /* 计算数据线上的新点数 */
lv_chart_set_point_count(chart, pcnt); /* 在图表上设置数据线上的点数 */
lv_chart_set_ext_y_array(chart, ser, (lv_coord_t*)example_data); /* 为Y轴数据点设置一个外部阵列 */
lv_chart_cursor_t* cursor = lv_chart_add_cursor(chart, lv_palette_main(LV_PALETTE_BLUE), LV_DIR_LEFT | LV_DIR_BOTTOM); /* 添加光标 */
lv_obj_update_layout(chart); /* 手动更新图表参数 */
label = lv_label_create(lv_scr_act()); /* 定义并创建显示值的标签 */
lv_obj_align(label, LV_ALIGN_TOP_LEFT, 5, 5); /* 设置标签的位置 */
lv_obj_set_style_text_font(label, &lv_font_montserrat_18, LV_PART_MAIN); /* 设置标签的字体 */
lv_label_set_text(label, ""); /* 设置标签的文本 */
lv_obj_t* slider_x = lv_slider_create(lv_scr_act()); /* 定义并创建X轴缩放滑杆 */
lv_slider_set_range(slider_x, LV_IMG_ZOOM_NONE, LV_IMG_ZOOM_NONE * 10); /* 设置滑杆范围 */
lv_obj_add_event_cb(slider_x, event_slider_x_cb, LV_EVENT_VALUE_CHANGED, chart); /* 设置滑杆回调 */
lv_obj_set_width(slider_x, lv_obj_get_width(chart) - 3.5 * lv_obj_get_height(chart) / 10); /* 设置滑杆宽度 */
lv_obj_set_height(slider_x, lv_obj_get_height(chart) / 10); /* 设置滑杆高度 */
lv_obj_align_to(slider_x, chart, LV_ALIGN_BOTTOM_LEFT, lv_obj_get_height(chart) / 10, -lv_obj_get_height(chart) / 20); /* 设置滑杆位置 */
lv_obj_t* slider_y = lv_slider_create(lv_scr_act()); /* 定义并创建Y轴缩放滑杆 */
lv_slider_set_range(slider_y, LV_IMG_ZOOM_NONE, LV_IMG_ZOOM_NONE * 10); /* 设置滑杆范围 */
lv_obj_add_event_cb(slider_y, event_slider_y_cb, LV_EVENT_VALUE_CHANGED, chart); /* 设置滑杆回调 */
lv_obj_set_width(slider_y, lv_obj_get_height(chart) / 10); /* 设置滑杆宽度 */
lv_obj_set_height(slider_y, lv_obj_get_height(chart) - 3.5 * lv_obj_get_height(chart) / 10); /* 设置滑杆高度 */
lv_obj_align_to(slider_y, chart, LV_ALIGN_TOP_RIGHT, -lv_obj_get_height(chart) / 20, lv_obj_get_height(chart) / 10); /* 设置滑杆位置 */
lv_obj_add_event_cb(chart, event_chart_cb, LV_EVENT_VALUE_CHANGED, cursor); /* 设置图表回调 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_chart();
}
测试结果

二十二、色环
主函数
static void colorwheel_event_cb(lv_event_t *e)
{
lv_obj_t *target = lv_event_get_target(e); /* 获取触发源 */
lv_obj_set_style_bg_color(obj, lv_colorwheel_get_rgb(target), LV_PART_MAIN); /* 设置基础对象背景颜色 */
}
/**
* @brief 色环部件实例
* @param 无
* @return 无
*/
static void lv_example_colorwheel(void)
{
/* 色环(用于选择颜色) */
lv_obj_t *colorwheel = lv_colorwheel_create(lv_scr_act(), true); /* 创建色环 */
lv_obj_set_size(colorwheel, scr_act_height() * 2 / 3, scr_act_height()* 2 / 3); /* 设置大小 */
lv_obj_center(colorwheel); /* 设置位置 */
lv_obj_set_style_arc_width(colorwheel, scr_act_height() * 0.1, LV_PART_MAIN); /* 设置色环圆弧宽度 */
lv_colorwheel_set_mode_fixed(colorwheel, true); /* 固定色环模式 */
/* 基础对象(用于显示所选颜色) */
obj = lv_obj_create(lv_scr_act()); /* 创建基础对象 */
lv_obj_set_size(obj, scr_act_height() / 3, scr_act_height() / 3); /* 设置大小 */
lv_obj_align_to(obj, colorwheel, LV_ALIGN_CENTER, 0, 0); /* 设置位置 */
lv_obj_set_style_radius(obj, LV_RADIUS_CIRCLE, LV_PART_MAIN); /* 设置圆角 */
lv_obj_set_style_bg_color(obj, lv_colorwheel_get_rgb(colorwheel), LV_PART_MAIN); /* 设置背景颜色 */
lv_obj_add_event_cb(colorwheel, colorwheel_event_cb, LV_EVENT_VALUE_CHANGED, NULL); /* 设置色环事件回调 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_colorwheel();
}
测试结果

二十三、图片按钮
主函数
static void cool_event_cb(lv_event_t *e)
{
lv_obj_t *target = lv_event_get_target(e); /* 获取触发源 */
if(cool_mode_state == 0) /* 判断按钮状态,如果为0,即关闭状态 */
{
cool_mode_state = 1; /* 切换按钮状态 */
lv_obj_set_style_img_recolor_opa(target, 255, 0); /* 设置图片重新着色透明度 */
lv_obj_set_style_img_recolor(target, lv_color_hex(0x00a9ff), 0); /* 设置图片重新着色:蓝色 */
}
else /* 按钮为开启状态 */
{
cool_mode_state = 0; /* 切换按钮状态 */
lv_obj_set_style_img_recolor_opa(target, 255, 0); /* 设置图片重新着色透明度 */
lv_obj_set_style_img_recolor(target, lv_color_hex(0x8a8a8a), 0); /* 设置图片重新着色:灰色 */
}
}
/**
* @brief 制暖按钮事件回调
* @param *e :事件相关参数的集合,它包含了该事件的所有数据
* @return 无
*/
static void warm_event_cb(lv_event_t *e)
{
lv_obj_t *target = lv_event_get_target(e); /* 获取触发源 */
if(warm_mode_state == 0) /* 判断按钮状态,如果为0,即关闭状态 */
{
warm_mode_state = 1; /* 切换按钮状态 */
lv_obj_set_style_img_recolor_opa(target, 255, 0); /* 设置图片重新着色透明度 */
lv_obj_set_style_img_recolor(target, lv_color_hex(0xff0000), 0); /* 设置图片重新着色:红色 */
}
else
{
warm_mode_state = 0; /* 切换按钮状态 */
lv_obj_set_style_img_recolor_opa(target, 255, 0); /* 设置图片重新着色透明度 */
lv_obj_set_style_img_recolor(target, lv_color_hex(0x8a8a8a), 0); /* 设置图片重新着色:灰色 */
}
}
/**
* @brief 干燥按钮事件回调
* @param *e :事件相关参数的集合,它包含了该事件的所有数据
* @return 无
*/
static void dry_event_cb(lv_event_t *e)
{
lv_obj_t *target = lv_event_get_target(e); /* 获取触发源 */
if(dry_mode_state == 0) /* 判断按钮状态,如果为0,即关闭状态 */
{
dry_mode_state = 1; /* 切换按钮状态 */
lv_obj_set_style_img_recolor_opa(target, 255, 0); /* 设置图片重新着色透明度 */
lv_obj_set_style_img_recolor(target, lv_color_hex(0x00a9ff), 0); /* 设置图片重新着色:蓝色 */
}
else /* 按钮为开启状态 */
{
dry_mode_state = 0; /* 切换按钮状态 */
lv_obj_set_style_img_recolor_opa(target, 255, 0); /* 设置图片重新着色透明度 */
lv_obj_set_style_img_recolor(target, lv_color_hex(0x8a8a8a), 0); /* 设置图片重新着色:灰色 */
}
}
/**
* @brief 图片按钮实例
* @param 无
* @return 无
*/
static void lv_example_imgbtn(void)
{
/* 根据活动屏幕宽度选择字体 */
if (scr_act_width() <= 480)
{
font = &lv_font_montserrat_14;
}
else
{
font = &lv_font_montserrat_22;
}
/* 基础对象(用作背景) */
lv_obj_t *obj = lv_obj_create(lv_scr_act()); /* 创建基础对象 */
lv_obj_set_size(obj, scr_act_width()-10, 200); /* 设置大小 */
lv_obj_align(obj, LV_ALIGN_CENTER, 0, 0); /* 设置位置 */
/* 制冷模式(图片按钮) */
lv_obj_t *imgbtn_cool = lv_imgbtn_create(obj); /* 创建图片按钮 */
lv_imgbtn_set_src(imgbtn_cool, LV_IMGBTN_STATE_RELEASED, NULL, &img_cool, NULL); /* 设置图片源 */
lv_obj_set_size(imgbtn_cool, 64, 64); /* 设置大小 */
lv_obj_align(imgbtn_cool, LV_ALIGN_CENTER, -scr_act_width()/3, -15); /* 设置位置 */
lv_obj_add_event_cb(imgbtn_cool, cool_event_cb, LV_EVENT_PRESSED, NULL); /* 添加事件 */
/* 制冷模式(标签) */
lv_obj_t *label_cool = lv_label_create(obj); /* 创建标签 */
lv_label_set_text(label_cool, "Cool"); /* 设置文本 */
lv_obj_set_style_text_font(label_cool, font, 0); /* 设置字体 */
lv_obj_align_to(label_cool, imgbtn_cool, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); /* 设置位置 */
/* 制暖模式(图片按钮) */
lv_obj_t *imgbtn_warm = lv_imgbtn_create(obj); /* 创建图片按钮 */
lv_imgbtn_set_src(imgbtn_warm, LV_IMGBTN_STATE_RELEASED, NULL, &img_warm, NULL); /* 设置图片源 */
lv_obj_set_size(imgbtn_warm, 64, 64); /* 设置大小 */
lv_obj_align(imgbtn_warm, LV_ALIGN_CENTER, 0, -15); /* 设置位置 */
lv_obj_add_event_cb(imgbtn_warm, warm_event_cb, LV_EVENT_PRESSED, NULL); /* 添加事件 */
/* 制暖模式(标签) */
lv_obj_t *label_warm = lv_label_create(obj); /* 创建标签 */
lv_label_set_text(label_warm, "Warm"); /* 设置文本 */
lv_obj_set_style_text_font(label_warm, font, 0); /* 设置字体 */
lv_obj_align_to(label_warm, imgbtn_warm, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); /* 设置位置 */
/* 干燥模式(图片按钮) */
lv_obj_t *imgbtn_dry = lv_imgbtn_create(obj); /* 创建图片按钮 */
lv_imgbtn_set_src(imgbtn_dry, LV_IMGBTN_STATE_RELEASED, NULL, &img_dry, NULL); /* 设置图片源 */
lv_obj_set_size(imgbtn_dry, 64, 64); /* 设置大小 */
lv_obj_align(imgbtn_dry, LV_ALIGN_CENTER, scr_act_width()/3, -15); /* 设置位置 */
lv_obj_add_event_cb(imgbtn_dry, dry_event_cb, LV_EVENT_PRESSED, NULL); /* 添加事件 */
/* 干燥模式(标签) */
lv_obj_t *label_dry = lv_label_create(obj); /* 创建标签 */
lv_label_set_text(label_dry, "Dry"); /* 设置文本 */
lv_obj_set_style_text_font(label_dry, font, 0); /* 设置字体 */
lv_obj_align_to(label_dry, imgbtn_dry, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); /* 设置位置 */
/* 线条(分割线) */
lv_obj_t *line_left = lv_line_create(obj); /* 创建线条 */
lv_line_set_points(line_left, line_points, 2); /* 设置线条坐标点 */
lv_obj_set_style_line_color(line_left, lv_color_hex(0xc6c6c6),LV_STATE_DEFAULT); /* 设置线条颜色 */
lv_obj_align(line_left, LV_ALIGN_CENTER, -scr_act_width()/6, 0); /* 设置位置 */
lv_obj_t *line_right = lv_line_create(obj); /* 创建线条 */
lv_line_set_points(line_right, line_points, 2); /* 设置线条坐标点 */
lv_obj_set_style_line_color(line_right, lv_color_hex(0xc6c6c6),LV_STATE_DEFAULT); /* 设置线条颜色 */
lv_obj_align(line_right, LV_ALIGN_CENTER, scr_act_width()/6, 0); /* 设置位置 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_imgbtn();
}
测试结果

二十四、键盘
主函数
static void keyboard_event_cb(lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e); /* 获取事件类型 */
lv_obj_t *target = lv_event_get_target(e); /* 获取触发源 */
if(code == LV_EVENT_VALUE_CHANGED)
{
uint16_t id = lv_btnmatrix_get_selected_btn(target); /* 获取键盘按钮索引 */
const char *txt = lv_btnmatrix_get_btn_text(target, id); /* 获取按钮文本 */
if(strcmp(txt, LV_SYMBOL_KEYBOARD) == 0) /* 判断是不是键盘图标被按下 */
{
if(lv_keyboard_get_mode(target) == LV_KEYBOARD_MODE_NUMBER) /* 获取当前键盘模式,判断是否为数字模式 */
{
lv_keyboard_set_mode(target, LV_KEYBOARD_MODE_TEXT_LOWER); /* 如果是数字模式,则切换为小写字母模式 */
}
else
{
lv_keyboard_set_mode(target, LV_KEYBOARD_MODE_NUMBER); /* 不是数字模式,则切换为数字模式 */
}
}
}
}
/**
* @brief 键盘实例
* @param 无
* @return 无
*/
static void lv_example_keyboard(void)
{
/* 文本框 */
lv_obj_t *textarea = lv_textarea_create(lv_scr_act()); /* 创建文本框 */
lv_obj_set_size(textarea, scr_act_width() - 10, scr_act_height() / 2 - 10); /* 设置大小 */
lv_obj_align(textarea, LV_ALIGN_TOP_MID, 0, 0); /* 设置位置 */
/* 键盘 */
lv_obj_t *keyboard = lv_keyboard_create(lv_scr_act()); /* 创建键盘 */
lv_keyboard_set_textarea(keyboard, textarea); /* 关联键盘和文本框 */
lv_obj_add_event_cb(keyboard, keyboard_event_cb, LV_EVENT_VALUE_CHANGED, NULL); /* 设置键盘事件回调 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_keyboard();
}
测试结果

二十五、LED
主函数
static void led_event_cb(lv_event_t* e)
{
lv_obj_t* led = lv_event_get_target(e); /* 获取触发源 */
lv_led_toggle(led); /* 翻转LED状态 */
}
/**
* @brief LED1
* @param 无
* @return 无
*/
static void lv_example_led_1(void)
{
/* 根据活动屏幕宽度选择字体 */
if (scr_act_width() <= 480)
{
font = &lv_font_montserrat_14;
}
else
{
font = &lv_font_montserrat_20;
}
/* 创建基础对象作为背景 */
obj = lv_obj_create(lv_scr_act());
lv_obj_set_size(obj, scr_act_width() * 5 /6 , scr_act_height() * 3 /5);
lv_obj_align(obj, LV_ALIGN_CENTER, 0 , 0);
lv_obj_set_style_bg_color(obj, lv_color_hex(0xefefef), LV_STATE_DEFAULT);
lv_obj_t* led = lv_led_create(obj); /* 创建LED */
lv_obj_set_size(led, scr_act_height() /5 , scr_act_height() /5); /* 设置LED大小 */
lv_obj_align(led, LV_ALIGN_CENTER, -scr_act_width() * 4/ 15, -scr_act_height() /15); /* 设置LED位置 */
lv_led_off(led); /* 关闭LED */
lv_obj_add_event_cb(led, led_event_cb, LV_EVENT_CLICKED, NULL); /* 设置LED事件回调 */
lv_obj_t *label = lv_label_create(lv_scr_act()); /* 创建LED功能标签 */
lv_label_set_text(label, "ROOM 1"); /* 设置文本 */
lv_obj_set_style_text_font(label, font, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_align_to(label, led, LV_ALIGN_OUT_BOTTOM_MID, 0, scr_act_height() /15 ); /* 设置位置 */
}
/**
* @brief LED2
* @param 无
* @return 无
*/
static void lv_example_led_2(void)
{
lv_obj_t* led = lv_led_create(obj); /* 创建LED */
lv_obj_set_size(led, scr_act_height() /5 , scr_act_height() /5); /* 设置LED大小 */
lv_obj_align(led, LV_ALIGN_CENTER, 0, -scr_act_height() /15); /* 设置LED位置 */
lv_led_set_color(led, lv_color_hex(0xff0000)); /* 设置LED颜色 */
lv_led_on(led); /* 打开LED */
lv_obj_add_event_cb(led, led_event_cb, LV_EVENT_CLICKED, NULL); /* 设置LED事件回调 */
lv_obj_t *label = lv_label_create(lv_scr_act()); /* 创建LED功能标签 */
lv_label_set_text(label, "ROOM 2"); /* 设置文本 */
lv_obj_set_style_text_font(label, font, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_align_to(label, led, LV_ALIGN_OUT_BOTTOM_MID, 0, scr_act_height() /15 ); /* 设置位置 */
}
/**
* @brief LED3
* @param 无
* @return 无
*/
static void lv_example_led_3(void)
{
lv_obj_t* led = lv_led_create(obj); /* 创建LED */
lv_obj_set_size(led, scr_act_height() /5 , scr_act_height() /5); /* 设置LED大小 */
lv_obj_align(led, LV_ALIGN_CENTER, scr_act_width() * 4/ 15, -scr_act_height() /15); /* 设置LED位置 */
lv_led_set_color(led, lv_color_hex(0x2fc827)); /* 设置LED颜色 */
lv_led_off(led); /* 关闭LED */
lv_obj_add_event_cb(led, led_event_cb, LV_EVENT_CLICKED, NULL); /* 设置LED事件回调 */
lv_obj_t *label = lv_label_create(lv_scr_act()); /* 创建LED功能标签 */
lv_label_set_text(label, "ROOM 3"); /* 设置文本 */
lv_obj_set_style_text_font(label, font, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_align_to(label, led, LV_ALIGN_OUT_BOTTOM_MID, 0, scr_act_height() /15 ); /* 设置位置 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_led_1(); /* LED1 */
lv_example_led_2(); /* LED2 */
lv_example_led_3(); /* LED3 */
}
测试结果

二十六、列表
主函数
static void list_btn_event_cb(lv_event_t *e)
{
lv_obj_t *list_btn = lv_event_get_target(e); /* 获取触发源 */
lv_label_set_text(list_label, lv_list_get_btn_text(list, list_btn)); /* 获取按钮文本并显示 */
lv_obj_add_state(list_btn, LV_STATE_FOCUS_KEY); /* 添加状态(聚焦) */
}
/**
* @brief 例
* @param 无
* @return 无
*/
static void lv_example_list(void)
{
/* 根据屏幕大小设置字体 */
if (scr_act_width() <= 320)
{
font = &lv_font_montserrat_14;
}
else if (scr_act_width() <= 480)
{
font = &lv_font_montserrat_16;
}
else
{
font = &lv_font_montserrat_18;
}
/* 创建左侧矩形背景 */
lv_obj_t* obj_left = lv_obj_create(lv_scr_act()); /* 创建一个基础对象 */
lv_obj_set_width(obj_left, scr_act_width() * 0.7); /* 设置宽度 */
lv_obj_set_height(obj_left, scr_act_height() * 0.9); /* 设置高度 */
lv_obj_align(obj_left, LV_ALIGN_LEFT_MID, 5, 0); /* 设置位置 */
lv_obj_update_layout(obj_left); /* 手动更新物体的参数 */
/* 创建右侧矩形背景 */
lv_obj_t* obj_right = lv_obj_create(lv_scr_act()); /* 创建一个基础对象 */
lv_obj_set_width(obj_right, scr_act_width() - lv_obj_get_width(obj_left) - 15); /* 设置宽度 */
lv_obj_set_height(obj_right, lv_obj_get_height(obj_left)); /* 设置高度 */
lv_obj_align_to(obj_right, obj_left, LV_ALIGN_OUT_RIGHT_MID, 5, 0); /* 设置位置 */
lv_obj_update_layout(obj_right); /* 手动更新物体的参数 */
/* 显示当前选项的文本内容 */
list_label = lv_label_create(obj_right); /* 创建标签 */
lv_obj_set_width(list_label, lv_obj_get_width(obj_right) - 13); /* 设置标签的宽度 */
lv_obj_align(list_label, LV_ALIGN_TOP_MID, 0, 5); /* 设置标签位置 */
lv_obj_update_layout(list_label); /* 手动更新标签的参数 */
lv_obj_set_style_text_align(list_label, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN); /* 设置标签文本对齐方式 */
lv_label_set_text(list_label, "New"); /* 设置标签文本 */
lv_obj_set_style_text_font(list_label, font, LV_PART_MAIN); /* 设置标签文本字体 */
/* 创建列表 */
list = lv_list_create(obj_left); /* 创建列表 */
lv_obj_set_width(list, lv_obj_get_width(obj_left) * 0.8); /* 设置列表宽度 */
lv_obj_set_height(list, lv_obj_get_height(obj_left) * 0.9); /* 设置列表高度 */
lv_obj_center(list); /* 设置列表的位置 */
lv_obj_set_style_text_font(list, font, LV_PART_MAIN); /* 设置字体 */
/* 为列表添加按钮 */
lv_obj_t* btn;
lv_list_add_text(list, "File"); /* 添加列表文本 */
btn = lv_list_add_btn(list, LV_SYMBOL_FILE, "New"); /* 添加按钮 */
lv_obj_add_event_cb(btn, list_btn_event_cb, LV_EVENT_CLICKED, NULL); /* 添加按钮回调 */
btn = lv_list_add_btn(list, LV_SYMBOL_DIRECTORY, "Open"); /* 添加按钮 */
lv_obj_add_event_cb(btn, list_btn_event_cb, LV_EVENT_CLICKED, NULL); /* 添加按钮回调 */
btn = lv_list_add_btn(list, LV_SYMBOL_SAVE, "Save"); /* 添加按钮 */
lv_obj_add_event_cb(btn, list_btn_event_cb, LV_EVENT_CLICKED, NULL); /* 添加按钮回调 */
btn = lv_list_add_btn(list, LV_SYMBOL_CLOSE, "Delete"); /* 添加按钮 */
lv_obj_add_event_cb(btn, list_btn_event_cb, LV_EVENT_CLICKED, NULL); /* 添加按钮回调 */
btn = lv_list_add_btn(list, LV_SYMBOL_EDIT, "Edit"); /* 添加按钮 */
lv_obj_add_event_cb(btn, list_btn_event_cb, LV_EVENT_CLICKED, NULL); /* 添加按钮回调 */
lv_list_add_text(list, "Connectivity"); /* 添加列表文本 */
btn = lv_list_add_btn(list, LV_SYMBOL_BLUETOOTH, "Bluetooth"); /* 添加按钮 */
lv_obj_add_event_cb(btn, list_btn_event_cb, LV_EVENT_CLICKED, NULL); /* 添加按钮回调 */
btn = lv_list_add_btn(list, LV_SYMBOL_GPS, "Navigation"); /* 添加按钮 */
lv_obj_add_event_cb(btn, list_btn_event_cb, LV_EVENT_CLICKED, NULL); /* 添加按钮回调 */
btn = lv_list_add_btn(list, LV_SYMBOL_USB, "USB"); /* 添加按钮 */
lv_obj_add_event_cb(btn, list_btn_event_cb, LV_EVENT_CLICKED, NULL); /* 添加按钮回调 */
btn = lv_list_add_btn(list, LV_SYMBOL_BATTERY_FULL, "Battery"); /* 添加按钮 */
lv_obj_add_event_cb(btn, list_btn_event_cb, LV_EVENT_CLICKED, NULL); /* 添加按钮回调 */
lv_list_add_text(list, "Exit"); /* 添加列表文本 */
btn = lv_list_add_btn(list, LV_SYMBOL_OK, "Apply"); /* 添加按钮 */
lv_obj_add_event_cb(btn, list_btn_event_cb, LV_EVENT_CLICKED, NULL); /* 添加按钮回调 */
btn = lv_list_add_btn(list, LV_SYMBOL_CLOSE, "Close"); /* 添加按钮 */
lv_obj_add_event_cb(btn, list_btn_event_cb, LV_EVENT_CLICKED, NULL); /* 添加按钮回调 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_list();
}
测试结果:

二十七、仪表
主函数
static void anim_1_indic_cb(lv_obj_t* meter, int32_t value)
{
lv_meter_indicator_t* indic = (lv_meter_indicator_t*)meter->user_data;
lv_meter_set_indicator_value(meter, indic, value);
}
/**
* @brief 例1
* @param 无
* @return 无
*/
static void lv_example_meter_1(void)
{
const lv_font_t* font;
/* 根据屏幕大小设置字体 */
if (scr_act_width() <= 320)
font = &lv_font_montserrat_10;
else if (scr_act_width() <= 480)
font = &lv_font_montserrat_14;
else
font = &lv_font_montserrat_16;
lv_obj_t* meter = lv_meter_create(lv_scr_act()); /* 定义并创建仪表 */
lv_obj_set_width(meter, scr_act_height() * 0.4); /* 设置仪表宽度 */
lv_obj_set_height(meter, scr_act_height() * 0.4); /* 设置仪表高度 */
lv_obj_align(meter, LV_ALIGN_CENTER, -scr_act_width() / 3, 0); /* 设置仪表位置 */
lv_obj_set_style_text_font(meter, font, LV_PART_MAIN); /* 设置仪表文字字体 */
/* 设置仪表刻度 */
lv_meter_scale_t* scale = lv_meter_add_scale(meter); /* 定义并添加刻度 */
lv_meter_set_scale_ticks(meter, scale, 41, 1, scr_act_height() / 80, lv_palette_main(LV_PALETTE_GREY)); /* 设置小刻度 */
lv_meter_set_scale_major_ticks(meter, scale, 8, 1, scr_act_height() / 60, lv_color_black(), scr_act_height() / 30); /* 设置主刻度 */
/* 设置指针 */
lv_meter_indicator_t* indic;
indic = lv_meter_add_arc(meter, scale, 2, lv_palette_main(LV_PALETTE_BLUE), 0);
lv_meter_set_indicator_start_value(meter, indic, 0);
lv_meter_set_indicator_end_value(meter, indic, 20);
indic = lv_meter_add_scale_lines(meter, scale, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_BLUE), false, 0);
lv_meter_set_indicator_start_value(meter, indic, 0);
lv_meter_set_indicator_end_value(meter, indic, 20);
indic = lv_meter_add_arc(meter, scale, 2, lv_palette_main(LV_PALETTE_RED), 0);
lv_meter_set_indicator_start_value(meter, indic, 80);
lv_meter_set_indicator_end_value(meter, indic, 100);
indic = lv_meter_add_scale_lines(meter, scale, lv_palette_main(LV_PALETTE_RED), lv_palette_main(LV_PALETTE_RED), false, 0);
lv_meter_set_indicator_start_value(meter, indic, 80);
lv_meter_set_indicator_end_value(meter, indic, 100);
indic = lv_meter_add_needle_line(meter, scale, 4, lv_palette_main(LV_PALETTE_GREY), -10);
lv_obj_set_user_data(meter, indic);
/* 设置指针动画 */
lv_anim_t a;
lv_anim_init(&a);
lv_anim_set_exec_cb(&a,(lv_anim_exec_xcb_t)anim_1_indic_cb);
lv_anim_set_var(&a, meter);
lv_anim_set_values(&a, 0, 100);
lv_anim_set_time(&a, 2000);
lv_anim_set_repeat_delay(&a, 100);
lv_anim_set_playback_time(&a, 500);
lv_anim_set_playback_delay(&a, 100);
lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
lv_anim_start(&a);
}
static lv_obj_t* meter_2;
/**
* @brief 例2指针动画
* @param 无
* @return 无
*/
static void anim_2_indic_cb(lv_meter_indicator_t* indic, int32_t value)
{
lv_meter_set_indicator_end_value(meter_2, indic, value);
}
/**
* @brief 例2
* @param 无
* @return 无
*/
static void lv_example_meter_2(void)
{
const lv_font_t* font;
/* 根据屏幕大小设置字体 */
if (scr_act_width() <= 320)
font = &lv_font_montserrat_8;
else if (scr_act_width() <= 480)
font = &lv_font_montserrat_10;
else
font = &lv_font_montserrat_14;
meter_2 = lv_meter_create(lv_scr_act()); /* 定义并创建仪表 */
lv_obj_set_width(meter_2, scr_act_height() * 0.4); /* 设置仪表宽度 */
lv_obj_set_height(meter_2, scr_act_height() * 0.4); /* 设置仪表高度 */
lv_obj_center(meter_2); /* 设置仪表位置 */
lv_obj_set_style_text_font(meter_2, font, LV_PART_MAIN); /* 设置仪表文字字体 */
lv_obj_remove_style(meter_2, NULL, LV_PART_INDICATOR); /* 删除仪表指针样式 */
/* 设置仪表刻度 */
lv_meter_scale_t* scale = lv_meter_add_scale(meter_2);
lv_meter_set_scale_ticks(meter_2, scale, 11, 2, scr_act_height() / 15, lv_palette_main(LV_PALETTE_GREY));
lv_meter_set_scale_major_ticks(meter_2, scale, 1, 2, scr_act_height() / 15, lv_color_hex3(0xEEE), scr_act_height() / 40);
lv_meter_set_scale_range(meter_2, scale, 0, 100, 270, 90);
/* 设置指针 */
lv_meter_indicator_t* indic1 = lv_meter_add_arc(meter_2, scale, scr_act_height() / 45, lv_palette_main(LV_PALETTE_RED), 0);
lv_meter_indicator_t* indic2 = lv_meter_add_arc(meter_2, scale, scr_act_height() / 45, lv_palette_main(LV_PALETTE_GREEN), -scr_act_height() / 45);
lv_meter_indicator_t* indic3 = lv_meter_add_arc(meter_2, scale, scr_act_height() / 45, lv_palette_main(LV_PALETTE_BLUE), -scr_act_height() / 22.5);
/* 设置指针动画 */
lv_anim_t a;
lv_anim_init(&a);
lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)anim_2_indic_cb);
lv_anim_set_values(&a, 0, 100);
lv_anim_set_repeat_delay(&a, 100);
lv_anim_set_playback_delay(&a, 100);
lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
lv_anim_set_time(&a, 2000);
lv_anim_set_playback_time(&a, 500);
lv_anim_set_var(&a, indic1);
lv_anim_start(&a);
lv_anim_set_time(&a, 1000);
lv_anim_set_playback_time(&a, 1000);
lv_anim_set_var(&a, indic2);
lv_anim_start(&a);
lv_anim_set_time(&a, 1000);
lv_anim_set_playback_time(&a, 2000);
lv_anim_set_var(&a, indic3);
lv_anim_start(&a);
}
/**
* @brief 例3
* @param 无
* @return 无
*/
static void lv_example_meter_3(void)
{
lv_obj_t* meter = lv_meter_create(lv_scr_act()); /* 定义并创建仪表 */
lv_obj_remove_style(meter, NULL, LV_PART_MAIN); /* 移除背景样式 */
lv_obj_remove_style(meter, NULL, LV_PART_INDICATOR); /* 移除指针样式 */
lv_obj_set_width(meter, scr_act_height() * 0.4); /* 设置仪表宽度 */
lv_obj_set_height(meter, scr_act_height() * 0.4); /* 设置仪表高度 */
lv_obj_align(meter, LV_ALIGN_CENTER, scr_act_width() / 3, 0); /* 设置仪表位置 */
lv_obj_update_layout(meter); /* 手动更新参数 */
/* 设置仪表刻度 */
lv_meter_scale_t* scale = lv_meter_add_scale(meter);
lv_meter_set_scale_ticks(meter, scale, 0, 0, 0, lv_color_black());
lv_meter_set_scale_range(meter, scale, 0, 100, 360, 0);
/* 设置指针 */
lv_coord_t indic_w = scr_act_height() * 0.05;
lv_meter_indicator_t* indic1 = lv_meter_add_arc(meter, scale, indic_w, lv_palette_main(LV_PALETTE_ORANGE), 0);
lv_meter_set_indicator_start_value(meter, indic1, 0);
lv_meter_set_indicator_end_value(meter, indic1, 40);
lv_meter_indicator_t* indic2 = lv_meter_add_arc(meter, scale, indic_w, lv_palette_main(LV_PALETTE_YELLOW), 0);
lv_meter_set_indicator_start_value(meter, indic2, 40); /*Start from the previous*/
lv_meter_set_indicator_end_value(meter, indic2, 80);
lv_meter_indicator_t* indic3 = lv_meter_add_arc(meter, scale, indic_w, lv_palette_main(LV_PALETTE_DEEP_ORANGE), 0);
lv_meter_set_indicator_start_value(meter, indic3, 80); /*Start from the previous*/
lv_meter_set_indicator_end_value(meter, indic3, 100);
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_meter_1();
lv_example_meter_2();
lv_example_meter_3();
}
测试结果

二十八、消息框
主函数
static void slider_event_cb(lv_event_t *e)
{
lv_obj_t *target = lv_event_get_target(e); /* 获取触发源 */
lv_event_code_t code = lv_event_get_code(e); /* 获取事件类型 */
if(code == LV_EVENT_VALUE_CHANGED)
{
lv_label_set_text_fmt(slider_label, "%d%%", lv_slider_get_value(target)); /* 获取当前值,更新音量百分比 */
if(lv_slider_get_value(target) > 80) /* 音量大于80% */
{
lv_obj_clear_flag(msgbox, LV_OBJ_FLAG_HIDDEN); /* 清除消息框隐藏属性,出现弹窗提示 */
}
}
}
/**
* @brief 音量调节滑块
* @param 无
* @return 无
*/
static void lv_example_slider(void)
{
/* 滑块 */
lv_obj_t * slider = lv_slider_create(lv_scr_act()); /* 创建滑块 */
lv_obj_set_size(slider, scr_act_width() / 2, 20); /* 设置大小 */
lv_obj_center(slider); /* 设置位置 */
lv_slider_set_value(slider, 50, LV_ANIM_OFF); /* 设置当前值 */
lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL); /* 添加事件 */
/* 百分比标签 */
slider_label = lv_label_create(lv_scr_act()); /* 创建百分比标签 */
lv_label_set_text(slider_label, "50%"); /* 设置文本内容 */
lv_obj_set_style_text_font(slider_label, &lv_font_montserrat_20, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_align_to(slider_label, slider, LV_ALIGN_OUT_RIGHT_MID, 20, 0); /* 设置位置 */
/* 音量图标 */
lv_obj_t *sound_label = lv_label_create(lv_scr_act()); /* 创建音量标签 */
lv_label_set_text(sound_label, LV_SYMBOL_VOLUME_MAX); /* 设置文本内容:音量图标 */
lv_obj_set_style_text_font(sound_label, &lv_font_montserrat_20, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_align_to(sound_label, slider, LV_ALIGN_OUT_LEFT_MID, -20, 0); /* 设置位置 */
}
/************************* 第二部分 消息框 ******************************/
/**
* @brief 消息框事件回调
* @param *e :事件相关参数的集合,它包含了该事件的所有数据
* @return 无
*/
static void msgbox_event_cb(lv_event_t *e)
{
lv_obj_t *target = lv_event_get_current_target(e); /* 获取当前触发源 */
if(lv_msgbox_get_active_btn(target) == 2) /* 获取按钮索引 */
{
lv_obj_add_flag(msgbox, LV_OBJ_FLAG_HIDDEN); /* 隐藏消息框 */
}
}
/**
* @brief 消息框实例
* @param 无
* @return 无
*/
static void lv_example_msgbox(void)
{
static const char *btns[] = { " ", " ", "OK", "" };
/* 消息框整体 */
msgbox = lv_msgbox_create(lv_scr_act(),LV_SYMBOL_WARNING " Notice","Excessive volume may damage hearing.", btns,false);
lv_obj_set_size(msgbox, 300, 170); /* 设置大小 */
lv_obj_center(msgbox); /* 设置位置 */
lv_obj_set_style_border_width(msgbox, 0, LV_STATE_DEFAULT); /* 去除边框 */
lv_obj_set_style_shadow_width(msgbox, 20, LV_STATE_DEFAULT); /* 设置阴影宽度 */
lv_obj_set_style_shadow_color(msgbox, lv_color_hex(0xa9a9a9), LV_STATE_DEFAULT); /* 设置阴影颜色 */
lv_obj_set_style_pad_top(msgbox,18,LV_STATE_DEFAULT); /* 设置顶部填充 */
lv_obj_set_style_pad_left(msgbox,20,LV_STATE_DEFAULT); /* 设置左侧填充 */
lv_obj_add_event_cb(msgbox, msgbox_event_cb, LV_EVENT_VALUE_CHANGED, NULL); /* 添加事件 */
/* 消息框标题 */
lv_obj_t *title = lv_msgbox_get_title(msgbox); /* 获取标题部分 */
lv_obj_set_style_text_font(title, &lv_font_montserrat_20, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_set_style_text_color(title, lv_color_hex(0xff0000),LV_STATE_DEFAULT); /* 设置文本颜色:红色 */
/* 消息框主体 */
lv_obj_t *content = lv_msgbox_get_content(msgbox); /* 获取主体部分 */
lv_obj_set_style_text_font(content, &lv_font_montserrat_20, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_set_style_text_color(content, lv_color_hex(0x6c6c6c), LV_STATE_DEFAULT); /* 设置文本颜色:灰色 */
lv_obj_set_style_pad_top(content,15,LV_STATE_DEFAULT); /* 设置顶部填充 */
/* 消息框按钮 */
lv_obj_t *btn = lv_msgbox_get_btns(msgbox); /* 获取按钮矩阵部分 */
lv_obj_set_style_bg_opa(btn, 0, LV_PART_ITEMS); /* 设置按钮背景透明度 */
lv_obj_set_style_shadow_width(btn, 0, LV_PART_ITEMS); /* 去除按钮阴影 */
lv_obj_set_style_text_font(btn, &lv_font_montserrat_20, LV_PART_ITEMS); /* 设置字体 */
lv_obj_set_style_text_color(btn, lv_color_hex(0x2271df),LV_PART_ITEMS); /* 设置文本颜色(未按下):蓝色 */
lv_obj_set_style_text_color(btn, lv_color_hex(0xff0000),LV_PART_ITEMS|LV_STATE_PRESSED); /* 设置文本颜色(已按下):红色 */
lv_obj_add_flag(msgbox, LV_OBJ_FLAG_HIDDEN); /* 隐藏消息框 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_slider();
lv_example_msgbox();
}
测试结果

二十九、跨度
主函数
static void lv_example_span(void)
{
lv_obj_t* spangroup = lv_spangroup_create(lv_scr_act()); /* 定义并创建spangroup */
lv_obj_set_width(spangroup, 200); /* 设置spangroup宽度 */
lv_obj_set_height(spangroup, 200); /* 设置spangroup高度 */
lv_obj_center(spangroup); /* 设置spangroup位置 */
lv_obj_set_style_border_width(spangroup, 1, LV_PART_MAIN); /* 设置spangroup边框宽度 */
lv_obj_set_style_border_color(spangroup, lv_palette_main(LV_PALETTE_ORANGE), LV_PART_MAIN); /* 设置spangroup边框颜色 */
lv_spangroup_set_align(spangroup, LV_TEXT_ALIGN_LEFT); /* 设置spangroup文本对齐方式 */
lv_spangroup_set_overflow(spangroup, LV_SPAN_OVERFLOW_CLIP); /* 设置spangroup溢出 */
lv_spangroup_set_indent(spangroup, 20); /* 设置spangroup缩进 */
lv_spangroup_set_mode(spangroup, LV_SPAN_MODE_BREAK); /* 设置spangroup模式 */
lv_span_t* span = lv_spangroup_new_span(spangroup); /* 创建并新建span */
lv_span_set_text(span, "This is span 1."); /* 设置span文本 */
lv_style_set_text_color(&span->style, lv_palette_main(LV_PALETTE_RED)); /* 设置span文本颜色 */
lv_style_set_text_decor(&span->style, LV_TEXT_DECOR_STRIKETHROUGH | LV_TEXT_DECOR_UNDERLINE); /* 设置span文本格式 */
lv_style_set_text_opa(&span->style, LV_OPA_30); /* 设置span文本透明度 */
span = lv_spangroup_new_span(spangroup); /* 新建span */
lv_span_set_text_static(span, "This is span 2."); /* 设置span文本 */
lv_style_set_text_font(&span->style, &lv_font_montserrat_16); /* 设置span文本字体 */
lv_style_set_text_color(&span->style, lv_palette_main(LV_PALETTE_GREEN)); /* 设置span文本颜色 */
span = lv_spangroup_new_span(spangroup); /* 新建span */
lv_span_set_text_static(span, "This is span 3."); /* 设置span文本 */
lv_style_set_text_color(&span->style, lv_palette_main(LV_PALETTE_BLUE)); /* 设置span文本颜色 */
span = lv_spangroup_new_span(spangroup); /* 新建span */
lv_span_set_text_static(span, "This is span 4."); /* 设置span文本 */
lv_style_set_text_color(&span->style, lv_palette_main(LV_PALETTE_GREEN)); /* 设置span文本颜色 */
lv_style_set_text_font(&span->style, &lv_font_montserrat_10); /* 设置span文本字体 */
lv_style_set_text_decor(&span->style, LV_TEXT_DECOR_UNDERLINE); /* 设置span文本格式 */
span = lv_spangroup_new_span(spangroup); /* 新建span */
lv_span_set_text(span, "This is span 5."); /* 设置span文本 */
lv_spangroup_refr_mode(spangroup); /* 更新spangroup模式 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_span();
}
测试记录

三十、微调器
主函数
static void btn_event_cb(lv_event_t *e)
{
lv_obj_t *target = lv_event_get_target(e); /* 获取触发源 */
if (target == btn_up) /* 递增按钮按下 */
{
lv_spinbox_increment(spinbox); /* 数值递增 */
}
else if (target == btn_down) /* 递减按钮按下 */
{
lv_spinbox_decrement(spinbox); /* 数值递减 */
}
}
/**
* @brief 微调器事件回调
* @param *e :事件相关参数的集合,它包含了该事件的所有数据
* @return 无
*/
static void spinbox_event_cb(lv_event_t *e)
{
float spinbox_value; /* 微调器当前值 */
lv_event_code_t code = lv_event_get_code(e); /* 获取事件类型 */
if(code == LV_EVENT_VALUE_CHANGED)
{
spinbox_value= (float)lv_spinbox_get_value(spinbox);
printf("%.1f\r\n", spinbox_value/10);
}
}
/**
* @brief 微调器实例
* @param 无
* @return 无
*/
static void lv_example_spinbox(void)
{
/* 微调器 */
spinbox = lv_spinbox_create(lv_scr_act()); /* 创建微调器 */
lv_spinbox_set_range(spinbox, -10000, 10000); /* 设置范围值 */
lv_spinbox_set_digit_format(spinbox, 5, 4); /* 设置数字格式 */
lv_obj_set_size(spinbox, 150, 47); /* 设置大小 */
lv_obj_center(spinbox); /* 设置位置 */
lv_obj_update_layout(spinbox); /* 更新布局 */
lv_obj_set_style_text_font(spinbox, &lv_font_montserrat_18, LV_PART_MAIN); /* 设置字体 */
lv_obj_set_style_text_align(spinbox, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN); /* 设置文本对齐方式 */
lv_obj_add_event_cb(spinbox, spinbox_event_cb, LV_EVENT_VALUE_CHANGED, NULL); /* 添加事件回调 */
/* 递增按钮 */
btn_up = lv_btn_create(lv_scr_act()); /* 创建按钮 */
lv_obj_set_size(btn_up, 38, 38); /* 设置大小 */
lv_obj_align_to(btn_up, spinbox, LV_ALIGN_OUT_LEFT_MID, -10, 0); /* 设置位置 */
lv_obj_set_style_bg_img_src(btn_up, LV_SYMBOL_PLUS, LV_PART_MAIN); /* 设置背景图标 */
lv_obj_add_event_cb(btn_up, btn_event_cb, LV_EVENT_CLICKED, NULL); /* 添加事件回调 */
/* 递减按钮 */
btn_down = lv_btn_create(lv_scr_act()); /* 创建按钮 */
lv_obj_set_size(btn_down, 38, 38); /* 设置大小 */
lv_obj_align_to(btn_down, spinbox, LV_ALIGN_OUT_RIGHT_MID, 10, 0); /* 设置位置 */
lv_obj_set_style_bg_img_src(btn_down, LV_SYMBOL_MINUS, LV_PART_MAIN); /* 设置背景图标 */
lv_obj_add_event_cb(btn_down, btn_event_cb, LV_EVENT_CLICKED, NULL); /* 添加事件回调 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_spinbox();
}
测试结果

三十一、加载器
主函数
static void lv_example_label(void)
{
/* 根据活动屏幕宽度选择字体 */
if (scr_act_width() <= 480)
{
font = &lv_font_montserrat_14;
}
else
{
font = &lv_font_montserrat_20;
}
/* 加载标题标签 */
label_load = lv_label_create(lv_scr_act());
lv_label_set_text(label_load, "LOADING...");
lv_obj_set_style_text_font(label_load, font, LV_STATE_DEFAULT);
lv_obj_align(label_load, LV_ALIGN_CENTER, 0, scr_act_height() / 10 );
}
/**
* @brief 加载器显示
* @param 无
* @return 无
*/
static void lv_example_spinner(void)
{
spinner = lv_spinner_create(lv_scr_act(), 1000, 60); /* 创建加载器 */
lv_obj_align(spinner, LV_ALIGN_CENTER, 0, -scr_act_height() / 15 ); /* 设置位置 */
lv_obj_set_size(spinner, scr_act_height() / 5, scr_act_height() / 5); /* 设置大小 */
lv_obj_set_style_arc_width(spinner, scr_act_height() / 35, LV_PART_MAIN); /* 设置主体圆弧宽度 */
lv_obj_set_style_arc_width(spinner, scr_act_height() / 35, LV_PART_INDICATOR); /* 设置指示器圆弧宽度 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_label(); /* 加载提示标签 */
lv_example_spinner(); /* 加载器显示 */
}
测试结果

三十二、选项卡
主函数
static void lv_example_tabview(void)
{
/* 根据屏幕大小设置字体 */
if (scr_act_width() <= 480)
{
font = &lv_font_montserrat_14;
}
else
{
font = &lv_font_montserrat_20;
}
/************************* 第一部分:选项卡(基础) ****************************/
lv_obj_t *tabview = lv_tabview_create(lv_scr_act(), LV_DIR_TOP, scr_act_height()/6); /* 创建选项卡 */
lv_obj_set_style_text_font(tabview, font, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_t *tab1 = lv_tabview_add_tab(tabview, "Message"); /* 添加选项卡1 */
lv_obj_t *tab2 = lv_tabview_add_tab(tabview, "Schedule"); /* 添加选项卡2 */
lv_obj_t *tab3 = lv_tabview_add_tab(tabview, "Meeting"); /* 添加选项卡3 */
lv_obj_t *label1 = lv_label_create(tab1); /* 创建标签(在选项卡1内) */
lv_label_set_text(label1, "Tonight's meeting cancelled."); /* 设置文本内容 */
lv_obj_center(label1); /* 设置位置 */
lv_obj_t *label2 = lv_label_create(tab2); /* 创建标签(在选项卡2内) */
lv_label_set_text(label2, "AM 8:30 meet the client\n\n" "PM 13:30 factory tour"); /* 设置文本内容 */
lv_obj_center(label2); /* 设置位置 */
lv_obj_t *label3 = lv_label_create(tab3); /* 创建标签(在选项卡3内) */
lv_label_set_text(label3, "None"); /* 设置文本内容 */
lv_obj_center(label3); /* 设置位置 */
/************************* 第二部分:选项卡(界面优化) ************************/
/* 1、按钮 */
lv_obj_t *btn = lv_tabview_get_tab_btns(tabview); /* 获取按钮部分 */
/* 未选中的按钮 */
lv_obj_set_style_bg_color(btn, lv_color_hex(0xb7472a), LV_PART_ITEMS|LV_STATE_DEFAULT); /* 设置按钮背景颜色:橙色 */
lv_obj_set_style_bg_opa(btn, 200, LV_PART_ITEMS|LV_STATE_DEFAULT); /* 设置按钮背景透明度 */
lv_obj_set_style_text_color(btn, lv_color_hex(0xf3f3f3), LV_PART_ITEMS|LV_STATE_DEFAULT); /* 设置按钮文本颜色:白色 */
/* 选中的按钮 */
lv_obj_set_style_bg_color(btn, lv_color_hex(0xe1e1e1), LV_PART_ITEMS|LV_STATE_CHECKED); /* 设置按钮背景颜色:灰色 */
lv_obj_set_style_bg_opa(btn, 200, LV_PART_ITEMS|LV_STATE_CHECKED); /* 设置按钮背景透明度 */
lv_obj_set_style_text_color(btn, lv_color_hex(0xb7472a), LV_PART_ITEMS|LV_STATE_CHECKED); /* 设置按钮文本颜色:橙色 */
lv_obj_set_style_border_width(btn, 0, LV_PART_ITEMS| LV_STATE_CHECKED); /* 设置按钮边框宽度为0 */
/* 2、主体 */
lv_obj_t *obj = lv_tabview_get_content(tabview); /* 获取主体部分 */
lv_obj_set_style_bg_color(obj, lv_color_hex(0xffffff), LV_STATE_DEFAULT); /* 设置背景颜色:白色 */
lv_obj_set_style_bg_opa(obj, 255, LV_STATE_DEFAULT); /* 设置背景透明度 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_tabview();
}
测试结果

三十三、平铺试图
主函数
static void lv_example_tileview(void)
{
/* 根据屏幕宽度设置字体 */
if (scr_act_width() <= 480)
{
font = &lv_font_montserrat_14;
}
else
{
font = &lv_font_montserrat_20;
}
/* 创建平铺视图页面 */
lv_obj_t *tileview = lv_tileview_create(lv_scr_act()); /* 创建平铺视图 */
lv_obj_t *tile_1 = lv_tileview_add_tile( tileview, 0, 0, LV_DIR_RIGHT ); /* 添加页面1 */
lv_obj_t *tile_2 = lv_tileview_add_tile( tileview, 1, 0, LV_DIR_LEFT|LV_DIR_RIGHT ); /* 添加页面2 */
lv_obj_t *tile_3 = lv_tileview_add_tile( tileview, 2, 0, LV_DIR_LEFT ); /* 添加页面3 */
/* 设置页面内容 */
lv_obj_t *label_1 = lv_label_create(tile_1); /* 创建标签 */
lv_label_set_text(label_1, "Page_1"); /* 设置文本内容 */
lv_obj_set_style_text_font(label_1, font, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_center(label_1); /* 设置位置 */
lv_obj_t *label_2 = lv_label_create(tile_2); /* 创建标签 */
lv_label_set_text(label_2, "Page_2"); /* 设置文本内容 */
lv_obj_set_style_text_font(label_2, font, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_center(label_2); /* 设置位置 */
lv_obj_t *label_3 = lv_label_create(tile_3); /* 创建标签 */
lv_label_set_text(label_3, "Page_3"); /* 设置文本内容 */
lv_obj_set_style_text_font(label_3, font, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_center(label_3); /* 设置位置 */
lv_obj_remove_style(tileview, NULL, LV_PART_SCROLLBAR); /* 移除滚动条 */
/* 左侧状态栏 */
lv_obj_t *label_left = lv_label_create(lv_scr_act()); /* 创建标签 */
lv_label_set_text(label_left, "AM 8:30" ); /* 设置文本内容 */
lv_obj_set_style_text_font(label_left, font, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_align(label_left, LV_ALIGN_TOP_LEFT, 10, 10); /* 设置位置 */
/* 右侧状态栏 */
lv_obj_t *label_right = lv_label_create(lv_scr_act()); /* 创建标签 */
lv_label_set_text(label_right, LV_SYMBOL_WIFI " 80% " LV_SYMBOL_BATTERY_3); /* 设置文本内容 */
lv_obj_set_style_text_font(label_right, font, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_align(label_right, LV_ALIGN_TOP_RIGHT, -10, 10); /* 设置位置 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_tileview();
}
测试结果

三十四、窗口
主函数
static void btn_event_cb(lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e); /* 获取事件类型 */
if(code == LV_EVENT_CLICKED) /* 按钮按下 */
{
lv_obj_add_flag(win, LV_OBJ_FLAG_HIDDEN); /* 隐藏窗口 */
}
}
/**
* @brief 窗口实例
* @param 无
* @return 无
*/
static void lv_example_win(void)
{
/* 根据屏幕宽度选择字体 */
if (scr_act_width() <= 480)
{
font = &lv_font_montserrat_12;
}
else
{
font = &lv_font_montserrat_20;
}
/* 窗口整体 */
win = lv_win_create(lv_scr_act(), scr_act_height()/12); /* 创建窗口 */
lv_obj_set_size(win, scr_act_width()* 5/8, scr_act_height()* 4/7); /* 设置大小 */
lv_obj_center(win); /* 设置位置 */
lv_obj_set_style_border_width(win, 1, LV_STATE_DEFAULT); /* 设置边框宽度 */
lv_obj_set_style_border_color(win, lv_color_hex(0x8a8a8a), LV_STATE_DEFAULT); /* 设置边框颜色 */
lv_obj_set_style_border_opa(win, 100, LV_STATE_DEFAULT); /* 设置边框透明度 */
lv_obj_set_style_radius(win, 10, LV_STATE_DEFAULT); /* 设置圆角 */
/************************* 第一部分:头部 ****************************/
/* 左侧按钮 */
lv_obj_t *btn_setting = lv_win_add_btn(win, LV_SYMBOL_SETTINGS,30); /* 添加按钮 */
lv_obj_set_style_bg_opa(btn_setting, 0, LV_STATE_DEFAULT); /* 设置背景透明度 */
lv_obj_set_style_shadow_width(btn_setting, 0, LV_STATE_DEFAULT); /* 设置阴影宽度 */
lv_obj_set_style_text_color(btn_setting, lv_color_hex(0x000000), LV_STATE_DEFAULT); /* 设置文本颜色 */
/* 标题 */
lv_obj_t *title = lv_win_add_title(win, "Setting"); /* 添加标题 */
lv_obj_set_style_text_font(title, font, LV_STATE_DEFAULT); /* 设置字体 */
/* 右侧按钮 */
lv_obj_t *btn_close = lv_win_add_btn(win, LV_SYMBOL_CLOSE,30); /* 添加按钮 */
lv_obj_set_style_bg_opa(btn_close, 0, LV_STATE_DEFAULT); /* 设置背景透明度 */
lv_obj_set_style_shadow_width(btn_close, 0, LV_STATE_DEFAULT); /* 设置阴影宽度 */
lv_obj_set_style_text_color(btn_close, lv_color_hex(0x000000), LV_STATE_DEFAULT); /* 设置文本颜色(未按下) */
lv_obj_set_style_text_color(btn_close, lv_color_hex(0xff0000), LV_STATE_PRESSED); /* 设置文本颜色(已按下) */
lv_obj_add_event_cb(btn_close, btn_event_cb, LV_EVENT_CLICKED, NULL); /* 添加事件 */
/************************* 第二部分:主体 ****************************/
/* 主体背景 */
lv_obj_t *content = lv_win_get_content(win); /* 获取主体 */
lv_obj_set_style_bg_color(content, lv_color_hex(0xffffff),LV_STATE_DEFAULT); /* 设置背景颜色 */
/* 音乐音量滑块 */
lv_obj_t *slider_audio = lv_slider_create(content); /* 创建滑块 */
lv_obj_set_size(slider_audio, scr_act_width()/3, scr_act_height()/30); /* 设置大小 */
lv_obj_align(slider_audio, LV_ALIGN_CENTER, 15, -scr_act_height()/14); /* 设置位置 */
lv_slider_set_value(slider_audio, 50, LV_ANIM_OFF); /* 设置当前值 */
lv_obj_set_style_bg_color(slider_audio, lv_color_hex(0x787c78), LV_PART_MAIN); /* 设置主体颜色 */
lv_obj_set_style_bg_color(slider_audio, lv_color_hex(0xc3c3c3), LV_PART_INDICATOR); /* 设置指示器颜色 */
lv_obj_remove_style(slider_audio, NULL, LV_PART_KNOB); /* 移除旋钮 */
/* 音乐音量图标 */
lv_obj_t *label_audio = lv_label_create(content); /* 创建音量标签 */
lv_label_set_text(label_audio, LV_SYMBOL_AUDIO); /* 设置文本内容:音乐图标 */
lv_obj_set_style_text_font(label_audio, font, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_align_to(label_audio, slider_audio, LV_ALIGN_OUT_LEFT_MID, -scr_act_width()/40, 0); /* 设置位置 */
/* 闹钟音量滑块 */
lv_obj_t *slider_bell = lv_slider_create(content); /* 创建滑块 */
lv_obj_set_size(slider_bell, scr_act_width()/3, scr_act_height()/30); /* 设置大小 */
lv_obj_align(slider_bell, LV_ALIGN_CENTER, 15, scr_act_height()/14); /* 设置位置 */
lv_slider_set_value(slider_bell, 50, LV_ANIM_OFF); /* 设置当前值 */
lv_obj_set_style_bg_color(slider_bell, lv_color_hex(0x787c78), LV_PART_MAIN); /* 设置主体颜色 */
lv_obj_set_style_bg_color(slider_bell, lv_color_hex(0xc3c3c3), LV_PART_INDICATOR); /* 设置指示器颜色 */
lv_obj_remove_style(slider_bell, NULL, LV_PART_KNOB); /* 移除旋钮 */
/* 闹钟音量图标 */
lv_obj_t *label_bell = lv_label_create(content); /* 创建音量标签 */
lv_label_set_text(label_bell, LV_SYMBOL_BELL); /* 设置文本内容:闹钟图标 */
lv_obj_set_style_text_font(label_bell, font, LV_STATE_DEFAULT); /* 设置字体 */
lv_obj_align_to(label_bell, slider_bell, LV_ALIGN_OUT_LEFT_MID, -scr_act_width()/40, 0); /* 设置位置 */
}
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_win();
}
测试结果
