熟悉u8g2图形库C语言函数

前言:

前面我们已经成功移植了U8g2的图形库(0.96寸OLED):手把手移植U8g2图形库,这个文章主要熟悉u8g2图形库的常用C语言函数!需要移植的资料的可以关注一波评论区评论,我看到了就会给你发哦!这里主要是介绍一部分函数的使用说明和使用这个强大的库制作一个多功能智能手表!

手表的基本功能(部分外设传感器还没有到):自己成功移植好了库后,可以结合学习的32板子自己去做一点这种小玩具玩玩,也挺有趣的!

基于STMF103的多功能手表玩具(残缺版)

一、OLED的初始化

1.1、初始化与硬件相关的配置函数

函数:
void u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8g2_gpio_and_delay_stm32);
参数:
u8g2 : u8g2 结构体
U8G2_Rx: 屏幕的方向
U8G2_R0(正常方向) U8G2_R1(顺时针旋转90°) U8G2_R2 U8G2_R3(顺时针旋转180°)
U8G2_MIRROR 左右镜像
U8G2_MIRROR_VERTICAL 上下镜像
其他两个参数使用可以看看 手把手移植U8g2库

1.2、u8g2_InitDisplay——OLED显示初始化

函数:
void u8g2_InitDisplay(u8g2_t *u8g2);

作用:写入关键显示参数,对显示初始化

1.3、u8g2_setPowerSave——OLED打开与关闭

函数:

void u8g2_setPowerSave(u8g2_t *u8g2, uint8_t is_enable);

参数:

is_enable:

1:关闭OLED

0:打开OLED

⭐1.4、缓存区的使用

须知:在OLED上显示一个物体,不是直接给OLED发送数据的,它们中间其实有一个中介——缓存区,首先将数据存进缓存区里面,然后在使用函数发送给OLED的!

清除缓存区:

void u8g2_ClearBuffer(u8g2_t *u8g2);

发送缓存区的数据给OLED:

void u8g2_SendBuffer(u8g2_t *u8g2);

清屏函数:

void u8g2_ClearDisplay(u8g2_t *u8g2);作用和一次性使用下面两个函数一致:
void u8g2_ClearBuffer(u8g2_t *u8g2);
void u8g2_SendBuffer(u8g2_t *u8g2);

