OLED模块

news2024/12/23 9:30:21

目录

一:OLED使用原理

硬件部分

SSD1306框图及引脚定义

选择通信接口

原理图

软件部分

4线SPI的传输时序

 3线SPI的传输时序

I2C的通信时序

执行逻辑框图

二:基本命令表

滚动命令表

寻址设置命令表

硬件配置命令表

时间及驱动命令

初始化过程(内部提供VCC)

三:使用部分

OLED显示汉字

显示图像

照片显示在屏幕上面

制作菜单选择界面

倒置屏幕

把0.96寸的移植到1.3寸的文件下里

四:问题解决

汉字编译出现错误

编码格式的转化

五:代码部分

  OLED写命令

OLED写数据

函数初始化

显示光标位置


一:OLED使用原理

 

 0.96寸----显示原理

        OLED的显存分布情况。我们可以理解为:水平方向分布了128个像素点,垂直方向分布了64个像素点。而驱动芯片在点亮像素点的时候,是以8个像素点为单位的。官方的例程推荐的是垂直扫描的方式,也就是先画垂直方向的8个像素点(如下图所示),所以我们在画点的时候Y的取值为0-7,X的取值为0-127。页是芯片设计者为了方便将同一列的8个点阵编成一组,用一个8bit数表示,这样的8行128个数被称为1页。(一共8页,每页128个字节)

  

硬件部分

SSD1306框图及引脚定义


选择通信接口

设置相应的B0,B1,B2,可以选择我们不同的通信方式。

其他引脚在不同通信协议下的意义:

原理图

I2C:


可以看到B0,B1,B2.满足选择通信接口的要求

SPL接口原理图:

可以看到B0,B1,B2.满足选择通信接口的要求

软件部分

https://mp.csdn.net/mp_blog/creation/editor/138286468icon-default.png?t=N7T8https://mp.csdn.net/mp_blog/creation/editor/138286468

4线SPI的传输时序

        串行传输只允许写,不允许读。因此,只有两个功能:写命令、写数据

        E和R/W#时钟没用到,接低电平,CS#片选接低电平,表示始终选中此芯片

        D/C#:高电平:数据,低电平:命令

D0:是串行时钟,在每个上升沿时,从机采样数据

D1:数据输入线,时钟线上升沿,数据维持稳定,从机采样数据。一个时钟,只发送一位

 3线SPI的传输时序

D/C:     D/C是借用SDIN引脚指定的,一个时钟,发送一位,但是在每个字节之前,先发送一个位,表示D/C之后,再跟8个位,传输一个字节。      每次传输的一个字节,都有9个位:第一个是D心,指定此字节是命令还是数据,剩下8个,才是真正的字节。

I2C的通信时序

串行传输只允许写,不允许读

CSDN

        Co(连续模式位):Co = 1,每发送一个字节数据前都加一个Control byte(命令和数据可以灵活切换)

        Co = 0,在字节数据前只发送一个Control byte,之后全部都是字节数据

D/C#表示了我们选择写数据还是写命令。

D/C#=1-------写数据。

D/C#=0------写命令

执行逻辑框图


        左上角:128*64bit像素的点阵显示屏,以左上角为原点,向右为x正轴(0~127),向下为y正轴(0~63)

        左下角:128*8Byte的GDDRAM,x轴与点阵显示屏一样,y轴有所不同,8位一组分为一页,范围为PAGE0 ~ PAGE7,共8页。每传输一个字节数据,将其展开,纵向排列(LSB在上,MSB在下),一位控制一个像素点

        每写完一个字节数据后,内部的地址指针自动向右移动一个单位。当写到页的最后一字节时,地址指针默认回到页的起始位置,也可以通过配置寻址模式实现自动换页,换到下一页的开头

        如果想要实现Y坐标的任意指定,需要读取GGDRAM,但串行传输只允许写数据,那需要在程序中定义缓存数组来实现:先读写缓存数组,最后一起更新到屏幕的GDDRAM中

