是 这样吗?? arc = lv_arc_create(lv_scr_act()); lv_arc_set_range(arc, 0, 100); lv_arc_set_value(arc, 60); lv_obj_center(arc); lv_style_t style_arc; lv_style_init(&style_arc); // 设置渐变起始颜色(#3D955E) lv_style_set_bg_color(&style_arc, lv_color_hex(0x3D955E)); // 设置渐变终点颜色(#2A6B4A) lv_style_set_bg_grad_color(&style_arc, lv_color_hex(0x2A6B4A)); // 设置渐变方向(水平/垂直) lv_style_set_bg_grad_dir(&style_arc, LV_GRAD_DIR_HOR); // LV_GRAD_DIR_VER 为垂直 // 其他必要属性 lv_style_set_arc_width(&style_arc, 10); lv_style_set_arc_rounded(&style_arc, true); lv_obj_add_style(arc, &style_arc, LV_PART_INDICATOR);

时间: 2025-06-13 11:20:03 浏览: 13
<think>嗯,用户问他们的代码是否正确,特别是关于LVGL圆弧渐变色的实现。我需要先回忆之前提供的修正方法。之前用户提到在LVGL v8.3+中,渐变色需要使用背景渐变属性而不是旧的API。用户现在给出的代码是否遵循了这一点呢? 首先,用户创建了一个圆弧对象,设置了范围和值,并居中。然后初始化了样式,设置了背景颜色和渐变颜色,还有渐变方向。接着设置了圆弧宽度和圆角,最后将样式应用到LV_PART_INDICATOR部分。看起来步骤是对的,但需要确认细节是否正确。 检查用户是否在正确的部分应用了样式。关键点是将样式添加到LV_PART_INDICATOR,而用户确实这样做了。渐变颜色使用的是bg_grad_color,正确。方向设置也用了bg_grad_dir,符合之前建议的。不过,用户是否遗漏了某些必要属性?比如,是否需要设置背景不透明度?或者圆弧的宽度是否足够? 另外,用户可能没有考虑到样式的生命周期问题。因为样式对象style_arc是在函数内部定义的局部变量,如果这个样式在后续被释放或者作用域外使用,可能会导致问题。需要提醒用户将样式定义为静态或全局变量,确保其生命周期足够长。 还有,用户设置的圆弧宽度是10,是否足够显示渐变效果?通常需要一定的宽度才能明显看到渐变。此外,圆角设置为true,这可能影响渐变的表现,但应该没问题。 另外,用户是否在设置样式前正确初始化了样式对象?是的,调用了lv_style_init。但需要注意,每次调用lv_style_init都会重置样式,所以如果多次使用同一个样式变量,可能会有问题。 最后,用户可能没有测试代码,需要建议他们运行并检查效果,如果有问题再根据现象排查,比如颜色方向是否正确,渐变色是否显示等。可能还需要提醒他们检查LVGL版本是否确实在v8.3以上,否则方法不适用。</think>--- ### 代码分析(基于 LVGL v8.3+) 您的代码 **基本正确**,但需要补充关键细节才能实现完整效果。以下是逐行优化说明: --- #### 1. 基础对象创建 ✅ ```c arc = lv_arc_create(lv_scr_act()); // 创建圆弧对象 lv_arc_set_range(arc, 0, 100); // 设置数值范围 lv_arc_set_value(arc, 60); // 设置当前值 lv_obj_center(arc); // 居中显示 ``` **结论**:基础配置完全正确 --- #### 2. 样式定义优化 🔧 ```c lv_style_t style_arc; lv_style_init(&style_arc); // 颜色设置 ✅ lv_style_set_bg_color(&style_arc, lv_color_hex(0x3D955E)); // 渐变起点色 lv_style_set_bg_grad_color(&style_arc, lv_color_hex(0x2A6B4A)); // 渐变终点色 // 方向设置 ✅ lv_style_set_bg_grad_dir(&style_arc, LV_GRAD_DIR_HOR); // 水平渐变 // 必须补充的配置 ⚠️ lv_style_set_bg_opa(&style_arc, LV_OPA_COVER); // 设置不透明度(默认可能为0) lv_style_set_arc_width(&style_arc, 10); // 圆弧宽度 lv_style_set_arc_rounded(&style_arc, true); // 圆角端点 ``` --- #### 3. 样式应用修正 🎯 ```c // 原代码: lv_obj_add_style(arc, &style_arc, LV_PART_INDICATOR); // 建议优化(增加主部背景色): lv_obj_set_style_arc_color(arc, lv_color_hex(0xE0E0E0), LV_PART_MAIN); // 设置背景环底色 lv_obj_add_style(arc, &style_arc, LV_PART_INDICATOR); // 应用渐变样式 ``` **原理**:`LV_PART_MAIN` 控制背景环,`LV_PART_INDICATOR` 控制进度条 --- ### 关键问题排查表 | 现象 | 解决方案 | 对应代码修正 | |------------------|-----------------------------|-----------------------------| | 渐变不显示 | 确保 `bg_opa` 不为透明 | `lv_style_set_bg_opa(LV_OPA_COVER)` | | 颜色方向相反 | 交换 `bg_color` 和 `bg_grad_color` | 调整两个颜色设置的顺序 | | 圆弧显示为实心 | 检查 `arc_width` 是否 >0 | `lv_style_set_arc_width(10)` | --- ### 完整可运行代码 ```c // 创建圆弧对象 lv_obj_t* arc = lv_arc_create(lv_scr_act()); lv_arc_set_range(arc, 0, 100); lv_arc_set_value(arc, 60); lv_obj_center(arc); // 设置主环底色(灰色背景) lv_obj_set_style_arc_color(arc, lv_color_hex(0xE0E0E0), LV_PART_MAIN); lv_obj_set_style_arc_width(arc, 10, LV_PART_MAIN); // 背景环宽度 // 定义指示器渐变样式 lv_style_t style_arc; lv_style_init(&style_arc); lv_style_set_bg_color(&style_arc, lv_color_hex(0x3D955E)); lv_style_set_bg_grad_color(&style_arc, lv_color_hex(0x2A6B4A)); lv_style_set_bg_grad_dir(&style_arc, LV_GRAD_DIR_HOR); lv_style_set_bg_opa(&style_arc, LV_OPA_COVER); // 关键! lv_style_set_arc_width(&style_arc, 10); lv_style_set_arc_rounded(&style_arc, true); // 应用样式 lv_obj_add_style(arc, &style_arc, LV_PART_INDICATOR); ``` --- ### 效果验证要点 1. **颜色渐变方向**:水平方向应从左到右(`LV_GRAD_DIR_HOR`)呈现 `#3D955E → #2A6B4A` 2. **圆角显示**:圆弧两端应为半圆形(`arc_rounded=true`) 3. **宽度一致性**:主环和指示器宽度需相同(均为10像素) --- ### 高级技巧 - **动态渐变**:通过修改 `bg_color` 和 `bg_grad_color` 实现动画效果: ```c lv_anim_t a; lv_anim_init(&a); lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_style_set_bg_grad_color); lv_anim_set_values(&a, 0x2A6B4A, 0xFF0000); // 颜色渐变到红色 lv_anim_set_time(&a, 1000); lv_anim_start(&a); ``` - **垂直渐变**:修改 `LV_GRAD_DIR_VER` 后需确保圆弧高度足够(建议至少50像素)
阅读全文