1.5、使用以上函数对OLED进行初始化和函数配置

 
#define u8         unsigned char  // ?unsigned char ????
#define MAX_LEN    128  //
#define OLED_ADDRESS  0x78 // oled
#define OLED_CMD   0x00  // 
#define OLED_DATA  0x40  // /* 填空初始化u8x8_byte_hw_i2c函数 */
uint8_t u8x8_byte_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{/* u8g2/u8x8 will never send more than 32 bytes between START_TRANSFER and END_TRANSFER */static uint8_t buffer[128];static uint8_t buf_idx;uint8_t *data;switch (msg){case U8X8_MSG_BYTE_INIT:{/* add your custom code to init i2c subsystem */MX_I2C2_Init(); //I2C初始化}break;case U8X8_MSG_BYTE_START_TRANSFER:{buf_idx = 0;}break;case U8X8_MSG_BYTE_SEND:{data = (uint8_t *)arg_ptr;while (arg_int > 0){buffer[buf_idx++] = *data;data++;arg_int--;}}break;case U8X8_MSG_BYTE_END_TRANSFER:{if (HAL_I2C_Master_Transmit(&hi2c2, OLED_ADDRESS, buffer, buf_idx, 1000) != HAL_OK)return 0;}break;case U8X8_MSG_BYTE_SET_DC:break;default:return 0;}return 1;
}/* 填空初始化u8x8_gpio_and_delay函数 */
uint8_t u8x8_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{switch (msg){case U8X8_MSG_DELAY_100NANO: // delay arg_int * 100 nano seconds__NOP();break;case U8X8_MSG_DELAY_10MICRO: // delay arg_int * 10 micro secondsfor (uint16_t n = 0; n < 320; n++){__NOP();}break;case U8X8_MSG_DELAY_MILLI: // delay arg_int * 1 milli secondHAL_Delay(1);break;case U8X8_MSG_DELAY_I2C: // arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHzTims_delay_us(5);break;                    // arg_int=1: delay by 5us, arg_int = 4: delay by 1.25uscase U8X8_MSG_GPIO_I2C_CLOCK: // arg_int=0: Output low at I2C clock pinbreak;                    // arg_int=1: Input dir with pullup high for I2C clock pincase U8X8_MSG_GPIO_I2C_DATA:  // arg_int=0: Output low at I2C data pinbreak;                    // arg_int=1: Input dir with pullup high for I2C data pincase U8X8_MSG_GPIO_MENU_SELECT:u8x8_SetGPIOResult(u8x8, /* get menu select pin state */ 0);break;case U8X8_MSG_GPIO_MENU_NEXT:u8x8_SetGPIOResult(u8x8, /* get menu next pin state */ 0);break;case U8X8_MSG_GPIO_MENU_PREV:u8x8_SetGPIOResult(u8x8, /* get menu prev pin state */ 0);break;case U8X8_MSG_GPIO_MENU_HOME:u8x8_SetGPIOResult(u8x8, /* get menu home pin state */ 0);break;default:u8x8_SetGPIOResult(u8x8, 1); // default return valuebreak;}return 1;
}
void u8g2Init(u8g2_t *u8g2)
{u8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2, U8G2_R0, u8x8_byte_hw_i2c, u8x8_gpio_and_delay); // 初始化u8g2 结构体u8g2_InitDisplay(u8g2);   	 //对缓存进行初始化                                                // 初始化u8x8_gpio_and_delay函数u8g2_SetPowerSave(u8g2, 0);   //wake up 屏幕                                                      // 初始化u8x8_byte_hw_i2c函数u8g2_ClearBuffer(u8g2);   //清除缓存区                                                        //对驱动进行初始化
}

二、入门函数显示各种东西

通过以上的初始化就可以正式学习函数的使用,去如何显示各种各样的东西了!

2.1、u8g2_DrawXBMP——显示一张图片

函数:
void u8g2_DrawXBMP(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w,
u8g2_uint_t h, const uint8_t *bitmap);
参数:
u8g2 : u8g2 结构体 (C interface only).
x: 横坐标
y: 纵坐标
cnt: 宽度
h: 高度 .
bitmap: 指向取模数组的指针
使用例子:
首先使用下面的软件提取出 数组
 

软件设置如下:(设置不对会显示很乱)

代码:

static const unsigned char mmap[] U8X8_PROGMEM= 
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0xC0,0xC7,0x07,0x00,0x40,0x4C,0x0C,0x00,
0x40,0x48,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,
0x00,0x84,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x98,0x00,0x00,
0x00,0xF0,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,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,/*"未命名文件",0*/
};u8g2_DrawXBMP(&u8g2, 0, 0, 25, 25, mmap);u8g2_SendBuffer(&u8g2);//发送缓冲区的数据给OLED

显示效果:

2.2、u8g2_DrawBox() —— 画实心矩形

/*** 画实心矩形,左上角坐标为(x,y),宽度为w,高度为h* @param x 左上角的x坐标* @param y 左上角的y坐标* @param w 方形的宽度* @param h 方形的高度*/
void u8g2_DrawBox(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h)
u8g2_DrawBox(&u8g2,3,7,25,15);

2.3、u8g2_DrawCircle() —— 画空心圆

函数说明:

/*** 画空心圆,圆心坐标为(x0,y0),半径为rad* @param x0 圆点的x坐标* @param y0 圆点的y坐标* @param rad 圆形的半径* @param opt 圆形选项*        U8G2_DRAW_ALL 整个圆*        U8G2_DRAW_UPPER_RIGHT 右上部分的圆弧*        U8G2_DRAW_UPPER_LEFT  左上部分的圆弧*        U8G2_DRAW_LOWER_LEFT  左下部分的圆弧*        U8G2_DRAW_LOWER_RIGHT 右下部分的圆弧*        选项可以通过 | 操作符来组合*/
void u8g2_DrawCircle(u8g2_t *u8g2, u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t rad, uint8_t option)

示例:

u8g2_DrawCircle(&u8g2,20,25,10,U8G2_DRAW_ALL);

2.4、u8g2_DrawDisc() —— 画实心圆

/*** 画实心圆,圆心坐标为(x0,y0),半径为rad* @param x0 圆点的x坐标* @param y0 圆点的y坐标* @param rad 圆形的半径* @param opt 圆形选项*        U8G2_DRAW_ALL 整个圆*        U8G2_DRAW_UPPER_RIGHT 右上部分的圆弧*        U8G2_DRAW_UPPER_LEFT  左上部分的圆弧*        U8G2_DRAW_LOWER_LEFT  左下部分的圆弧*        U8G2_DRAW_LOWER_RIGHT 右下部分的圆弧*       选项可以通过 | 操作符来组合*/
void u8g2_DrawDisc(u8g2_t *u8g2, u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t rad, uint8_t option)

2.5、u8g2_DrawFrame() —— 画空心矩形

/*** 画空心方形,左上角坐标为(x,y),宽度为w,高度为h* @param x 左上角的x坐标* @param y 左上角的y坐标* @param w 方形的宽度* @param h 方形的高度*/
void u8g2_DrawFrame(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h)

2.6、u8g2_DrawHLine() —— 绘制水平线

/*** 绘制水平线* @param x 左上角的x坐标* @param y 左上角的y坐标* @param w 水平线的长度*/void u8g2_DrawHLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len)