二:基本命令表

滚动命令表

寻址设置命令表

硬件配置命令表

时间及驱动命令

初始化过程(内部提供VCC)

三:使用部分

#include "stm32f1xx_hal.h"
#include "rcc.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "exit.h"
#include "UART.h"
#include "OLED.h"
#include "iwdg.h"

int main(void)
{

	HAL_Init();                         /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
    delay_init(72);                     /* 延时初始化 */
    LED_Init();                        /* LED初始化 */
	LED_Exit_Init();
	OLED_Init();
	Uart_Init(115200);
	
	
//	/*显示一个字符:必须使用‘’符号*/
//	OLED_ShowChar(0,0,'A',OLED_8X16);
//	OLED_ShowChar(0,20,'A',OLED_6X8);

//	/*显示一个字符串*/
//	OLED_ShowString(20,0,"Hello Word!",OLED_8X16);
//	OLED_ShowString(20,20,"Hello Word!",OLED_6X8);

/*--------------------------------------------------------------------------*/	
	/*
	指定长度(Length)>数据长度(Number)------在数据前面补0
	指定长度(Length)<数据长度(Number)------数据的高位丢失
	不要在数据前面加 0,不然会变为8进制
	*/
	
//	/*显示数字的函数*/
//	OLED_ShowNum(0,0,12345,5,OLED_8X16);   //十进制,正整数
//	OLED_ShowSignedNum(48,0,-66,2,OLED_8X16);  //符号数字(十进制,整数)
//	OLED_ShowHexNum(0,20,0xA5A5,4,OLED_8X16);   //十六进制数字(十六进制,正整数)
//	OLED_ShowBinNum(0,40,0XA5A5,16,OLED_8X16); //二进制数字(二进制,正整数)
//	OLED_ShowFloatNum(40,20,81.232,2,3,OLED_8X16);  //浮点数字(十进制,小数)
	

/*-----------------------------------------------------------*/
	/*显示汉字*/
//	OLED_WriteCommand(0x2E);        //关闭滚动
//	OLED_ShowChinese(0,0,"你好,世界。");
	
//	//显示流动汉字
//		OLED_WriteCommand(0x2E);        //关闭滚动
//  OLED_WriteCommand(0x27);        //水平向左或者右滚动 26/27
//  OLED_WriteCommand(0x00);        //虚拟字节
//	OLED_WriteCommand(0x00);        //起始页 0
//	OLED_WriteCommand(0x07);        //滚动时间间隔
//	OLED_WriteCommand(0x07);        //终止页 7
//	OLED_WriteCommand(0x00);        //虚拟字节
//	OLED_WriteCommand(0xFF);        //虚拟字节
//	OLED_ShowChinese(0,0,"你好,世界。");
//	OLED_ShowChinese(0,16,"你好,西安。");
//	OLED_WriteCommand(0x2F);        //开启滚动



/*------------------------------------------------*/
//	/*显示图像*/
//	OLED_ShowImage(0,0,102,64,SA);

//		//显示照片
//		OLED_GetPoint(0,0);
//		
		
		OLED_Update();
		
		
/*-------------------------------------------*/
   //OLED printf函数使用方法和c语言中的使用方法一样
	 //这个没有办法显示汉字
	 //OLED_Printf(0,0,OLED_8X16,"Num1:%05d",123);

/*------------------------绘图函数-------------*/


//	OLED_DrawPoint(0,0);  //点亮一个像素点
//	OLED_DrawPoint(0,1);  //点亮一个像素点
//	OLED_DrawPoint(0,2);  //点亮一个像素点
//	OLED_DrawPoint(0,3);  //点亮一个像素点
//	OLED_DrawPoint(0,4);  //点亮一个像素点
//	OLED_DrawPoint(0,5);  //点亮一个像素点
//	OLED_DrawPoint(0,6);  //点亮一个像素点
//	OLED_DrawPoint(0,7);  //点亮一个像素点
//	OLED_Update();
//	
	
	
	while(1)
	{
	
		

	}
	
}