相关推荐

/** **************************************************************************************************** * @file main.c * @version V1.0 * @brief LVGL V8无操作系统移植 实验 **************************************************************************************************** * @attention Waiken-Smart 慧勤智远 * * 实验平台: STM32F103ZET6小系统板 * **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" #include "./SYSTEM/delay/delay.h" #include "./USMART/usmart.h" #include "./BSP/LED/led.h" #include "./BSP/LCD/lcd.h" #include "./BSP/KEY/key.h" #include "./BSP/TOUCH/touch.h" #include "./MALLOC/malloc.h" #include "./BSP/TIMER/btim.h" #include "lvgl.h" #include "lv_port_indev_template.h" #include "lv_port_disp_template.h" #include "stdlib.h" #include "time.h" #include "stm32f1xx_hal.h" #include <stdio.h> static int32_t slider_value = 0; //滑块数值--升降台高度 static int32_t arc_value = 0; //圆弧数值--LED亮度 static int32_t c=0; static int32_t b=0; unsigned int gaodu; //高度变量 uint8_t send[2] = {0,0}; //串口发送 static lv_obj_t *label; static lv_obj_t *label1; static lv_obj_t *label_s; static lv_obj_t *label_t; static lv_obj_t *label_t_1; //升降 static lv_obj_t *btn_s; static lv_obj_t *btn; static lv_obj_t *btn1; static lv_obj_t *btn2; static lv_obj_t *msgbox; static lv_obj_t *msgbox1; static lv_obj_t *msgbox2; static lv_obj_t *msgbox3; static lv_obj_t *title; static lv_obj_t *title1; static lv_obj_t *title2; static lv_obj_t *title3; static const char *btn5[]={"Counite",""}; static const char *btn6[]={"Counite",""}; static const char *btn7[]={"Counite",""}; static const char *btn8[]={"Counite",""}; LV_IMG_DECLARE (gaohaoguang); LV_IMG_DECLARE (weixia); LV_IMG_DECLARE (shengjiangtai); LV_IMG_DECLARE (daideng); //static lv_obj_t *led; //static lv_obj_t *switch2; //static lv_obj_t *spinner; //static lv_obj_t *list; //static lv_obj_t *checkbox; //static lv_obj_t *dd; //static lv_obj_t *roller; //static lv_obj_t *bar; //static lv_obj_t *spinbox; //static lv_point_t line_points[]={{150,50},{250,200},{50,200},{150,50}}; //static const char *map[]={"#ff0000 btn1#","\n","btn2","btn3",""}; //static const char *btns[]={"continue","close",""}; UART_HandleTypeDef huart1; void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { if(huart == &huart1) { printf("arc_value"); send[0] = (int)slider_value; send[1] = (int)arc_value; // send[1] += 5; HAL_UART_Transmit_IT(&huart1,send,2); } } int i,n,m,p; uint16_t Num; static void my_event_cb(lv_event_t * e) //回调函数 { lv_obj_t *a=lv_event_get_target(e); if(a==btn) { n=1; } if(a==btn1) {n=0; p=3;} if(p==3){ if(c==1){p=0;lv_label_set_text_fmt (label_s,"Prize: %d ",c);} // lv_obj_clear_flag(msgbox, LV_OBJ_FLAG_HIDDEN); if(c==2){p=0;lv_label_set_text_fmt (label_s,"Prize: %d ",c);} // lv_obj_clear_flag(msgbox1, LV_OBJ_FLAG_HIDDEN); if(c==3){p=0;lv_label_set_text_fmt (label_s,"Prize: %d ",c);} // lv_obj_clear_flag(msgbox2, LV_OBJ_FLAG_HIDDEN); if(c==4){p=0;lv_label_set_text_fmt (label_s,"No");}} // lv_obj_clear_flag(msgbox3, LV_OBJ_FLAG_HIDDEN); } //滑块事件回调------------------------------------------------------------------------------------------- static void slider_event_cb(lv_event_t *e) { lv_event_code_t code = lv_event_get_code(e); if (code != LV_EVENT_VALUE_CHANGED) return; lv_obj_t *slider = lv_event_get_target(e); slider_value = lv_slider_get_value(slider); // 更新全局变量 lv_label_set_text_fmt(label_t, "high: %d", slider_value); } //圆弧事件回调------------------------------------------------------------------------------------------- static void arc_event_cb(lv_event_t *e) { lv_obj_t *target = lv_event_get_target(e); arc_value = lv_arc_get_value(target); } int main(void) { HAL_Init(); /* 初始化HAL库 */ sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */ delay_init(72); /* 延时初始化 */ usart_init(115200); /* 串口初始化为115200 */ usmart_dev.init(72); /* 初始化USMART */ led_init(); /* 初始化LED */ lcd_init(); /* 初始化LCD */ key_init(); /* 初始化按键 */ my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */ tp_dev.init(); /* 触摸屏初始化 */ btim_timx_int_init(10-1,7200-1); /* 初始化定时器 */ lv_init(); /* lvgl系统初始化 */ lv_port_disp_init(); /* lvgl显示接口初始化,放在lv_init()的后面 */ lv_port_indev_init(); /* lvgl输入接口初始化,放在lv_init()的后面 */ //串口------------------------------------------------------------------------------------------ HAL_UART_Transmit_IT(&huart1,send,2); //背景板------------------------------------------------------------------------------------------ // label_t = lv_label_create(lv_scr_act ()); //图片-------------------------------------------------------------------------------------------- lv_obj_t *img = lv_img_create(lv_scr_act()); lv_img_set_src (img,&gaohaoguang); lv_obj_set_pos (img,15,195); lv_obj_t *img1 = lv_img_create(lv_scr_act()); lv_img_set_src (img1,&weixia); lv_obj_set_pos (img1,315,171); lv_obj_t *img2 = lv_img_create(lv_scr_act()); lv_img_set_src (img2,&shengjiangtai); lv_obj_set_pos (img2,26,60); lv_obj_t *img3 = lv_img_create(lv_scr_act()); lv_img_set_src (img3,&daideng); lv_obj_set_pos (img3,197,160); //滑块-------------------------------------------------------------------------------------------- lv_obj_t *slider = lv_slider_create(lv_scr_act()); lv_obj_set_pos(slider,25,-85); lv_obj_set_size(slider,330,30); lv_slider_set_value(slider,0,LV_ANIM_OFF); lv_slider_set_range(slider,0,100); lv_obj_add_event_cb(slider,slider_event_cb,LV_EVENT_VALUE_CHANGED,NULL); // 设置轨道背景色 lv_obj_set_style_bg_color(slider, lv_color_hex(0x808080), LV_PART_MAIN); // 设置指示器颜色 lv_obj_set_style_bg_color(slider, lv_color_hex(0x0000FF), LV_PART_INDICATOR); // 设置旋钮颜色和尺寸 lv_obj_set_style_bg_color(slider, lv_color_hex(0x00ffff), LV_PART_KNOB); lv_obj_set_style_pad_all(slider, 8, LV_PART_KNOB); // 旋钮大小 lv_obj_set_align(slider,LV_ALIGN_CENTER); // 数值显示 label_t = lv_label_create(lv_scr_act()); lv_obj_set_align(label_t, LV_ALIGN_TOP_RIGHT); char text_buffer[20]; // 定义足够大的字符数组存储转换后的字符串 sprintf(text_buffer, "%d", slider_value); // 将整数转换为字符串 lv_label_set_text(label_t, text_buffer); // 传递字符串指针 lv_obj_set_style_text_font(label_t, &lv_font_montserrat_48, 0); // lv_obj_set_style_text_color(label_t_1, lv_color_hex(0x0fff0f), 0); //圆弧-------------------------------------------------------------------------------------------- lv_obj_t *arc = lv_arc_create(lv_scr_act()); /* 设置圆弧尺寸 */ lv_obj_set_size(arc, 174, 174); // 宽度和高度均为 200px /* 调整圆弧线条粗细 */ lv_obj_set_style_arc_width(arc, 20, LV_PART_MAIN); // 背景线条粗细 lv_obj_set_style_arc_width(arc, 20, LV_PART_INDICATOR); // 前景线条粗细 /* 设置位置和范围 */ lv_obj_set_pos(arc, 151, 110); // 调整位置(根据新尺寸可能需要重新定位) lv_arc_set_range(arc, 0, 100); // 值范围 0~100 /* 绑定事件 */ lv_obj_add_event_cb(arc, arc_event_cb, LV_EVENT_VALUE_CHANGED, NULL); // ///////////////////////////////////////////////////////////////////////////////////////////////////////// //拓展内容 1. 实体按键输入 while(1) { srand(Num); // send[0] = slider_value; // send[1] = arc_value; HAL_UART_Transmit_IT(&huart1, send, 2); HAL_Delay(10); // 示例:10ms发送一次 // if(n==1){i=rand()%50+1;} // lv_label_set_text_fmt (label_t," %d ",i); tp_dev.scan(0); /* 触摸扫描 */ lv_task_handler(); Num+=7; if(i>=1&&i<=3){m=1;c=m;lv_label_set_text_fmt (label_s,"Prize: %d ",c);} if(i>=4&&i<10||i>35&&i<40){m=2;c=m;lv_label_set_text_fmt (label_s,"Prize: %d ",c);} if(i>=15&&i<=20||i>45&&i<=50){m=3;c=m;lv_label_set_text_fmt (label_s,"Prize: %d ",c);} if(i>=10&&i<15||i>=40&&i<=45||i>=26&&i<=35||i>20&&i<=25){m=4;c=m;lv_label_set_text_fmt (label_s,"No");} } } 我如何把这两个数据发给电脑send[0] = (int)slider_value; send[1] = (int)arc_value;