2.7、u8g2_DrawLine() —— 两点之间绘制线

/*** 绘制线,从坐标(x0,y0) 到(x1,y1)* @param x0 端点0的x坐标* @param y0 端点0的y坐标* @param x1 端点1的x坐标* @param y1 端点1的y坐标*/
void u8g2_DrawLine(u8g2_t *u8g2, u8g2_uint_t x1, u8g2_uint_t y1, u8g2_uint_t x2, u8g2_uint_t y2)

2.8、u8g2_DrawPixel() —— 绘制像素点

/*** 绘制像素点,坐标(x,y)* @param x 像素点的x坐标* @param y 像素点的y坐标* @Note 关联方法 setDrawColor*/
void u8g2_DrawPixel(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y)

2.9、u8g2_DrawRBox() —— 绘制圆角实心方形

/*** 绘制圆角实心方形,左上角坐标为(x,y),宽度为w,高度为h,圆角半径为r* @param x 左上角的x坐标* @param y 左上角的y坐标* @param w 方形的宽度* @param h 方形的高度* @param r 圆角半径*/
void u8g2_DrawRBox(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, u8g2_uint_t r)

2.10、u8g2_DrawRFrame() —— 绘制圆角空心方形

/*** 绘制圆角空心方形,左上角坐标为(x,y),宽度为w,高度为h,圆角半径为r* @param x 左上角的x坐标* @param y 左上角的y坐标* @param w 方形的宽度* @param h 方形的高度* @param r 圆角半径*/
void u8g2_DrawRFrame(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, u8g2_uint_t r)

2.11、u8g2_DrawTriangle() —— 绘制实心三角形

/*** 绘制实心三角形,定点坐标分别为(x0,y0),(x1,y1),(x2,y2)*/
void u8g2_DrawTriangle(u8g2_t *u8g2, int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2)

2.12、u8g2_DrawVLine() —— 绘制竖直线

/*** 绘制竖直线* @param x 左上角坐标x* @param y 左上角坐标y* @param h 高度*/
void u8g2_DrawVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len)

2.14、部分图形显示效果

三、动态显示

3.1、u8g2_FirstPage/u8g2_NextPage — 绘制命令

/*** 绘制图像*/
void u8g2_FirstPage(u8g2_t *u8g2)
uint8_t u8g2_NextPage(u8g2_t *u8g2)
  • u8g2_FirstPage方法会把当前页码位置变成0;
  • 修改内容处于u8g2_FirstPageu8g2_NextPage之间,每次都是重新渲染所有内容;
  • 该方法消耗的ram空间,比u8g2_SendBuffer消耗的RAM空间要少;