OLED显示汉字

取模

将这写文字的16进制的代码复制下来,到OLED_Data.c文件的

const ChineseCell_t OLED_CF16x16[] = {}里面去,按照下面的内容。


/*汉字字模数据*********************/

/*相同的汉字只需要定义一次,汉字不分先后顺序*/
/*必须全部为汉字或者全角字符,不要加入任何半角字符*/

/*宽16像素,高16像素*/
const ChineseCell_t OLED_CF16x16[] = {
	
	",",
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x58,0x38,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,0x18,0x24,0x24,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	
	"你",
	0x00,0x80,0x60,0xF8,0x07,0x40,0x20,0x18,0x0F,0x08,0xC8,0x08,0x08,0x28,0x18,0x00,
	0x01,0x00,0x00,0xFF,0x00,0x10,0x0C,0x03,0x40,0x80,0x7F,0x00,0x01,0x06,0x18,0x00,
	
	"好",
	0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00,
	0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,
	
	"世",
	0x20,0x20,0x20,0xFE,0x20,0x20,0xFF,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x00,
	0x00,0x00,0x00,0x7F,0x40,0x40,0x47,0x44,0x44,0x44,0x47,0x40,0x40,0x40,0x00,0x00,
	
	"界",
	0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x00,
	0x08,0x08,0x04,0x84,0x62,0x1E,0x01,0x00,0x01,0xFE,0x02,0x04,0x04,0x08,0x08,0x00,
	
	/*按照上面的格式,在这个位置加入新的汉字数据*/
	//...
	
	"西",
	0x02,0x02,0xE2,0x22,0x22,0xFE,0x22,0x22,0x22,0xFE,0x22,0x22,0xE2,0x02,0x02,0x00,
	0x00,0x00,0xFF,0x48,0x44,0x43,0x40,0x40,0x40,0x43,0x44,0x44,0xFF,0x00,0x00,0x00,/*",0*/
	"安",
	0x80,0x90,0x8C,0x84,0x84,0x84,0xF5,0x86,0x84,0x84,0x84,0x84,0x94,0x8C,0x80,0x00,
	0x00,0x80,0x80,0x84,0x46,0x49,0x28,0x10,0x10,0x2C,0x23,0x40,0x80,0x00,0x00,0x00,/*1*/

	
	/*未找到指定汉字时显示的默认图形(一个方框,内部一个问号),请确保其位于数组最末尾*/
	"",		
	0xFF,0x01,0x01,0x01,0x31,0x09,0x09,0x09,0x09,0x89,0x71,0x01,0x01,0x01,0x01,0xFF,
	0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x96,0x81,0x80,0x80,0x80,0x80,0x80,0x80,0xFF,

};

代码: 

OLED_ShowChinese(0,0,"你好。");

汉字流动代码:

OLED显示流动汉字

OLED_WriteCommand(0x2E);        //关闭滚动
OLED_WriteCommand(0x27);        //水平向左或者右滚动 26/27
OLED_WriteCommand(0x00);        //虚拟字节
OLED_WriteCommand(0x00);        //起始页 0
OLED_WriteCommand(0x07);        //滚动时间间隔
OLED_WriteCommand(0x07);        //终止页 7
OLED_WriteCommand(0x00);        //虚拟字节
OLED_WriteCommand(0xFF);        //虚拟字节
OLED_ShowChinese(0,0,"你好,世界。");
OLED_ShowChinese(0,16,"你好,西安。");
OLED_WriteCommand(0x2F);        //开启滚动
OLED_Update();
	

显示图像

和上面的文字取模是一个道理

输入宽x (0~127)          高y (0~63)    范围

然后再面板中画出想要的图像,把16进制文件复制到 OLED_Data.c

	/*显示图像*/
	OLED_ShowImage(0,0,128,64,SA);


	OLED_Update();