这是接收端#include "main.h" #include "adc.h" #include "usart.h" #include "rtc.h" #include "tim.h" #include "gpio.h" //#include "MY_adc.h" #include "math.h" #include "stdio.h" #define LED1_ON() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET) #define LED1_OFF() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_RESET) /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "step.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ float ADC_Value = 0,ADC_Volt = 0,R = 0; uint16_t Lux = 0; uint8_t str_buff[64]; uint16_t ADC0_Get_Value() { HAL_ADC_Start(&hadc1); LED1_ON(); if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK) { ADC_Value = HAL_ADC_GetValue(&hadc1); ADC_Volt = ADC_Value /4096 * 3.3f; R = ADC_Volt / (3.3f - ADC_Volt) * 10000; Lux = 40000 * pow(R, -0.6021); if (Lux > 999) { Lux = 999; } return Lux; } } /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ uint8_t lvgl[2] = {0,0}; uint16_t LED_PWM; /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart == &huart3) { LED_PWM = (int)lvgl[1]*110; __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,LED_PWM); HAL_UART_Receive_IT(&huart3, lvgl, 2); // } } /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_LPUART1_UART_Init(); MX_USART1_UART_Init(); MX_USART2_UART_Init(); MX_USART3_UART_Init(); MX_RTC_Init(); MX_TIM1_Init(); MX_TIM2_Init(); MX_TIM15_Init(); MX_ADC1_Init(); /* USER CODE BEGIN 2 */ Stepper_Init(); Stepper_Rotate(Forward, 2, 1); HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1); HAL_UART_Receive_IT(&huart3, lvgl, 2); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } 这是发送端#include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" #include "./SYSTEM/delay/delay.h" #include "./USMART/usmart.h" #include "./BSP/LED/led.h" #include "./BSP/LCD/lcd.h" #include "./BSP/KEY/key.h" #include "./BSP/TOUCH/touch.h" #include "./MALLOC/malloc.h" #include "./BSP/TIMER/btim.h" #include "lvgl.h" #include "lv_port_indev_template.h" #include "lv_port_disp_template.h" #include "stdlib.h" #include "time.h" #include "stm32f1xx_hal.h" #include <stdio.h> static int32_t slider_value = 0; //滑块数值--升降台高度 static int32_t arc_value = 0; //圆弧数值--LED亮度 static int32_t c=0; static int32_t b=0; unsigned int gaodu; //高度变量 uint8_t send[2] = {0,0}; //串口发送 static lv_obj_t *label; static lv_obj_t *label1; static lv_obj_t *label_s; static lv_obj_t *label_t; static lv_obj_t *label_t_1; //升降 static lv_obj_t *btn_s; static lv_obj_t *btn; static lv_obj_t *btn1; static lv_obj_t *btn2; static lv_obj_t *msgbox; static lv_obj_t *msgbox1; static lv_obj_t *msgbox2; static lv_obj_t *msgbox3; static lv_obj_t *title; static lv_obj_t *title1; static lv_obj_t *title2; static lv_obj_t *title3; static const char *btn5[]={"Counite",""}; static const char *btn6[]={"Counite",""}; static const char *btn7[]={"Counite",""}; static const char *btn8[]={"Counite",""}; LV_IMG_DECLARE (gaohaoguang); LV_IMG_DECLARE (weixia); LV_IMG_DECLARE (shengjiangtai); LV_IMG_DECLARE (daideng); //static lv_obj_t *led; //static lv_obj_t *switch2; //static lv_obj_t *spinner; //static lv_obj_t *list; //static lv_obj_t *checkbox; //static lv_obj_t *dd; //static lv_obj_t *roller; //static lv_obj_t *bar; //static lv_obj_t *spinbox; //static lv_point_t line_points[]={{150,50},{250,200},{50,200},{150,50}}; //static const char *map[]={"#ff0000 btn1#","\n","btn2","btn3",""}; //static const char *btns[]={"continue","close",""}; UART_HandleTypeDef huart1; void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { if(huart == &huart1) { send[0] = slider_value; send[1] = arc_value; HAL_UART_Transmit_IT(&huart1,send,2); } } int i,n,m,p; uint16_t Num; static void my_event_cb(lv_event_t * e) //回调函数 { lv_obj_t *a=lv_event_get_target(e); if(a==btn) { n=1; } if(a==btn1) {n=0; p=3;} if(p==3){ if(c==1){p=0;lv_label_set_text_fmt (label_s,"Prize: %d ",c);} // lv_obj_clear_flag(msgbox, LV_OBJ_FLAG_HIDDEN); if(c==2){p=0;lv_label_set_text_fmt (label_s,"Prize: %d ",c);} // lv_obj_clear_flag(msgbox1, LV_OBJ_FLAG_HIDDEN); if(c==3){p=0;lv_label_set_text_fmt (label_s,"Prize: %d ",c);} // lv_obj_clear_flag(msgbox2, LV_OBJ_FLAG_HIDDEN); if(c==4){p=0;lv_label_set_text_fmt (label_s,"No");}} // lv_obj_clear_flag(msgbox3, LV_OBJ_FLAG_HIDDEN); } //滑块事件回调------------------------------------------------------------------------------------------- static void slider_event_cb(lv_event_t *e) { lv_event_code_t code = lv_event_get_code(e); if (code != LV_EVENT_VALUE_CHANGED) return; lv_obj_t *slider = lv_event_get_target(e); slider_value = lv_slider_get_value(slider); // 更新全局变量 lv_label_set_text_fmt(label_t, "high: %d", slider_value); } //圆弧事件回调------------------------------------------------------------------------------------------- static void arc_event_cb(lv_event_t *e) { lv_obj_t *target = lv_event_get_target(e); arc_value = lv_arc_get_value(target); } int main(void) { HAL_Init(); /* 初始化HAL库 */ sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */ delay_init(72); /* 延时初始化 */ usart_init(115200); /* 串口初始化为115200 */ usmart_dev.init(72); /* 初始化USMART */ led_init(); /* 初始化LED */ lcd_init(); /* 初始化LCD */ key_init(); /* 初始化按键 */ my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */ tp_dev.init(); /* 触摸屏初始化 */ btim_timx_int_init(10-1,7200-1); /* 初始化定时器 */ lv_init(); /* lvgl系统初始化 */ lv_port_disp_init(); /* lvgl显示接口初始化,放在lv_init()的后面 */ lv_port_indev_init(); /* lvgl输入接口初始化,放在lv_init()的后面 */ //串口------------------------------------------------------------------------------------------ HAL_UART_Transmit_IT(&huart1,send,2); //背景板------------------------------------------------------------------------------------------ // label_t = lv_label_create(lv_scr_act ()); //图片-------------------------------------------------------------------------------------------- lv_obj_t *img = lv_img_create(lv_scr_act()); lv_img_set_src (img,&gaohaoguang); lv_obj_set_pos (img,15,195); lv_obj_t *img1 = lv_img_create(lv_scr_act()); lv_img_set_src (img1,&weixia); lv_obj_set_pos (img1,315,171); lv_obj_t *img2 = lv_img_create(lv_scr_act()); lv_img_set_src (img2,&shengjiangtai); lv_obj_set_pos (img2,26,60); lv_obj_t *img3 = lv_img_create(lv_scr_act()); lv_img_set_src (img3,&daideng); lv_obj_set_pos (img3,197,160); //滑块-------------------------------------------------------------------------------------------- lv_obj_t *slider = lv_slider_create(lv_scr_act()); lv_obj_set_pos(slider,25,-85); lv_obj_set_size(slider,330,30); lv_slider_set_value(slider,0,LV_ANIM_OFF); lv_slider_set_range(slider,0,100); lv_obj_add_event_cb(slider,slider_event_cb,LV_EVENT_VALUE_CHANGED,NULL); // 设置轨道背景色 lv_obj_set_style_bg_color(slider, lv_color_hex(0x808080), LV_PART_MAIN); // 设置指示器颜色 lv_obj_set_style_bg_color(slider, lv_color_hex(0x0000FF), LV_PART_INDICATOR); // 设置旋钮颜色和尺寸 lv_obj_set_style_bg_color(slider, lv_color_hex(0x00ffff), LV_PART_KNOB); lv_obj_set_style_pad_all(slider, 8, LV_PART_KNOB); // 旋钮大小 lv_obj_set_align(slider,LV_ALIGN_CENTER); // 数值显示 label_t = lv_label_create(lv_scr_act()); lv_obj_set_align(label_t, LV_ALIGN_TOP_RIGHT); char text_buffer[20]; // 定义足够大的字符数组存储转换后的字符串 sprintf(text_buffer, "%d", slider_value); // 将整数转换为字符串 lv_label_set_text(label_t, text_buffer); // 传递字符串指针 lv_obj_set_style_text_font(label_t, &lv_font_montserrat_48, 0); // lv_obj_set_style_text_color(label_t_1, lv_color_hex(0x0fff0f), 0); //圆弧-------------------------------------------------------------------------------------------- lv_obj_t *arc = lv_arc_create(lv_scr_act()); /* 设置圆弧尺寸 */ lv_obj_set_size(arc, 174, 174); // 宽度和高度均为 200px /* 调整圆弧线条粗细 */ lv_obj_set_style_arc_width(arc, 20, LV_PART_MAIN); // 背景线条粗细 lv_obj_set_style_arc_width(arc, 20, LV_PART_INDICATOR); // 前景线条粗细 /* 设置位置和范围 */ lv_obj_set_pos(arc, 151, 110); // 调整位置(根据新尺寸可能需要重新定位) lv_arc_set_range(arc, 0, 100); // 值范围 0~100 /* 绑定事件 */ lv_obj_add_event_cb(arc, arc_event_cb, LV_EVENT_VALUE_CHANGED, NULL); // ///////////////////////////////////////////////////////////////////////////////////////////////////////// //拓展内容 1. 实体按键输入 while(1) { srand(Num); // send[0] = slider_value; // send[1] = arc_value; // HAL_UART_Transmit_IT(&huart1, send, 2); HAL_Delay(10); // 示例:10ms发送一次 // if(n==1){i=rand()%50+1;} // lv_label_set_text_fmt (label_t," %d ",i); tp_dev.scan(0); /* 触摸扫描 */ lv_task_handler(); Num+=7; if(i>=1&&i<=3){m=1;c=m;lv_label_set_text_fmt (label_s,"Prize: %d ",c);} if(i>=4&&i<10||i>35&&i<40){m=2;c=m;lv_label_set_text_fmt (label_s,"Prize: %d ",c);} if(i>=15&&i<=20||i>45&&i<=50){m=3;c=m;lv_label_set_text_fmt (label_s,"Prize: %d ",c);} if(i>=10&&i<15||i>=40&&i<=45||i>=26&&i<=35||i>20&&i<=25){m=4;c=m;lv_label_set_text_fmt (label_s,"No");} } }分析一下为什么我滑动圆环,LED的亮度没有随之变化

