u8g2图形库——丝滑菜单制作
目录
一、实物效果展示
二、丝滑菜单实现原理
三、代码开源
1.ui_bmp.h
2.ui.h
3.ui.c
一、实物效果展示
u8g2图形库——丝滑菜单制作
二、丝滑菜单实现原理
int ui_run(short *a,short *a_tag,uint8_t step,uint8_t slow_cnt) //UI滑动效果
{uint8_t temp;temp = abs(*a_tag - *a) > slow_cnt ? step : 1;if(*a < *a_tag){*a += temp;}else if (*a > *a_tag){*a -= temp;}else{return 0;}return 1;
}
三、代码开源
1.ui_bmp.h
#ifndef _UI_BMP_H
#define _UI_BMP_H#include "main.h"
#include "u8g2.h"const uint8_t wifi[] U8X8_PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xfe, 0x0f, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00,
0xc0, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x80, 0xf8, 0x7f, 0x00, 0xe0, 0xff, 0xc1, 0xfc, 0x1f, 0x00, 0x80, 0xff, 0xe3,
0xfe, 0x07, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x01, 0x00, 0x00, 0xf8, 0xff, 0x7f, 0x00, 0xff, 0x1f, 0xe0, 0xff, 0x3f, 0xe0, 0xff, 0xff, 0xc0, 0xff,
0x0f, 0xf8, 0xff, 0xff, 0x81, 0x0f, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x80, 0xff, 0x03, 0xfc, 0x1f, 0x00,
0x80, 0x7f, 0x00, 0xe0, 0x1f, 0x00, 0x80, 0x1f, 0x00, 0xc0, 0x1f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0xfc, 0x07, 0x0c, 0x00,
0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x1f, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x7f, 0x00, 0x00,
0x00, 0xe0, 0x1f, 0x7f, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x03, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x07, 0x00, 0x00,
0x00, 0x00, 0xfe, 0x07, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x07, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x07, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x03, 0x00, 0x00,
0x00, 0x00, 0xfc, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};const uint8_t clock[] U8X8_PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x83, 0xff, 0x1f, 0x3c, 0x00,
0xe0, 0x83, 0xff, 0x1f, 0x7c, 0x00, 0xf0, 0x83, 0xff, 0x1f, 0xfc, 0x80, 0xf8, 0x83, 0xff, 0x1f, 0xfc, 0x81, 0xf8, 0x83, 0xff, 0x1f, 0xfc, 0x81,
0xf8, 0xff, 0xff, 0xff, 0xff, 0x81, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x81, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x81, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x81,
0xf8, 0xff, 0xff, 0xff, 0xff, 0x81, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x81, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x81, 0x18, 0x00, 0x00, 0x00, 0x80, 0x81,
0x18, 0x00, 0x00, 0x00, 0x80, 0x81, 0x18, 0x00, 0x00, 0x00, 0x80, 0x81, 0x18, 0x00, 0x00, 0x00, 0x80, 0x81, 0x18, 0x00, 0x00, 0x00, 0x80, 0x81,
0x18, 0x7c, 0xf8, 0xe1, 0x87, 0x81, 0x18, 0x7e, 0xf8, 0xe1, 0x87, 0x81, 0x18, 0x7e, 0xf8, 0xe1, 0x87, 0x81, 0x18, 0x7e, 0xf8, 0xe1, 0x87, 0x81,
0x18, 0x7e, 0xf8, 0xe1, 0x87, 0x81, 0x18, 0x7c, 0xf8, 0xe1, 0x87, 0x81, 0x18, 0x00, 0x00, 0x00, 0x80, 0x81, 0x18, 0x00, 0x00, 0x00, 0x80, 0x81,
0x18, 0x00, 0x00, 0x00, 0x80, 0x81, 0x18, 0x7e, 0xf8, 0xe1, 0x87, 0x81, 0x18, 0x7e, 0xf8, 0xe1, 0x87, 0x81, 0x18, 0x7e, 0xf8, 0xe1, 0x87, 0x81,
0x18, 0x7e, 0xf8, 0xe1, 0x87, 0x81, 0x18, 0x7e, 0xf8, 0xe1, 0x87, 0x81, 0x18, 0x7c, 0xf8, 0xe0, 0x83, 0x81, 0x18, 0x00, 0x00, 0x00, 0x80, 0x81,
0x18, 0x00, 0x00, 0x00, 0x80, 0x81, 0x38, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x70, 0x00, 0x00, 0x00, 0xe0, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x7f, 0x00,
0xc0, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};const uint8_t seting[] U8X8_PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x18, 0x00, 0x00, 0x00, 0xf0, 0x07, 0x7e, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x01, 0x00,
0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x80, 0x7f, 0xff, 0xe7, 0x1f, 0x00, 0x80, 0x1f, 0xf8, 0x81, 0x1f, 0x00,
0x80, 0x0f, 0x00, 0x00, 0x1f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x1f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x1f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x1f, 0x00,
0xc0, 0x07, 0x00, 0x00, 0x3f, 0x00, 0xc0, 0x07, 0xf0, 0x00, 0x3e, 0x00, 0xe0, 0x07, 0xfc, 0x03, 0x7e, 0x80, 0xf8, 0x03, 0xff, 0x0f, 0xfc, 0xe1,
0xfe, 0x81, 0xff, 0x1f, 0xf8, 0xe3, 0xfe, 0xc0, 0xff, 0x1f, 0xf8, 0xe7, 0x7e, 0xc0, 0x0f, 0x3f, 0xe0, 0xe7, 0x3e, 0xc0, 0x07, 0x3e, 0xc0, 0xe7,
0x1e, 0xe0, 0x03, 0x7c, 0xc0, 0xe7, 0x1e, 0xe0, 0x03, 0x7c, 0xc0, 0xe7, 0x1e, 0xe0, 0x03, 0x7c, 0xc0, 0xe7, 0x1e, 0xe0, 0x03, 0x7c, 0xc0, 0xe7,
0x3e, 0xc0, 0x07, 0x3e, 0xc0, 0xe7, 0x7e, 0xc0, 0x8f, 0x3f, 0xe0, 0xe7, 0xfe, 0x80, 0xff, 0x1f, 0xf8, 0xe7, 0xfe, 0x81, 0xff, 0x0f, 0xf8, 0x83,
0xf8, 0x03, 0xff, 0x07, 0xfc, 0x00, 0xe0, 0x03, 0xfc, 0x03, 0x7e, 0x00, 0xe0, 0x07, 0xf0, 0x00, 0x3e, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x3f, 0x00,
0x80, 0x0f, 0x00, 0x00, 0x1f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x1f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x1f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x1f, 0x00,
0x80, 0x1f, 0xf8, 0x81, 0x1f, 0x00, 0x80, 0x7f, 0xff, 0xe7, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x03, 0x00,
0x00, 0xf8, 0xff, 0xff, 0x01, 0x00, 0x00, 0xe0, 0x07, 0x7e, 0x00, 0x00, 0x00, 0x80, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};const uint8_t tianqi[] U8X8_PROGMEM = {
0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x80, 0x00, 0x60, 0x00, 0x18, 0x00, 0xc0, 0x03, 0x60, 0x00, 0x3c, 0x00,
0x80, 0x07, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x0f, 0xf8, 0x01, 0x0f, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x07, 0x00, 0x00, 0xce, 0xff, 0x1f, 0x03, 0x00,
0x00, 0xe0, 0xdf, 0x7f, 0x00, 0x00, 0x00, 0xf0, 0x03, 0xfc, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x78, 0x00, 0xe0, 0x01, 0x00,
0x00, 0x3c, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x3c, 0xe0, 0xdf, 0x03, 0x00, 0x00, 0x1c, 0xf8, 0xff, 0x03, 0x00, 0x00, 0x1c, 0xfe, 0xff, 0x03, 0xe0,
0x7e, 0x1e, 0x3f, 0xf0, 0xe3, 0xf7, 0xff, 0x9e, 0x0f, 0xc0, 0xf7, 0xff, 0xff, 0x9e, 0x07, 0x80, 0xf7, 0x0f, 0x00, 0xff, 0x03, 0x00, 0x0f, 0x00,
0x80, 0xff, 0x01, 0x00, 0x0e, 0x00, 0xc0, 0xff, 0x01, 0x00, 0x1e, 0x00, 0xc0, 0xc1, 0x00, 0x00, 0x1c, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x1c, 0x00,
0xe0, 0x01, 0x00, 0x00, 0x7c, 0x80, 0xf8, 0x01, 0x00, 0x00, 0xfc, 0xc1, 0xfc, 0x00, 0x00, 0x00, 0xf8, 0xe3, 0x3e, 0x00, 0x00, 0x00, 0xc0, 0xe7,
0x1e, 0x00, 0x00, 0x00, 0x80, 0xf7, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x07, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x07, 0x00, 0x00, 0x00, 0x00, 0x7e,
0x07, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x1e, 0x00, 0x00, 0x00, 0x80, 0xe7,
0x3e, 0x00, 0x00, 0x00, 0xc0, 0xc3, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x7f, 0x00,
};const uint8_t shi[] U8X8_PROGMEM = {
0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x7f, 0x00, 0x00,
0x00, 0xfc, 0x01, 0xf8, 0x01, 0x00, 0x80, 0x3f, 0x00, 0xc0, 0x0f, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x7f, 0x80, 0xf8, 0x01, 0x00, 0x00, 0xf8, 0xf1,
0x7f, 0x00, 0x00, 0x00, 0xe0, 0xf7, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x80,
0x18, 0xe6, 0x00, 0x00, 0x80, 0x81, 0x18, 0xe6, 0x00, 0x00, 0x80, 0x81, 0x18, 0x7e, 0xf8, 0x03, 0x80, 0x81, 0x18, 0x7c, 0xfe, 0x07, 0x80, 0x81,
0x18, 0x18, 0x0f, 0x0e, 0x80, 0x81, 0x18, 0x80, 0x07, 0x0c, 0x80, 0x81, 0x18, 0x80, 0x03, 0x00, 0x80, 0x81, 0x18, 0x80, 0x01, 0x00, 0x80, 0x81,
0x18, 0xc0, 0x01, 0x00, 0x80, 0x81, 0x18, 0xc0, 0x00, 0x00, 0x80, 0x81, 0x18, 0xc0, 0x00, 0x00, 0x80, 0x81, 0x18, 0xc0, 0x01, 0x00, 0x80, 0x81,
0x18, 0xc0, 0x01, 0x00, 0x80, 0x81, 0x18, 0x80, 0x01, 0x00, 0x80, 0x81, 0x18, 0x80, 0x03, 0x00, 0x80, 0x81, 0x18, 0x00, 0x07, 0x1c, 0x80, 0x81,
0x18, 0x00, 0x0f, 0x0e, 0x80, 0x81, 0x18, 0x00, 0xfc, 0x0f, 0x80, 0x81, 0x18, 0x00, 0xf8, 0x03, 0x80, 0x81, 0x18, 0x00, 0x00, 0x00, 0x80, 0x81,
0x18, 0x00, 0x00, 0x00, 0x80, 0x81, 0x18, 0x00, 0x00, 0x00, 0x80, 0x81, 0x18, 0x00, 0x00, 0x00, 0x80, 0x81, 0x18, 0x00, 0x00, 0x00, 0x80, 0x81,
0x18, 0x00, 0x00, 0x00, 0x80, 0x81, 0xb8, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x7f, 0x00,
};const uint8_t led[] U8X8_PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x60, 0x00, 0x01, 0x00,
0x00, 0x1e, 0x00, 0x80, 0x03, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x78, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x30, 0xf0, 0xc1, 0x00, 0x00,
0x00, 0x10, 0xfe, 0x07, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x80, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x1e, 0x00, 0x00,
0x00, 0xc0, 0x03, 0x3c, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x38, 0x00, 0x00, 0xc0, 0xc3, 0x01, 0x38, 0x7c, 0x00, 0xe0, 0xc7, 0x01, 0x38, 0x7c, 0x00,
0xe0, 0xc7, 0x01, 0x38, 0x7c, 0x00, 0x00, 0xc0, 0x01, 0x38, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x38, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x38, 0x00, 0x00,
0x00, 0xc0, 0x01, 0x38, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x38, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x38, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x38, 0x00, 0x00,
0x00, 0xc0, 0x01, 0x38, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x38, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x38, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x38, 0x00, 0x00,
0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00, 0x00,
0x00, 0x00, 0x07, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00, 0x00,
0x00, 0x00, 0x07, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};const uint8_t beep[] U8X8_PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x00, 0x00,
0x00, 0x80, 0xdf, 0x01, 0x30, 0x00, 0x00, 0xc0, 0xc7, 0x01, 0x70, 0x00, 0x00, 0xe0, 0xc3, 0x01, 0xf0, 0x00, 0x00, 0xf8, 0xc0, 0x01, 0xe0, 0x01,
0x00, 0x7c, 0xc0, 0x01, 0xc0, 0xf1, 0xff, 0x3f, 0xc0, 0x01, 0xc0, 0xf3, 0xff, 0x0f, 0xc0, 0x01, 0x80, 0xf3, 0xff, 0x07, 0xc0, 0x01, 0x00, 0x77,
0x07, 0x00, 0xc0, 0x81, 0x00, 0x77, 0x07, 0x00, 0xc0, 0xc1, 0x01, 0x77, 0x07, 0x00, 0xc0, 0xc1, 0x03, 0x7f, 0x07, 0x00, 0xc0, 0x81, 0x03, 0x7e,
0x07, 0x00, 0xc0, 0x81, 0x03, 0x7e, 0x07, 0x00, 0xc0, 0x81, 0x03, 0x7e, 0x07, 0x00, 0xc0, 0x01, 0x03, 0x7e, 0x07, 0x00, 0xc0, 0x81, 0x03, 0x7e,
0x07, 0x00, 0xc0, 0x81, 0x03, 0x7e, 0x07, 0x00, 0xc0, 0xc1, 0x03, 0x7e, 0x07, 0x00, 0xc0, 0xc1, 0x01, 0x77, 0x07, 0x00, 0xc0, 0xc1, 0x01, 0xf7,
0xff, 0x07, 0xc0, 0x01, 0x00, 0xf7, 0xff, 0x0f, 0xc0, 0x01, 0x80, 0xf3, 0xff, 0x1f, 0xc0, 0x01, 0xc0, 0x03, 0x00, 0x7e, 0xc0, 0x01, 0xc0, 0x01,
0x00, 0xf8, 0xc0, 0x01, 0xe0, 0x01, 0x00, 0xe0, 0xc3, 0x01, 0xf0, 0x00, 0x00, 0xc0, 0xc7, 0x01, 0x70, 0x00, 0x00, 0x80, 0xdf, 0x01, 0x30, 0x00,
0x00, 0x00, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00,
0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};#endif
2.ui.h
#ifndef _UI_H
#define _UI_H#include "main.h"
#include "oled.h"
#include "u8g2.h"
#include <stdio.h>
#include "key.h"
#include <math.h>
#include <stdlib.h>
#include "beep.h"
// #include "ui_bmp.h"extern short time_x,time_x_tag;
extern short tianqi_x,tianqi_x_tag;
extern short shi_x,shi_x_tag;
extern short led_x,led_x_tag;
extern short beep_x,beep_x_tag;
extern short wangluo_x,wangluo_x_tag;
extern short time_y,time_y_tag;
extern short tianqi_y,tianqi_y_tag;
extern short shi_y,shi_y_tag;
extern short led_y,led_y_tag;
extern short beep_y,beep_y_tag;
extern short wangluo_y,wangluo_y_tag;extern short wifi_frame_len,wifi_frame_len_tag;
extern short wifi_y_offset,wifi_y_offset_tag;
extern short led_frame_len,led_frame_len_tag;
extern short led_y_offset,led_y_offset_tag;
extern short beep_frame_len,beep_frame_len_tag;
extern short beep_y_offset,beep_y_offset_tag; extern int ui_select;
extern int ui_wifi_select;
extern int wifi_select;
extern int ui_led_select;
extern int led_select;
extern int ui_beep_select;
extern int beep_select;
extern int state;
extern u8g2_t u8g2; extern short red_led,green_led,blue_led;typedef struct
{char* str;int len;
}SETTING_LIST;extern SETTING_LIST list_led[];
extern SETTING_LIST list_beep[];
extern SETTING_LIST list_wang[];
extern SETTING_LIST list_tianqi[];void ui_progress(int tag_y,int time);
int ui_run(short *a,short *a_tag,uint8_t step,uint8_t slow_cnt);
void ui_menu(void);
void key_proc(void);
void drawDial(float value,int x,int y);
void drawStyledHalfDial(float value,int centerX,int centerY);
void task_select(void);
void wifi_ui(void);
void time_ui(int x,int y,int year,int month,int day,int hour,int minute,int second);
void tianqi_ui(void);
void shiwen_ui(void);
void led_ui(void);
void beep_ui(void);#endif // !_UI_H
3.ui.c
#include "ui.h"
#include "ui_bmp.h"short menu_x,menu_x_tag,menu_y,menu_y_tag; //菜单界面的x,y与菜单目标x,yshort beep_x,beep_x_tag; //beep x:当前位置数值,x_tag:目标值
short led_x,led_x_tag; //led x:当前位置数值,x_tag:目标值
short shi_x,shi_x_tag; //shi x:当前位置数值,x_tag:目标值
short tianqi_x,tianqi_x_tag; //tianqi x:当前位置数值,x_tag:目标值
short time_x,time_x_tag; //time x:当前位置数值,x_tag:目标值
short wangluo_x,wangluo_x_tag; //网络x:当前位置数值,x_tag:目标值short beep_y=80,beep_y_tag=80;
short led_y=80,led_y_tag=80;
short shi_y=80,shi_y_tag=80;
short tianqi_y=80,tianqi_y_tag=80;
short time_y=80,time_y_tag=80;
short wangluo_y=80,wangluo_y_tag=80;short wifi_frame_len,wifi_frame_len_tag; //wifi框的宽度和框的宽度目标值
short wifi_y_offset,wifi_y_offset_tag; //wifi框的y值与目标值
short led_frame_len,led_frame_len_tag; //led框的宽度和框的宽度目标值
short led_y_offset,led_y_offset_tag; //led框的y值与目标值
short beep_frame_len,beep_frame_len_tag; //beep框的宽度和框的宽度目标值
short beep_y_offset,beep_y_offset_tag; //beep框的y值与目标值int ui_select = 0; //列表的选定int ui_wifi_select = 0; //wifi列表的选择状态
int wifi_select = 0; //wifi列表的选项
int ui_led_select = 0; //led列表的选择状态
int led_select = 0; //led列表的选项
int ui_beep_select = 0; //beep列表的选择状态
int beep_select = 0; //beep列表的选项int state; //状态机int beep_list_len,wangluo_list_len,led_list_len,tianqi_list_len;u8g2_t u8g2; //显示器初始化结构体//蜂鸣器菜单
SETTING_LIST list_beep[] =
{{"ON",2},{"OFF",3},
};
//led菜单
SETTING_LIST list_led[] =
{{"R",1},{"G",1},{"B",1},
};
//天气菜单
SETTING_LIST list_tianqi[] =
{{"today",5},{"next",4},{"after",5},
};
//网络菜单
SETTING_LIST list_wang[] =
{{"ON",2},{"OFF",3},{"RESET",5},
};void ui_progress(int tag_y,int time) //进度条
{u8g2_FirstPage(&u8g2); do{for(uint8_t i=0;i<=99;i=i+2){if(i==76) HAL_Delay(500);u8g2_ClearBuffer(&u8g2); char buff[20];//u8g2_SetFont(&u8g2,u8g2_font_ncenB08_tf);//字体sprintf(buff,"%d%%",(int)(i/100.0*100));u8g2_DrawStr(&u8g2,105,tag_y+9,buff);//当前进度显示u8g2_DrawRBox(&u8g2,2,tag_y,i,10,5);//填充框实心矩形框u8g2_DrawRFrame(&u8g2,0,tag_y-2,103,14,5);//空心矩形框HAL_Delay(time);u8g2_SendBuffer(&u8g2);}}while (u8g2_NextPage(&u8g2));
}int ui_run(short *a,short *a_tag,uint8_t step,uint8_t slow_cnt) //UI滑动效果
{uint8_t temp;temp = abs(*a_tag - *a) > slow_cnt ? step : 1;if(*a < *a_tag){*a += temp;}else if (*a > *a_tag){*a -= temp;}else{return 0;}return 1;
}void ui_menu(void)
{u8g2_ClearBuffer(&u8g2);task_select();wifi_ui();time_ui(time_x-70,time_y-18,2023,11,23,15,47,56);tianqi_ui();shiwen_ui();led_ui();beep_ui();ui_run(&menu_x,&menu_x_tag,10,8);ui_run(&menu_y,&menu_y_tag,10,8);ui_run(&time_y,&time_y_tag,10,8);ui_run(&time_x,&time_x_tag,10,8);ui_run(&tianqi_y,&tianqi_y_tag,10,8);ui_run(&tianqi_x,&tianqi_x_tag,10,8);ui_run(&shi_y,&shi_y_tag,10,8);ui_run(&shi_x,&shi_x_tag,10,8);ui_run(&led_y,&led_y_tag,10,8);ui_run(&led_x,&led_x_tag,10,8);ui_run(&beep_y,&beep_y_tag,10,8);ui_run(&beep_x,&beep_x_tag,10,8);ui_run(&wangluo_y,&wangluo_y_tag,10,8);ui_run(&wangluo_x,&wangluo_x_tag,10,8);ui_run(&wifi_y_offset,&wifi_y_offset_tag,3,4);ui_run(&wifi_frame_len,&wifi_frame_len_tag,4,4);ui_run(&led_y_offset,&led_y_offset_tag,3,4);ui_run(&led_frame_len,&led_frame_len_tag,4,4);ui_run(&beep_y_offset,&beep_y_offset_tag,3,4);ui_run(&beep_frame_len,&beep_frame_len_tag,4,4);HAL_Delay(10);u8g2_SendBuffer(&u8g2);
}void key_proc(void)
{menu_x_tag = beep_x = led_x = shi_x = tianqi_x = time_x = wangluo_x = ui_select*70;if(ui_wifi_select == 0 && ui_led_select == 0 && ui_beep_select == 0){if(key[3].single_flag == 1) //右移动{key[3].single_flag = 0;ui_select--;beep_didi(20);if(ui_select <= 0){ui_select = 0;}}if(key[2].single_flag == 1) //左移动{key[2].single_flag = 0;ui_select++;beep_didi(20);if(ui_select >= 5){ui_select = 5;}}}if(key[0].long_flag == 1) //往上移动{key[0].long_flag = 0;ui_wifi_select = 0;ui_led_select = 0;ui_beep_select = 0;beep_didi(20);menu_y_tag = 0;if(ui_select ==5) beep_y_tag = 80;if(ui_select ==4) led_y_tag = 80;if(ui_select ==3) shi_y_tag = 80;if(ui_select ==2) tianqi_y_tag = 80;if(ui_select ==1) time_y_tag = 80;if(ui_select ==0) wangluo_y_tag = 80;}if(key[1].long_flag == 1) //往下移动{key[1].long_flag = 0;beep_didi(20);menu_y_tag = -64;if(ui_select ==5){beep_y_tag = 20;ui_beep_select = 1;} if(ui_select ==4){led_y_tag = 20;ui_led_select = 1;} if(ui_select ==3) shi_y_tag = 20;if(ui_select ==2) tianqi_y_tag = 20;if(ui_select ==1) time_y_tag = 20;if(ui_select ==0){wangluo_y_tag = 20;ui_wifi_select = 1;} }if(ui_beep_select == 1 && ui_select == 5) //beep二级菜单选择{if(key[0].single_flag == 1) //上移动{key[0].single_flag = 0;beep_didi(20);beep_y_offset_tag -= 20;beep_select -= 1;}if(key[1].single_flag == 1) //下移动{key[1].single_flag = 0;beep_didi(20);beep_y_offset_tag += 20;beep_select += 1;}}if(ui_led_select == 1 && ui_select == 4) //led二级菜单选择{if(key[0].single_flag == 1) //上移动{key[0].single_flag = 0;beep_didi(20);led_y_offset_tag -= 20;led_select -= 1;}if(key[1].single_flag == 1) //下移动{key[1].single_flag = 0;beep_didi(20);led_y_offset_tag += 20;led_select += 1;}if(led_select == 1) //绿灯值{if(key[3].single_flag == 1) //右加 {key[3].single_flag = 0;beep_didi(20);green_led += 1;}if(key[2].single_flag == 1) //右减 {key[2].single_flag = 0;beep_didi(20);green_led -= 1;}}if(led_select == 0) //红灯值{if(key[3].single_flag == 1) //右加 {key[3].single_flag = 0;beep_didi(20);red_led += 1;}if(key[2].single_flag == 1) //右减 {key[2].single_flag = 0;beep_didi(20);red_led -= 1;}}if(led_select == 2) //蓝灯值{if(key[3].single_flag == 1) //右加 {key[3].single_flag = 0;beep_didi(20);blue_led += 1;}if(key[2].single_flag == 1) //右减 {key[2].single_flag = 0;beep_didi(20);blue_led -= 1;}}}if(ui_wifi_select == 1 && ui_select == 0) //wifi二级菜单选择{if(key[0].single_flag == 1) //上移动{key[0].single_flag = 0;beep_didi(20);wifi_y_offset_tag -= 20;wifi_select -= 1;}if(key[1].single_flag == 1) //下移动{key[1].single_flag = 0;beep_didi(20);wifi_y_offset_tag += 20;wifi_select += 1;}}wifi_frame_len_tag = list_wang[wifi_select].len*13;led_frame_len_tag = list_led[led_select].len*13;beep_frame_len_tag = list_beep[beep_select].len*13;ui_menu();
}void task_select(void) //任务选择菜单显示
{u8g2_DrawXBMP(&u8g2,menu_x+40,menu_y+10,44,44,wifi);u8g2_DrawXBMP(&u8g2,menu_x-30,menu_y+10,44,44,clock);u8g2_DrawXBMP(&u8g2,menu_x-100,menu_y+10,44,44,tianqi);u8g2_DrawXBMP(&u8g2,menu_x-170,menu_y+10,44,44,shi);u8g2_DrawXBMP(&u8g2,menu_x-240,menu_y+10,44,44,led);u8g2_DrawXBMP(&u8g2,menu_x-310,menu_y+10,44,44,beep);
}void wifi_ui(void) //wifi任务功能
{wangluo_list_len = sizeof(list_wang) / sizeof(SETTING_LIST);for(int i = 0;i < wangluo_list_len;i++){u8g2_DrawStr(&u8g2,wangluo_x+2,wangluo_y+i*20,list_wang[i].str);}u8g2_SetDrawColor(&u8g2,2);u8g2_DrawRBox(&u8g2,wangluo_x,wangluo_y-16+wifi_y_offset,wifi_frame_len,22,3);u8g2_SetDrawColor(&u8g2,1);
}char str_time[20];void time_ui(int x,int y,int year,int month,int day,int hour,int minute,int second) //time任务功能
{u8g2_DrawRFrame(&u8g2,x+5,y+3,122,58,10);sprintf(str_time,"%d-%d-%d",year,month,day);u8g2_SetFont(&u8g2,u8g2_font_t0_16_mf);u8g2_DrawStr(&u8g2,x+25,y+20,str_time);sprintf(str_time,"%d:%d:%d",hour,minute,second);u8g2_SetFont(&u8g2,u8g2_font_t0_14_mf);u8g2_DrawStrX2(&u8g2,x+10,y+55,str_time);u8g2_SetFont(&u8g2,u8g2_font_t0_22_mf);
}void tianqi_ui(void) //天气任务功能
{tianqi_list_len = sizeof(list_tianqi) / sizeof(SETTING_LIST);for(int i = 0;i < tianqi_list_len;i++){u8g2_DrawStr(&u8g2,tianqi_x-146+6,tianqi_y+i*20,list_tianqi[i].str);}
}void shiwen_ui(void) //室温任务功能
{drawStyledHalfDial(45.0,shi_x-210+68,shi_y+40);
}char str_led[20];
short red_led,green_led,blue_led;
void led_ui(void) //led任务功能
{led_list_len = sizeof(list_led) / sizeof(SETTING_LIST);for(int i = 0;i < led_list_len;i++){u8g2_DrawStr(&u8g2,led_x-274+2,led_y+i*20,list_led[i].str);}sprintf(str_led,"%d",red_led);u8g2_DrawStr(&u8g2,led_x-274+2+98,led_y,str_led); //当前进度显示 红u8g2_DrawRFrame(&u8g2,23,led_y-14,80,14,5); //空心矩形框u8g2_DrawRBox(&u8g2,23,led_y-12,red_led,10,5); //填充框实心矩形框sprintf(str_led,"%d",green_led);u8g2_DrawStr(&u8g2,led_x-274+2+98,led_y+20,str_led); //当前进度显示 绿u8g2_DrawRFrame(&u8g2,23,led_y+20-14,80,14,5); //空心矩形框u8g2_DrawRBox(&u8g2,23,led_y+20-12,green_led,10,5); //填充框实心矩形框sprintf(str_led,"%d",blue_led);u8g2_DrawStr(&u8g2,led_x-274+2+98,led_y+40,str_led); //当前进度显示 蓝u8g2_DrawRFrame(&u8g2,23,led_y+40-14,80,14,5); //空心矩形框u8g2_DrawRBox(&u8g2,23,led_y+40-12,blue_led,10,5); //填充框实心矩形框u8g2_SetDrawColor(&u8g2,2);u8g2_DrawRBox(&u8g2,led_x-274+2,led_y-16+led_y_offset,led_frame_len,22,3);u8g2_SetDrawColor(&u8g2,1);
}void beep_ui(void) //beep任务功能
{beep_list_len = sizeof(list_beep) / sizeof(SETTING_LIST);for(int i = 0;i < beep_list_len;i++){u8g2_DrawStr(&u8g2,beep_x-338+2,beep_y+i*20,list_beep[i].str);}u8g2_SetDrawColor(&u8g2,2);u8g2_DrawRBox(&u8g2,beep_x-338+2,beep_y-16+beep_y_offset,beep_frame_len,22,3);u8g2_SetDrawColor(&u8g2,1);
}void drawDial(float value,int x,int y) {// 仪表盘半径int radius = u8g2.height / 2.1; // 半径// 仪表盘背景u8g2_SetFont(&u8g2, u8g2_font_ncenB14_tr);u8g2_DrawStr(&u8g2, 5, 20, "M");// 绘制仪表盘外框u8g2_DrawCircle(&u8g2, x, y, radius, U8G2_DRAW_ALL);// 绘制刻度for (int angle = 0; angle < 360; angle += 15) {float radian = angle * 3.14 / 180.0;int startX = x + (radius - 5) * cos(radian);int startY = y - (radius - 5) * sin(radian);int endX = x + radius * cos(radian);int endY = y - radius * sin(radian);u8g2_DrawLine(&u8g2, startX, startY, endX, endY);}// 计算指针的终点坐标float angle = value * 3.14 / 180.0;int endX = x + radius * cos(angle);int endY = y - radius * sin(angle);// 绘制指针u8g2_DrawLine(&u8g2, x, y, endX, endY);
}char str_shi[20];void drawStyledHalfDial(float value,int centerX,int centerY) //64 57
{// 仪表盘半径int radius = u8g2.height / 1.2;// 清除屏幕// u8g2_ClearBuffer(&u8g2);//shusprintf(str_shi,"%.1f",value);u8g2_DrawStr(&u8g2,centerX-20,centerY-13,str_shi);// 绘制刻度for (int angle = 0; angle <= 180; angle += 15) {float radian = angle * 3 / 180.0;int startX = centerX + (radius - 5) * cos(radian);int startY = centerY - (radius - 5) * sin(radian);int endX = centerX + radius * cos(radian);int endY = centerY - radius * sin(radian);u8g2_DrawLine(&u8g2, startX, startY, endX, endY);u8g2_DrawLine(&u8g2, startX - 1, startY - 1, endX - 1, endY - 1);}// 计算指针的终点坐标float angle = value * 3 / 180.0;int endX = centerX + radius * cos(angle);int endY = centerY - radius * sin(angle);// 绘制指针u8g2_DrawLine(&u8g2, centerX, centerY, endX, endY);// 更新显示// u8g2_SendBuffer(&u8g2);
}
相关文章:
u8g2图形库——丝滑菜单制作
目录 一、实物效果展示 二、丝滑菜单实现原理 三、代码开源 1.ui_bmp.h 2.ui.h 3.ui.c 一、实物效果展示 u8g2图形库——丝滑菜单制作 二、丝滑菜单实现原理 int ui_run(short *a,short *a_tag,uint8_t step,uint8_t slow_cnt) //UI滑动效果 {uint8_t temp;…...

Go 异常处理流程
在 Go 语言中,panic、recover 和 defer 是用于处理异常情况的关键字。它们通常一起使用来实现对程序错误的处理和恢复。 1. defer 语句 defer 用于在函数返回之前执行一段代码。被 defer 修饰的语句或函数会在包含 defer 的函数执行完毕后执行。defer 常用于资源清…...

ubuntu20.04安装tensorRT流程梳理
目标:先跑demo,再学习源码 step1, 提前准备好CUDA环境 安装CUDA,cuDNN 注意,CUDA,cuDNN需要去官网下载.run和tar文件安装,否则在下面step4 make命令会报找不到cuda等的错误,具体安装教程网上…...

数字孪生技术:提升UI交互性与个性化设计
随着数字化时代的到来,数字孪生技术正在逐渐改变我们的生活和工作方式。数字孪生是一种复制现实世界系统或实体的技术,通过创建数字模型来模拟现实世界中的各种行为和事件。这种技术不仅为人们提供了一个全新的视角来看待和解决问题,同时也为…...

外包干了5个月,技术退步明显.......
先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…...

嵌入式常见的几种接口
嵌入式开发中,常见的外设通信接口/协议有SPI,I2C,UART三种,本文先分三个部分对SPI,I2C,UART进行介绍,最后对这三种协议进行比较。 1 SPI 1.1 SPI的简介 SPI(Serial Peripheral …...

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(七)
分页查询、删除和修改菜品 1. 菜品分页查询1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计 1.2 代码开发1.2.1 设计DTO类1.2.2 设计VO类1.2.3 Controller层1.2.4 Service层接口1.2.5 Service层实现类1.2.6 Mapper层 1.3 功能测试1.3.2 前后端联调测试 2. 删除菜品2.1 需求分析…...
Grafana采用Nginx反向代理,部分功能报错‘Origin not allowed’ behind proxy
只有部分功能会有这个提示,比如修改密码啥的,网上找了下,官方找到了答案:https://community.grafana.com/t/after-update-to-8-3-5-origin-not-allowed-behind-proxy/60598 有个回复是这样的: tl:dr: try adding prox…...

请大数据把奥威BI分析工具推给每一个财务!
这个财务指标怎么算?那些数据什么时候能拿到?看完报表,发现某部门上个月的支出涨幅过大,想了解原因怎么办?……财务人,你是不是每个月都把时间消耗在这些事情上了?那你可得快接住这个BI大数据分…...

知乎禁止转载的回答怎么复制做笔记?
问题 对于“禁止转载”的回答,右键复制是不行的,ctrl-c也不行,粘贴之后都是当前回答的标题。稍微看了代码,应该是对copy事件进行了处理。不过这样真的有用吗,真是防君子不防小人,只是给收集资料增加了许多…...
pta找鞍点—C语言
7-13 找鞍点 分数 300 全屏浏览题目 切换布局 作者 C课程组 单位 浙江大学 一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。 本题要求编写程序,求一个给定的n阶方阵的鞍点。 输入格式: 输入第一行给出一个正整数n(1…...
编程零基础算法 | 四、循环和选择结构——1572. 矩阵对角线元素的和
一、题目链接 1572. 矩阵对角线元素的和 二、题目简介 给你两个整数,n 和 start 。 数组 nums 定义为:nums[i] start 2*i(下标从 0 开始)且 n nums.length 。 请返回 nums 中所有元素按位异或(XOR)后…...

ubantu配置网卡ip
1.ifconfig查看网卡 2. vi /etc/network/interfaces auto ens33 # 网卡名 iface ens33 inet static # 注意网卡名 address 192.168.43.10 # 配置ip地址 netmask 255.255.255.0 # 掩码 gateway 192.168.43.1 # 网关 3.重启网卡 ifconfig ens33 down ifco…...

增加F110 付款方式的乱记录
随便记录一下,基本上有这些信息可以了 为了保持PRD与测试机一致的银行代码,需要先在DEV,QAS 改成4 外部给号 主要都是在FBZP 开户行维护-FI12_HBANK/FI12 S4hana 里面有的没有办法在FI12 维护只能去NWBC NWBC:维护银行账户并关联…...

软件系统安全漏洞检测应该怎么做?靠谱的软件安全检测公司推荐
软件系统安全漏洞检测是指通过对软件系统进行全面的、系统化的评估,发现和解决其中可能存在的安全漏洞和隐患。这些安全漏洞可能会被不法分子利用,引发数据泄露、系统瘫痪、信息被篡改等安全问题,给企业造成严重的经济和声誉损失。那么软件系…...

单片机学习12——电容
电容的作用: 1)降压作用: 容抗: Xc 1/2fc 串联分压原理。2100Ω的容量,50Hz的频率,可以得到1.5uF。断电之后,需要串联一个1MΩ的电阻放电。 那是不是可以使用2100欧姆的电阻来代替电容呢&am…...

淘宝平台商品详情平台订单接入说明
一 文档说明 本文档面向对象为电商平台商品详情数据和订单进行管理的第三方开发者或自研商家 二 支持范围 目前API已经支持订单的接单、取消、退单处理等操作。如果您的订单管理需求现有API不能满足,可以联系我们提出API需求。 参数说明 通用参数说明 参数不要乱…...
Linux文件截断命令(truncate head tail dd)
目录 一、truncate功能概述实例(可用于删除文件末尾指定大小的内容) 二、head功能概述实例(可用于删除文件末尾指定大小的内容) 三、tail功能概述:实例(可用于删除文件开头指定大小的内容) 四、…...
Armbian安装python环境和pip国内源
文章目录 安装python环境配置pip为国内源 安装python环境 更新软件包列表: sudo apt update安装 Python 3(通常是最新版本): sudo apt install python3验证 Python 安装是否成功: python3 --version运行上述命令后&…...

宿主Linux——KVM安装Windows7系统
KVM虚拟技术 KVM(Kernel-based Virtual Machine) 是基于Linux内核的开源虚拟化技术,在一台物理机上可同时运行多个虚拟系统。KVM使用硬件虚拟化扩展,例如Intel的VT和AMD的AMD-V,在性能方面更加高效,可提供更好的计算能力和响应速…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

云原生安全实战:API网关Envoy的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口,负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...

英国云服务器上安装宝塔面板(BT Panel)
在英国云服务器上安装宝塔面板(BT Panel) 是完全可行的,尤其适合需要远程管理Linux服务器、快速部署网站、数据库、FTP、SSL证书等服务的用户。宝塔面板以其可视化操作界面和强大的功能广受国内用户欢迎,虽然官方主要面向中国大陆…...
IP选择注意事项
IP选择注意事项 MTP、FTP、EFUSE、EMEMORY选择时,需要考虑以下参数,然后确定后选择IP。 容量工作电压范围温度范围擦除、烧写速度/耗时读取所有bit的时间待机功耗擦写、烧写功耗面积所需要的mask layer...