照片显示在屏幕上面

取模软件只能打开BMP格式的照片,所以需要使用PS把照片进行处理一下。一般是进行2个操作:调整图片的大小,去调颜色(进行二值化处理)

ps处理图片

1:为了凸显轮廓细节

2:进行二值化

3:改变图像尺寸:

注意宽度和高度的取值范围,单位必须为像素。

4:再次进行二值化(效果更加好)

5:保存图片

保存格式选择BMP格式,取模软件只能识别BMP格式的图片。

这个一般直接默认就欧克。

这个里面我们的PS处理完成,取模和上面的一样。

注意:代码中的宽度和高度必须和我们改变图片的尺寸为一样的。

//	/*显示图像*/
	OLED_ShowImage(0,0,102,64,SA);

		//显示照片
		
		
		OLED_Update();

制作菜单选择界面

函数:

/*显存控制函数*/
void OLED_Clear(void);   清除全部
void OLED_ClearArea(int16_t X, int16_t Y, uint8_t Width, uint8_t Height); 清除部分指定区域
void OLED_Reverse(void);    全部取反
void OLED_ReverseArea(int16_t X, int16_t Y, uint8_t Width, uint8_t Height);  指定区域取反

效果:

	while(1)
	{
	
				
		OLED_ShowString(0,0,"Hello Word!",OLED_8X16);
		OLED_ShowString(0,20,"Hello STM32!",OLED_8X16);
		
		OLED_ReverseArea(0,0,90,16);  //取反
		delay_ms(1500);
		OLED_Update();
		
		
		OLED_ClearArea(0,0,128,16);    //清除指定部分区域
		OLED_ShowString(0,0,"Hello Word!",OLED_8X16);
		OLED_ReverseArea(0,20,93,16);     //取反
		delay_ms(1500);
		OLED_Update();

	}

OLED菜单选择界面

倒置屏幕

如果在有一些的情况下,需要把我们的OLED屏幕反着叉的话,进行下面的操作。

在OLED.C文件下找到OLED_Init()函数:

原本的:

OLED_WriteCommand(0xA1);	//设置左右方向,0xA1正常,0xA0左右反置
	
OLED_WriteCommand(0xC8);	//设置上下方向,0xC8正常,0xC0上下反置

改为:

	
	OLED_WriteCommand(0xA0);	//设置左右方向,0xA1正常,0xA0左右反置
	
	OLED_WriteCommand(0xC0);	//设置上下方向,0xC8正常,0xC0上下反置

显示的东西出现倒置,在把屏幕叉反,显示的东西为正,满足我们的要求。

把0.96寸的移植到1.3寸的文件下里

原来的:

void OLED_SetCursor(uint8_t Page, uint8_t X)
{
	/*如果使用此程序驱动1.3寸的OLED显示屏,则需要解除此注释*/
	/*因为1.3寸的OLED驱动芯片(SH1106)有132列*/
	/*屏幕的起始列接在了第2列,而不是第0列*/
	/*所以需要将X加2,才能正常显示*/
//	X += 2;
	
	/*通过指令设置页地址和列地址*/
	OLED_WriteCommand(0xB0 | Page);					//设置页位置
	OLED_WriteCommand(0x10 | ((X & 0xF0) >> 4));	//设置X位置高4位
	OLED_WriteCommand(0x00 | (X & 0x0F));			//设置X位置低4位
}

取消X+=2的注释,1.3寸的OLED就可以正常使用了

四:问题解决

汉字编译出现错误

使用UTF-8编码可能会出现:

解决方法:

--no-multibyte-chars

开启软件对UTF-8写入汉字写入代码的支持了

编码格式的转化

我们使用不同的编码格式,需要对于的OLED的文件需要转化为对应的格式。

把文件到导入里面,转化为需要的编码格式。

在OLED Data.h文件里面该:

#define OLED_CHN_CHAR_WIDTH			2		UTF-8编码格式给3,GB2312编码格式给2