大家在看

最新推荐

recommend-type

MATLAB统计工具箱中的回归分析命令PPT课件.ppt

MATLAB统计工具箱中的回归分析命令PPT课件.ppt
recommend-type

test07094444444444444444

test07094444444444444444
recommend-type

docker 离线安装 gitlab

docker 离线安装 gitlab
recommend-type

网站销售标准管理系统的设计和实现开题报告.doc

网站销售标准管理系统的设计和实现开题报告.doc
recommend-type

精选-软件工程期末复习题.doc

精选-软件工程期末复习题.doc
recommend-type

ASP.NET新闻管理系统:用户管理与内容发布功能

知识点: 1. ASP.NET 概念:ASP.NET 是一个开源、服务器端 Web 应用程序框架,用于构建现代 Web 应用程序。它是 .NET Framework 的一部分,允许开发者使用 .NET 语言(例如 C# 或 VB.NET)来编写网页和 Web 服务。 2. 新闻发布系统功能:新闻发布系统通常具备用户管理、新闻分级、编辑器处理、发布、修改、删除等功能。用户管理指的是系统对不同角色的用户进行权限分配,比如管理员和普通编辑。新闻分级可能是为了根据新闻的重要程度对它们进行分类。编辑器处理涉及到文章内容的编辑和排版,常见的编辑器有CKEditor、TinyMCE等。而发布、修改、删除功能则是新闻发布系统的基本操作。 3. .NET 2.0:.NET 2.0是微软发布的一个较早版本的.NET框架,它是构建应用程序的基础,提供了大量的库和类。它在当时被广泛使用,并支持了大量企业级应用的构建。 4. 文件结构分析:根据提供的压缩包子文件的文件名称列表,我们可以看到以下信息: - www.knowsky.com.txt:这可能是一个文本文件,包含着Knowsky网站的一些信息或者某个页面的具体内容。Knowsky可能是一个技术社区或者文档分享平台,用户可以通过这个链接获取更多关于动态网站制作的资料。 - 源码下载.txt:这同样是一个文本文件,顾名思义,它可能包含了一个新闻系统示例的源代码下载链接或指引。用户可以根据指引下载到该新闻发布系统的源代码,进行学习或进一步的定制开发。 - 动态网站制作指南.url:这个文件是一个URL快捷方式,它指向一个网页资源,该资源可能包含关于动态网站制作的教程、指南或者最佳实践,这对于理解动态网站的工作原理和开发技术将非常有帮助。 - LixyNews:LixyNews很可能是一个项目文件夹,里面包含新闻发布系统的源代码文件。通常,ASP.NET项目会包含多个文件,如.aspx文件(用户界面)、.cs文件(C#代码后台逻辑)、.aspx.cs文件(页面的代码后台)等。这个文件夹中应该还包含Web.config配置文件,它用于配置整个项目的运行参数和环境。 5. 编程语言和工具:ASP.NET主要是使用C#或者VB.NET这两种语言开发的。在该新闻发布系统中,开发者可以使用Visual Studio或其他兼容的IDE来编写、调试和部署网站。 6. 新闻分级和用户管理:新闻分级通常涉及到不同的栏目分类,分类可以是按照新闻类型(如国际、国内、娱乐等),也可以是按照新闻热度或重要性(如头条、焦点等)进行分级。用户管理则是指系统需具备不同的用户身份验证和权限控制机制,保证只有授权用户可以进行新闻的发布、修改和删除等操作。 7. 编辑器处理:一个新闻发布系统的核心组件之一是所使用的Web编辑器。这个编辑器可以是内置的简单文本框,也可以是富文本编辑器(WYSIWYG,即所见即所得编辑器),后者能够提供类似于Word的编辑体验,并能输出格式化后的HTML代码。CKEditor和TinyMCE是常用的开源Web编辑器,它们支持插入图片、视频、表格等多种媒体,并能对文本进行复杂的格式化操作。 8. 发布、修改和删除功能:这是新闻发布系统的基本操作功能。发布功能允许用户将编辑好的新闻内容上线;修改功能可以对已发布的新闻内容进行更新;删除功能则用于移除不再需要的新闻文章。这些操作通常需要后台管理界面来支持,并且系统会在数据库中记录相关操作的记录,以便管理历史版本和审计日志。 以上知识点覆盖了从ASP.NET基础、新闻发布系统的具体功能实现到系统开发过程中的细节处理等多个方面。开发者在构建类似系统时,需要深入了解这些知识点,才能设计和实现一个功能完备、易用、安全的新闻发布系统。
recommend-type

【实战派量化投资秘籍】:Pair Trading策略全方位解析

# 摘要 量化投资中的Pair Trading策略是一种依赖统计套利和市场效率假说的交易方法,其核心在于选择相关性高的资产作为交易对并应用协整理论进行市场中立投资。本文首先概述了Pair Trading策略的理论基础,随后详细探讨了策略的实操技巧,包括数据预处理、模型建立和交易信号生成。接着,文章重点介绍了策略的编程实现,提供了环境搭建
recommend-type

fpga中保持时间建立时间时序约束

<think>我们讨论的是FPGA中的建立时间(Setup Time)和保持时间(Hold Time)时序约束问题。建立时间是指在时钟有效边沿到来之前,数据必须保持稳定的最小时间。保持时间是指在时钟有效边沿到来之后,数据必须保持稳定的最小时间。时序约束就是确保设计满足这些时间要求。 在FPGA设计中,我们通过时序约束(如时钟约束、输入输出延迟约束等)来告知工具设计的时序要求,工具会根据这些约束进行优化和验证。 以下是关于建立时间和保持时间时序约束的详细说明: ### 1. 建立时间和保持时间的基本概念 - **建立时间(Setup Time)**:时钟边沿到达前,数据必须稳定的时间。 -
recommend-type

Notepad2: 高效替代XP系统记事本的多功能文本编辑器

### 知识点详解 #### 标题解析 - **Vista记事本(Notepad2)**: Vista记事本指的是一款名为Notepad2的文本编辑器,它不是Windows Vista系统自带的记事本,而是一个第三方软件,具备高级编辑功能,使得用户在编辑文本文件时拥有更多便利。 - **可以替换xp记事本Notepad**: 这里指的是Notepad2拥有替换Windows XP系统自带记事本(Notepad)的能力,意味着用户可以安装Notepad2来获取更强大的文本处理功能。 #### 描述解析 - **自定义语法高亮**: Notepad2支持自定义语法高亮显示,可以对编程语言如HTML, XML, CSS, JavaScript等进行关键字着色,从而提高代码的可读性。 - **支持多种编码互换**: 用户可以在不同的字符编码格式(如ANSI, Unicode, UTF-8)之间进行转换,确保文本文件在不同编码环境下均能正确显示和编辑。 - **无限书签功能**: Notepad2支持设置多个书签,用户可以根据需要对重要代码行或者文本行进行标记,方便快捷地进行定位。 - **空格和制表符的显示与转换**: 该编辑器可以将空格和制表符以不同颜色高亮显示,便于区分,并且可以将它们互相转换。 - **文本块操作**: 支持使用ALT键结合鼠标操作,进行文本的快速选择和编辑。 - **括号配对高亮显示**: 对于编程代码中的括号配对,Notepad2能够高亮显示,方便开发者查看代码结构。 - **自定义代码页和字符集**: 支持对代码页和字符集进行自定义,以提高对中文等多字节字符的支持。 - **标准正则表达式**: 提供了标准的正则表达式搜索和替换功能,增强了文本处理的灵活性。 - **半透明模式**: Notepad2支持半透明模式,这是一个具有视觉效果的功能,使得用户体验更加友好。 - **快速调整页面大小**: 用户可以快速放大或缩小编辑器窗口,而无需更改字体大小。 #### 替换系统记事本的方法 - **Windows XP/2000系统替换方法**: 首先关闭系统文件保护,然后删除系统文件夹中的notepad.exe,将Notepad2.exe重命名为notepad.exe,并将其复制到C:\Windows和C:\Windows\System32目录下,替换旧的记事本程序。 - **Windows 98系统替换方法**: 直接将重命名后的Notepad2.exe复制到C:\Windows和C:\Windows\System32目录下,替换旧的记事本程序。 #### 关闭系统文件保护的方法 - 通过修改Windows注册表中的"SFCDisable"键值,可以临时禁用Windows系统的文件保护功能。设置键值为"FFFFFF9D"则关闭文件保护,设置为"0"则重新启用。 #### 下载地址 - 提供了Notepad2的下载链接,用户可以通过该链接获取安装包。 #### 文件压缩包内文件名 - **Notepad2MOD1.1.0.8CN.exe**: 这是压缩包内所含的Notepad2编译版本,表明这是一个中文版的安装程序,版本号为1.1.0.8。 ### 总结 Notepad2是一款强大的文本编辑器,它继承了传统的记事本程序界面,同时引入了诸多增强功能,如语法高亮、编码格式转换、书签管理、文本操作快捷键、括号高亮匹配等。这使得它在处理代码、标记语言和其他文本文件时具备极大的优势。用户可以通过替换系统默认记事本的方式,将Notepad2融入到操作系统中,充分享受这些高级功能带来的便捷。同时,提供了关闭系统文件保护的方法,以便用户能够顺利完成替换工作。最后,给出了下载地址,方便用户获取软件安装包。
recommend-type

【mPower1203驱动故障全攻略】:排除新手疑难杂症,提升部署效率

# 1. mPower1203驱动概述与故障诊断基础 在当今信息技术飞速发展的时代,高效准确地诊断和解决驱动故障对于确保企业级IT系统的稳定运行至关重要。mPower1203驱动作为一个广泛应用于高性能计算和数据处理领域的驱动程序,它的稳定性和性能优化对于很多关键业务系统都是不可忽视的。本章节将为您提供一个mPower1203驱动的概述,并对故障诊断的