示例:(进度条)

u8g2_FirstPage(&u8g2);
do
{u8g2_DrawBox(&u8g2,0,32,i++,15);HAL_Delay(50);
}while (u8g2_NextPage(&u8g2));

四、绘制字体函数

4.1、u8g2_SetFont()——设置字库

写字之前肯定要自己决定写什么字体呀!

原作者制作了挺多的库的,里面其中甚至还有支持外国语言!这里我就举例我会用的和常用的库!

不同的库就代表着字体的大小或者样式不同,还有语言不同,这个库是非常强大的,还是有很多值得去探究的!

其他的库就需要自己去探究了!

4.2、u8g2_DrawStr()——绘制字符串

参数:
u8g2 : u8g2 结构体(C interface only). x,y: 左下角起点坐标
*s: 字符串文本
返回值: 字符串的长度函数:
u8g2_uint_t u8g2_DrawStr(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, const char *s);
u8g2_uint_t u8g2_DrawStrX2(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, const char *s);

使用例子:

u8g2_SetFont(&u8g2,u8g2_font_ncenB14_tr);//设置字库
u8g2_DrawStr(&u8g2,0,15,"Hello World!");//绘制你好世界
u8g2_SendBuffer(&u8g2);//发送缓冲区的数据给OLED

效果:

 4.3、u8g2_DrawUTF8() —— 绘制UTF8编码的字符

/*** 绘制UTF8编码的字符串* @param x 字符串在屏幕上的左下角x坐标* @param y 字符串在屏幕上的左下角y坐标* @param s 需要绘制的UTF-8编码字符串* @return 返回字符串的长度*/
u8g2_uint_t u8g2_DrawUTF8(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, const char *str)u8g2_uint_t u8g2_DrawUTF8X2(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, const char *s);//双倍显示

使用该方法,有两个前提。首先是你的编译器需要支持UTF-8编码,对于绝大部分Arduino板子已经支持;其次,显示的字符串需要存为“UTF-8”编码,Arduino IDE上默认支持;

该方法需要依赖于fontMode(setFont)以及drawing Color,也就是说如果你传进来的字符串编码必须在font定义里面;

Keil v5 mdk 编译UTF8字符串报错的解决办法–no-multibyte-chars

使用例子:

u8g2_SetFont(&u8g2,u8g2_font_unifont_t_symbols);
u8g2_DrawUTF8(&u8g2,5, 20, "Snowman: ☃");

4.4、绘制数字

还是使用u8g2_DrawStr函数

具体实现:(记得包括头文件stdio.h)

void PrintVarFormat(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, const uint8_t *font, short var)
{char var_buff[100];             //用来存ASCII码u8g2_SetFont(u8g2, font);       //设定字体sprintf(var_buff, "%4d", var);  //传递变量(十进制(占四格))u8g2_DrawStr(u8g2, x, y, var_buff); //显示
}for(uint8_t i=0;i<100;i++)
{u8g2_ClearBuffer(&u8g2); PrintVarFormat(&u8g2,63,31,u8g2_font_ncenB14_tr,i);HAL_Delay(1000);  u8g2_SendBuffer(&u8g2);	
} 

效果:

4.5、u8g2_DrawGlyph()——绘制有趣的图标

函数:

函数:u8g2_uint_t u8g2_DrawGlyph(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, uint16_t encoding);
u8g2_uint_t u8g2_DrawGlyphX2(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, uint16_t encoding);说明:画图形式字符,8g2_uint_t u8g2_DrawGlyphX2()图形放大显示
参数:
u8g2 : u8g2 结构体(C interface only). x,y: 左下角坐标
encoding: 字形索引

例子:

u8g2_SetFont(&u8g2,u8g2_font_unifont_t_symbols);//
u8g2_DrawGlyph(&u8g2,30, 20, 0x2603);
u8g2_DrawGlyphX2(&u8g2,70,45, 0x2603);
u8g2_SendBuffer(&u8g2);

效果:

上面的数字号码,是根据这个图:

五、使用U8g2库显示众多图形效果