五:代码部分

我们使用的为l2C 0.96寸的OLED,编码格式为GB2312.

l2C可以参考我们的(I2C的代码不做解释):

https://mp.csdn.net/mp_blog/creation/editor/138002186icon-default.png?t=N7T8https://mp.csdn.net/mp_blog/creation/editor/138002186

  OLED写命令


  * 函    数:OLED写命令
  * 参    数:Command 要写入的命令值,范围:0x00~0xFF
  返 回 值:无

void OLED_WriteCommand(uint8_t Command)
{
	OLED_I2C_Start();				I2C起始
	OLED_I2C_SendByte(0x78);		发送OLED的I2C从机地址
	OLED_I2C_SendByte(0x00);	    控制字节,给0x00,表示即将写命令
	OLED_I2C_SendByte(Command);		写入指定的命令
	OLED_I2C_Stop();				I2C终止
}

            D/C=1--->写数据;    D/C=0---->写命令。

从机地址:SA0默认为低电平,我们对于OLED是写入(0--->主机给从机发送数据);

0 1 1 1 1 0 0 0=0x78;   如果有多个从机地址重复可以拉高SA改变从机地址。

        按照I2C的通信时序,首先开始i2C的通信,选择OLED的从机地址,接收应答。选择模式有2个(c0为决定,1--->连续模式,0--非连续模式):

(模式1:发送一个命令,应答;在发送一个数据应答,循环往复-----连续模式

模式2:发送一个命令,应答,后面的全部是发送数据,应答。在次模式下,只需要发送一个命令,既可------非连续模式。)

我们选择模式2:0 0 0 0 0 0 0 0=0x00,然后再接收一个从机的应答。这个时候已经进入我们的写命令了,下一个直接发送我们需要写入的命令,再接收一个从机的应答。然后就停止了。

关于代码中没有接收写接收从机应答?

void OLED_I2C_SendByte
{
    .......
    OLED_W_SCL(1);		//额外的一个时钟,不处理应答信号
	OLED_W_SCL(0);
}

再处理完之后,我们加了一个信号,不处理应答。也就不用接收从机的应答了,下面不在解释关于接收从机的问题。

OLED写数据


  * 函    数:OLED写数据
  * 参    数:Data 要写入数据的起始地址
  * 参    数:Count 要写入数据的数量
  * 返 回 值:无
 
void OLED_WriteData(uint8_t *Data, uint8_t Count)
{
	uint8_t i;
	
	OLED_I2C_Start();				I2C起始
	OLED_I2C_SendByte(0x78);		发送OLED的I2C从机地址
	OLED_I2C_SendByte(0x40);	    控制字节,给0x40,表示即将写数据
	循环Count次,进行连续的数据写入
	for (i = 0; i < Count; i ++)

		OLED_I2C_SendByte(Data[i]);	依次发送Data的每一个数据
	}
	OLED_I2C_Stop();				I2C终止
}

前面的和上面一样。0100 0000=0x40表示我们进入的写数据模式。因为进入的是写非连续模式,下面可以一直写数据。

函数初始化

        完全是根据初始化过程(内部提供VCC)下面的表来使用的。

显示光标位置

  * 函    数:OLED设置显示光标位置
  * 参    数:Page 指定光标所在的页,范围:0~7
  * 参    数:X 指定光标所在的X轴坐标,范围:0~127
  * 返 回 值:无
  * 说    明:OLED默认的Y轴,只能8个Bit为一组写入,即1页等于8个Y轴坐标
  
void OLED_SetCursor(uint8_t Page, uint8_t X)
{
	/*如果使用此程序驱动1.3寸的OLED显示屏,则需要解除此注释*/
	/*因为1.3寸的OLED驱动芯片(SH1106)有132列*/
	/*屏幕的起始列接在了第2列,而不是第0列*/
	/*所以需要将X加2,才能正常显示*/
//	X += 2;
	
	/*通过指令设置页地址和列地址*/
	OLED_WriteCommand(0xB0 | Page);				    置页位置
	OLED_WriteCommand(0x10 | ((X & 0xF0) >> 4));	设置X位置高4位
	OLED_WriteCommand(0x00 | (X & 0x0F));			设置X位置低4位
}

y:页的前5个位命令,后3个位为页的地址。(一共8页,一页8个位) 

X: 命令前4位=0000  后面4位表示x的低4位数据。

X:命令前4位=0001 后面4位为x的高8位。因为x的高8位在命令中表示的是,低4为所以,需要左移4个字节。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《自然语言处理》—— 词向量之CountVectorizer方法实现

文章目录 一、什么是词向量&#xff0c;为什么要进行词向量二、CountVectorizer方法简单介绍1、基本作用2、参数详解 三、示例&#xff1a;代码实现 一、什么是词向量&#xff0c;为什么要进行词向量 词向量是一种将单词或短语映射到实数向量空间的技术。在自然语言处理中&…

Loki Unable to fetch labels from Loki (no org id)

应该是多租户相关导致的 参考文档: 参考文档cMulti-tenancy | Grafana Loki documentationDescribes how Loki implements multi-tenancy to isolate tenant data and queries.https://grafana.com/docs/loki/latest/operations/multi-tenancy/ https://github.com/grafana…

中国招标投标平台JS逆向:DES加密与Python纯算还原

中国招标投标平台JS逆向&#xff1a;DES加密与Python纯算还原 目录 &#x1f510; JS DES解密&#x1f9ee; Python版本的纯算实现 &#x1f510; JS DES解密 在中国招标投标公共服务平台的分析过程中&#xff0c;发现了数据加密采用了DES算法。DES&#xff08;数据加密标准&…

JS运行机制及事件循环机制

进程&#xff1a;独立运行&#xff0c;拥有资源空间的应用程序 线程&#xff1a;CPU调度的最小单位 浏览器: 多进程 浏览器有哪些进程&#xff1f; Browser进程&#xff0c;也是主进程 负责各个页面的管理 创建 销毁前进后退等网络资源下载 插件进程&#xff1a;比如Chrome的…

多线程+连接池+代理 运行一段时间线程阻塞,如何解决??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

【CSP:202012-2】期末预测之最佳阈值(Java)

题目链接 202012-2 期末预测之最佳阈值 题目描述 求解思路 前缀和 根据题意我们可以得知&#xff1a; θ θ θ 值为 a[i].y 时的预测正确的次数等于 a[i].y 前面有多少个 result 0 以及后面有多少个result 1。定义Score类用来存储y和result&#xff0c;其中sum0表示a[1]…

苹果macOS 15.1 Beta 3发布 允许用户将App Store应用下载到外置硬盘

8 月 29 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 15.1 开发者预览版 Beta 3 更新&#xff08;内部版本号&#xff1a;24B5035e&#xff09;&#xff0c;本次更新距离上次发布 Beta / RC 间隔 16 天。 苹果公司在发布 iOS / iPadOS 18.1 Beta 3 更新之外&#x…

redis的共享session应用

项目背景&#xff1a; 该项目背景就是黑马的黑马点评项目。 一&#xff1a;基于Session实现验证码登录流程 基本的登录流程我们做了很多了。这个是短信登录流程 其实和普通的登录流程就多了一个生成验证码&#xff0c;并将验证码保存在session中&#xff0c;并且呢&#xf…

20240831 每日AI必读资讯

Runway 突然删除清空了 HuggingFace 上的所有内容&#xff01;原因不明... - 之前的项目也无法访问了&#xff0c;比如 Stable Diffusion v1.5也被删了 &#x1f517;https://huggingface.co/runwayml/stable-diffusion-v1-5 &#x1f517;GitHub 也空了&#xff1a;https:…

ue Rotate to face BB entry转向不对

可能原因&#xff1a; 角色模型没有到正向。 错误&#xff1a; 正确&#xff1a;