这里的代码是一个CSDN大佬博主的,我这里直接拿来使用了,原博主我找不到了,如果原博主看到了可以告诉我一下!

U8g2库常用函数驱动OLED显示效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/493680.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MobaXterm 连接不上VMware 的Ubuntu 虚拟机

想在window11的笔记本上通过VMWare安装Ubuntu操作系统&#xff0c;但是在两个桌面见来回切换&#xff0c;十分的麻烦&#xff0c;于是通过远程服务访问客户端软件MateXterm来访问虚拟机的Linux系统&#xff0c;但是从CSDN上搜到的教程都没有成功&#xff0c;于是&#xff0c;尝…

java中带缓存的输入/输出流

1、介绍 缓存时I/O的一种性能优化。缓存流为I/O流增加了内存缓存区。有了缓存区&#xff0c;使得在流上执行skip()、mark()、reset()方法都成为可能。 2、BufferedInputStream与BufferedOutputStream类 BufferedInputStream类可以对所有InputStream类进行带缓存区的包装以达…

国家认可的人工智能从业人员证书如何报考?

一、证书出台背景 为进一步贯彻落实中共中央印发《关于深化人才发展体制机制改革的意见》和国务院印发《关于“十四五”数字经济发展规划》等有关工作的部署要求&#xff0c;深入实施人才强国战略和创新驱动发展战略&#xff0c;加强全国数字化人才队伍建设&#xff0c;持续推…

基于Spring Boot的找律师系统

一、系统背景与意义 在现代社会&#xff0c;法律服务的需求日益增长&#xff0c;但传统寻找律师的方式往往存在信息不透明、选择困难等问题。基于Spring Boot的找律师系统旨在解决这些问题&#xff0c;通过线上平台&#xff0c;用户可以轻松搜索、比较和选择合适的律师&#x…

springboot460实习生管理系统设计和实现(论文+源码)_kaic

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本实习生管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&…

C#中方法参数传值和传引用的情况

对于引用类型 - 传类类型的具体值时 此时传的是引用 - 单纯传类类型 此时传的是个test引用的副本&#xff0c;在方法内修改的是这个副本的指向 传string&#xff0c;集合同理&#xff0c;只要是指向新对象&#xff0c;就是引用副本在指向 对于值类型 - 传普通值类型 …

游戏AI实现-寻路算法(A*)

A*&#xff08;A-star&#xff09;是一种图遍历和寻路算法&#xff0c;由于其完整性、最优性和最佳效率&#xff0c;它被用于计算机科学的许多领域。给定一个加权图、一个源节点和一个目标节点&#xff0c;该算法将找到从源到目标的最短路径&#xff08;相对于给定的权重&#…

Autosar入门_架构(Architecture)

上一篇 | 返回主目录 | 下一篇 架构(Architecture) 1 Autosar架构分层概述2 MCAL3 ECU抽象层4 复杂设备驱动5 服务层6 RTE7 应用软件层1 Autosar架构分层概述 整体架构分为三层:应用软件(APP)、实时运行环境(RTE)、基础软件(BSW)以下架构对BSW进行了细化,主要包含四…

【计算机网络2】计算机网络的性能能指标

目录 一 、计算机网络的性能指标 二、具体介绍 1、速 率 2、带 宽 3、吞 吐 量 4、时 延 5、时延带宽积 6、往 返 时 延 7、信道利用率 一 、计算机网络的性能指标 计算机网络的性能指标就是从不同方面度量计算机网络的性能&#xff0c;有如下7个指标&#xff1a; 速…

Oracle 中间件 Webcenter Portal服务器环境搭建

环境信息 服务器基本信息 如下表&#xff0c;本次安装总共使用2台服务器&#xff0c;具体信息如下&#xff1a; Webcenter1服务器 归类 SOA服务器 Ip Address 172.xx.xx.xx.xx HostName wcc01.xxxxxx.com Alias wccprd01 Webcenter2服务器 归类 OSB服务器 Ip Addr…

【游戏设计原理】20 - 囚徒困境