C语言:ASCII码表和字符操作

目录 目录 1. 引言 2. ASCII码表 2.1 控制字符 2.2 可显示字符 3. 例子 3.1 相关函数 3.2 打印能够显示的 ASCII码 3.3 字母大小写转换 3.4 数字转数字字符 1. 引言 因为计算机只是认识 0 和 1组成的一串串的二进制数字&#xff0c;为了将人类认识的文…

【时间盒子】-【1.序言】高效人士都在用的时间管理方法。我是如何通过鸿蒙元服务APP实现?

一、介绍 【时间盒子】系列内容将帮助开发者学习如何构建一个全新的HarmonyOS元服务应用&#xff0c;学习使用DevEco Studio创建新项目、使用预览器预览页面、使用真机调试APP、自定义弹窗、使用系统提醒能力&#xff08;闹钟&#xff09;、使用首选项数据持久化、熟悉ArkUI页…

Centos 下载和 VM 虚拟机安装

1. Centos 下载 阿里云下载地址 centos-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云 2. VM 中创建 Centos 虚拟机 2.1 先打开 VM 虚拟机&#xff0c;点击首页的创建新的虚拟机 2.2 选择自定义&#xff0c;然后点击下一步。 2.3 这里默认就好&#xff0c;继续选择下一…

PE文件结构详解(非常详细)

最近在参考OpenShell为任务栏设置图片背景时&#xff0c;发现里面使用了IAT Hook&#xff0c;这一块没有接触过&#xff0c;去查资料的时候发现IAT Hook需要对PE文件结构有一定的了解&#xff0c;索性将PE文件结构的资料找出来&#xff0c;系统学习一下。 PE文件结构 Portable…

C++基础(1)——入门知识

目录 1.C版本更新 2.C参考⽂档&#xff1a; 3.C书籍推荐 4.C的第⼀个程序 5.命名空间 5.1namespace的价值 5.2namespace的定义 5.3 命名空间使⽤ 6.C输⼊&输出 7.缺省参数 8.函数重载 9.引⽤ 9.1引⽤的概念和定义 9.2引⽤的特性 9.3引⽤的使用 9.4const引⽤…

YOLOv5独家改进:一种高效移动应用的卷积加性自注意Vision Transformer

💡💡💡本文独家改进:高效移动应用的卷积加性自注意Vision Transformer,构建了一个新颖且高效实现方式——卷积加性相似度函数,并提出了一种名为卷积加性标记混合器(CATM) 的简化方法来降低计算开销 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/cat…

opencv/c++的一些简单的操作(入门)

目录 读取图片 读取视频 读取摄像头 图像处理 腐蚀 膨胀 调整图像大小 裁剪和缩放 绘制 绘制矩形 绘制圆形 绘制线条 透视变换 颜色检测 轮廓查找 人脸检测 检测人脸 检测嘴巴 可适当调整参数 读取图片 读取路径widows使用vis sto一定是\斜杠 #include <o…

LoRA 和 DoRA 代码笔记

Improving LoRA: Implementing Weight-Decomposed Low-Rank Adaptation (DoRA) from Scratch LoRA LoRA初始化时&#xff0c;A使用正态分布&#xff0c;B使用0. class LoRALayer(nn.Module):def __init__(self, in_dim, out_dim, rank, alpha):super().__init__()std_dev 1…

第L1周:机器学习-数据预处理

第L1周&#xff1a;机器学习-数据预处理 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 学习要点&#xff1a; **** 学习如何处理缺损数据尝试进行Label编码使用train_test_split进行数据划分学习特征标准化…

EXO项目StandardNode;max_generate_tokens;buffered_token_output;is_finished;

目录 StandardNode max_generate_tokens buffered_token_output 构造函数参数 类属性 总结 is_finished max_generate_tokens self.buffered_token_output StandardNode _process_tensor result是一个np.ndarray ,result.size == 1是什么意思 StandardNode max_g…