一、分析与总结 1. 核心思想 囚徒困境是一种非零和博弈模型&#xff0c;揭示了理性自利个体在决策时的矛盾&#xff1a;在短期利益和长期合作之间往往存在冲突。 合作与背叛&#xff1a;博弈者可以选择合作&#xff08;短期牺牲&#xff0c;换取长远收益&#xff09;或背叛&…

线性代数期末总复习的点点滴滴(1)

一、可逆矩阵、行列式、秩的关系 1.行列式与可逆矩阵的关系 所以&#xff0c;不难看出矩阵可逆的充分必要条件是该矩阵的行列式不为0。 2.接着来看&#xff0c;满秩和矩阵行列式的关系 不难看出满秩和行列式不为0是等价的。 3.再来看&#xff0c;满秩和矩阵可逆的关系 说明了…

ubuntu22.04编译安装Opencv4.8.0+Opencv-contrib4.8.0教程

本章教程,主要记录在Ubuntu22.04版本系统上编译安装安装Opencv4.8.0+Opencv-contrib4.8.0的具体过程。 一、下载opencv和opencv-contrib包 wget https://github.com/opencv/opencv/archive/refs/tags/4.8.0.zip wget https://github.com/opencv/opencv_contrib/archive/refs/…

2024年12月陪玩系统-仿东郊到家约玩系统是一种新兴的线上预约线下社交、陪伴系统分享-优雅草央千澈-附带搭建教程

2024年12月陪玩系统-仿东郊到家约玩系统是一种新兴的线上预约线下社交、陪伴系统分享-优雅草央千澈-附带搭建教程 产品介绍 仿东郊到家约玩系统是一种新兴的线上预约&#xff0c;线下社交、陪伴、助娱、助攻、分享、解答、指导等服务模式&#xff0c;范围涉及电竞、运动、音乐…

算法学习(十六)—— 综合练习

目录 1863. 找出所有子集的异或总和再求和 47. 全排列 Ⅱ 17. 电话号码的字母组合 22. 括号生成 77. 组合 494. 目标和 39. 组合总和 784. 字母大小写全排列 526. 优美的排列 51. N皇后 36. 有效的数独 37. 解数独 79. 单词搜索 1219. 黄金矿工 980. 不同路径 Ⅲ…

「Mac畅玩鸿蒙与硬件45」UI互动应用篇22 - 评分统计工具

本篇将带你实现一个评分统计工具&#xff0c;用户可以对多个选项进行评分。应用会实时更新每个选项的评分结果&#xff0c;并统计平均分。这一功能适合用于问卷调查或评分统计的场景。 关键词 UI互动应用评分统计状态管理数据处理多目标评分 一、功能说明 评分统计工具允许用…

2023年下半年软考信息安全工程师案例分析及答案解析

试题一(16分) 回答问题1至问题6,将解答填入答题纸对应的解答栏内。 问题1(4分) 已知DES算法S盒如下,请补全S盒空缺的数据(1)、(2)、(3)、(4)。 【参考答案】3、13、15、0 问题2(2分) 已知S盒的输入为110011,请计算经过S盒变换之后的二进制输出。 【参考…

HUAWEI-eNSP交换机链路聚合(手动负载分担模式)

配置思路:HUAWEI交换机链路聚合有LACP模式跟手动负载分担模式,本文主打手动负载分担模式:首先交换机-PC之间划分基本vlan,交换机-交换机之间创建链路聚合组,划分端口至链路聚合分组(缺省模式为手动负载分担模式)。结果验证要求同vlan可以ping通,关闭某个聚合端口后仍可…

如何缩放组件

文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了Checkbox Widget相关的内容,本章回中将介绍Transform Widget.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在这里说的Transform是一种容器类widget,它和Container组件类似。它可以包含其它的组件,并…

MacOS安装MySQL

官网下载MySQL 苹果芯片选择ARM版本 安装过程中会要求你输入root的密码&#xff08;不少于8位&#xff09;&#xff0c;这里设置为12345678 打开系统设置查看是否成功安装MySQL 配置MySQL环境变量 vi ~/.zshrc加入一行export PATH$PATH:/usr/local/mysql/bin 执行source ~/…