STM32 F103C8T6学习笔记16:1.3寸OLED的驱动显示日历

news2024/11/18 0:39:37

今天尝试使用STM32 F103C8T6驱动显示 1.3寸的OLED,显示数字、字符串、汉字、图片等

本质与0.96寸的OLED是完全相同的原理:

而且经过我的研究发现: 1.3寸大小的OLED并未比0.96寸的有更多的显示像素点数来显示,也是128*64的像素点数显示:

也是8页(也可以称为8个水平扫描线)和128列。通过8页和128列,可以操作所有64x128个像素点。可能只是每个像素点大小变大了些吧......

//OLED的显存
//存放格式如下.
//[0]0 1 2 3 ... 127	
//[1]0 1 2 3 ... 127	
//[2]0 1 2 3 ... 127	
//[3]0 1 2 3 ... 127	
//[4]0 1 2 3 ... 127	
//[5]0 1 2 3 ... 127	
//[6]0 1 2 3 ... 127	
//[7]0 1 2 3 ... 127 			

但代码还是略有区别的,如果对驱动原理、SSD1306驱动芯片不太了解的,下面也是贴出网址链接来一起研究学习了。

本文就不将基础知识放入了,主要针对0.96寸与1.3寸的OLED驱动代码有哪些不同进行记录研究.

文章提供测试代码讲解、完整工程下载、测试效果图

目录

自己的相关文章笔记推荐:

驱动0.96寸与1.3寸OLED相同的函数:

IIC通信函数:

OLED写操作函数:

开启关闭OLED函数:

清屏函数:

 初始化SSD1306函数:

显示字符函数:

m^n函数:

 显示俩个数字函数:

 显示一个字符号串函数:

显示标准大小汉字:

显示小号汉字:

显示BMP图片:

 fill_Picture:

驱动0.96寸与1.3寸OLED不相同的函数:

坐标设置函数:

OLED打印随时会改变的变量的方法 :

(sprintf函数OLED打印方法)

测试工程下载:

测试视频:


自己的相关文章笔记推荐:

STM32 F103C8T6学习笔记8:0.96寸单色OLED显示屏显示字符_stm32f103c8t6 oled-CSDN博客

STM32 F103C8T6学习笔记9:0.96寸单色OLED显示屏—自由取模显示—显示汉字与图片_stm32f103c8t6 oled显示文字-CSDN博客

STM32 F103C8T6学习笔记11:RTC实时时钟—OLED手表日历_stm32f103c8t6显示实时时间-CSDN博客

驱动0.96寸与1.3寸OLED相同的函数:

IIC通信函数:

这部分的函数是完全一致的,毕竟都是用的IIC通信,就不会有什么不同了:

以下就简单的贴个代码,不做多余解释:

//-----------------OLED IIC端口定义----------------  					   

#define OLED_SCLK_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_8)//SCL
#define OLED_SCLK_Set() GPIO_SetBits(GPIOB,GPIO_Pin_8)

#define OLED_SDIN_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_9)//SDA
#define OLED_SDIN_Set() GPIO_SetBits(GPIOB,GPIO_Pin_9)

#define OLED_CMD  0	//写命令
#define OLED_DATA 1	//写数据
/**********************************************
//IIC Start
**********************************************/
void IIC_Start(void)
{

	OLED_SCLK_Set() ;
	OLED_SDIN_Set();
	OLED_SDIN_Clr();
	OLED_SCLK_Clr();
}

/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop(void)
{
OLED_SCLK_Set() ;
//	OLED_SCLK_Clr();
	OLED_SDIN_Clr();
	OLED_SDIN_Set();
	
}

void IIC_Wait_Ack(void)
{

	//GPIOB->CRH &= 0XFFF0FFFF;	//设置PB12为上拉输入模式
	//GPIOB->CRH |= 0x00080000;
//	OLED_SDA = 1;
//	delay_us(1);
	//OLED_SCL = 1;
	//delay_us(50000);
/*	while(1)
	{
		if(!OLED_SDA)				//判断是否接收到OLED 应答信号
		{
			//GPIOB->CRH &= 0XFFF0FFFF;	//设置PB12为通用推免输出模式
			//GPIOB->CRH |= 0x00030000;
			return;
		}
	}
*/
	OLED_SCLK_Set() ;
	OLED_SCLK_Clr();
}
/**********************************************
// IIC Write byte
**********************************************/

void Write_IIC_Byte(unsigned char IIC_Byte)
{
	unsigned char i;
	unsigned char m,da;
	da=IIC_Byte;
	OLED_SCLK_Clr();
	for(i=0;i<8;i++)		
	{
			m=da;
		//	OLED_SCLK_Clr();
		m=m&0x80;
		if(m==0x80)
		{OLED_SDIN_Set();}
		else OLED_SDIN_Clr();
			da=da<<1;
		OLED_SCLK_Set();
		OLED_SCLK_Clr();
		}


}
/**********************************************
// IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)
{
   IIC_Start();
   Write_IIC_Byte(0x78);            //Slave address,SA0=0
	IIC_Wait_Ack();	
   Write_IIC_Byte(0x00);			//write command
	IIC_Wait_Ack();	
   Write_IIC_Byte(IIC_Command); 
	IIC_Wait_Ack();	
   IIC_Stop();
}
/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{
   IIC_Start();
   Write_IIC_Byte(0x78);			//D/C#=0; R/W#=0
	IIC_Wait_Ack();	
   Write_IIC_Byte(0x40);			//write data
	IIC_Wait_Ack();	
   Write_IIC_Byte(IIC_Data);
	IIC_Wait_Ack();	
   IIC_Stop();
}

OLED写操作函数:

 这部分也是完全一致,这是对OLED进行命令操作以及写入控制屏幕最基础的函数了:

//起到了有命令写命令,有数据写数据的效果:
void OLED_WR_Byte(unsigned dat,unsigned cmd)
{
	if(cmd)
		{Write_IIC_Data(dat);}
	else 
		{Write_IIC_Command(dat);}
}

开启关闭OLED函数:

 通过写命令开启关闭OLED显示,这与驱动芯片SSD1306相关,因此命令相同,无需改动:

//开启OLED显示    
void OLED_Display_On(void)
{
	OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
	OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
	OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
}
//关闭OLED显示     
void OLED_Display_Off(void)
{
	OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
	OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
	OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
}

清屏函数:

意味着它们的硬件特性和像素组织方式在清屏操作上是相似的 :命令相同,无需改动

页面和列结构:这两个尺寸的OLED屏幕可能都采用了类似的页面和列结构来组织像素命令和数据格式:    两个OLED屏幕可能使用相同的命令和数据格式来设置像素点的状态。

但清屏函数相同并不意味着两个OLED屏幕在所有方面都是相同

//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!	  
void OLED_Clear(void)  
{  
	u8 i,n;		    
	for(i=0;i<8;i++)  
	{  
		OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
		OLED_WR_Byte (0x02,OLED_CMD);      //设置显示位置—列低地址
		OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
		for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); 
	} //更新显示
}

 初始化SSD1306函数:

//初始化SSD1306					    
void OLED_Init(void)
{ 	
 	GPIO_InitTypeDef  GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //使能A端口时钟
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;	 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
 	GPIO_Init(GPIOB, &GPIO_InitStructure);	  //初始化GPIOD3,6
 	GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9);	


delay_ms(800);
 OLED_WR_Byte(0xAE,OLED_CMD);//--display off                    关闭显示屏
	
	OLED_WR_Byte(0x00,OLED_CMD);//---set low column address        设置低列地址 
	OLED_WR_Byte(0x10,OLED_CMD);//---set high column address       设置高列地址
	
	OLED_WR_Byte(0x40,OLED_CMD);//--set start line address         设置起始行地址
	OLED_WR_Byte(0xB0,OLED_CMD);//--set page address               设置页地址
	
	OLED_WR_Byte(0x81,OLED_CMD); // contract control               设置对比度控制
	OLED_WR_Byte(0xFF,OLED_CMD);//--128                            对比度值设置为128
	
	OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap                设置段重映射
	OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse               设置正常显示/反向显示
	OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)   设置多路复用比率(1到64)
	OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty                      设置Duty值为1/32
	OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction               设置COM扫描方向
	
	OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset              设置显示偏移
	OLED_WR_Byte(0x00,OLED_CMD);//                                 设置显示起始行
	
	OLED_WR_Byte(0xD5,OLED_CMD);//set osc division                 设置振荡器分频
	OLED_WR_Byte(0x80,OLED_CMD);//                                 设置振荡器分频值为80
	
	OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off          设置区域颜色模式关闭
	OLED_WR_Byte(0x05,OLED_CMD);//                                 设置区域颜色模式值为05
	
	OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period            设置预充电周期
	OLED_WR_Byte(0xF1,OLED_CMD);//                                 设置预充电周期值为F1
	
	OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion        设置COM引脚配置
	OLED_WR_Byte(0x12,OLED_CMD);//                                 设置COM引脚配置值为12
	
	OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh                        设置Vcomh
	OLED_WR_Byte(0x30,OLED_CMD);//                                 设置Vcomh值为30
	
	OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable           设置充电泵使能
	OLED_WR_Byte(0x14,OLED_CMD);//                                 设置充电泵使能值为14
	
	OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel             打开显示屏l
}  

显示字符函数:

//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白显示;1,正常显示				 
//size:选择字体 16/12 
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
{      	
	unsigned char c=0,i=0;	
		c=chr-' ';//得到偏移后的值			
		if(x>Max_Column-1){x=0;y=y+2;}
		if(Char_Size ==16)
			{
			OLED_Set_Pos(x,y);	
			for(i=0;i<8;i++)
			OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
			OLED_Set_Pos(x,y+1);
			for(i=0;i<8;i++)
			OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
			}
			else {	
				OLED_Set_Pos(x,y);
				for(i=0;i<6;i++)
				OLED_WR_Byte(F6x8[c][i],OLED_DATA);
				
			}
}

m^n函数:

//m^n函数
u32 oled_pow(u8 m,u8 n)
{
	u32 result=1;	 
	while(n--)result*=m;    
	return result;
}				

 显示俩个数字函数:

//显示2个数字
//x,y :起点坐标	 
//len :数字的位数
//size:字体大小
//mode:模式	0,填充模式;1,叠加模式
//num:数值(0~4294967295);	 		  
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)
{         	
	u8 t,temp;
	u8 enshow=0;						   
	for(t=0;t<len;t++)
	{
		temp=(num/oled_pow(10,len-t-1))%10;
		if(enshow==0&&t<(len-1))
		{
			if(temp==0)
			{
				OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
				continue;
			}else enshow=1; 
		 	 
		}
	 	OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2); 
	}
} 

 显示一个字符号串函数:

//显示一个字符号串
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
{
	unsigned char j=0;
	while (chr[j]!='\0')
	{		OLED_ShowChar(x,y,chr[j],Char_Size);
			x+=8;
		if(x>120){x=0;y+=2;}
			j++;
	}
}

显示标准大小汉字:

这个函数需要自己在取模软件取出16*16像素点大小的汉字模(通过函数中循环次数可知)

每个汉字高度会占用二列(一共八列)


//显示汉字
void OLED_ShowCHinese(u8 x,u8 y,u8 no)
{      			    
	u8 t,adder=0;
	OLED_Set_Pos(x,y);	
    for(t=0;t<16;t++)
		{
				OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
				adder+=1;
     }	
		OLED_Set_Pos(x,y+1);	
    for(t=0;t<16;t++)
			{	
				OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
				adder+=1;
      }					
}

效果如图中的 年、星期:

显示小号汉字:

这个是我自己杜撰的一个可以显示小一号汉字的函数:

这个函数需要自己在取模软件取出12*8像素点大小的汉字模(通过函数中循环次数可知)

每个汉字高度会占用一列(一共八列)


void OLED_ShowCHinese_small(u8 x,u8 y,u8 no)
{
	u8 t,adder=0;
	OLED_Set_Pos(x,y);	
    for(t=0;t<12;t++)
		{
				OLED_WR_Byte(Hzk_m[no][t],OLED_DATA);
				adder+=1;
     }	
}

 效果如图中的 月、日:

显示BMP图片:

/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
//x0 传入图像显示起始点x坐标
//y0 传入图像显示起始点y坐标
//x1 传入图像x横向像素个数 + x0
//y1 传入图像y纵向像素个数 占用的页数 
//BMP[] 传入图像数组        
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
{ 	
 unsigned int j=0;
 unsigned char x,y;
	
  if(y1%8==0) y=y1/8;
  else y=y1/8+1;
	for(y=y0;y<y1;y++)
	{
		  OLED_Set_Pos(x0,y);
      for(x=x0;x<x1;x++)
	    {      
	    	OLED_WR_Byte(BMP[j++],OLED_DATA);	
	    }
	}
}

 fill_Picture:

/********************************************
// fill_Picture
********************************************/
void fill_picture(unsigned char fill_Data)
{
	unsigned char m,n;
	for(m=0;m<8;m++)
	{
		OLED_WR_Byte(0xb0+m,0);		//page0-page1
		OLED_WR_Byte(0x02,0);		//low column start address
		OLED_WR_Byte(0x10,0);		//high column start address
		for(n=0;n<128;n++)
			{
				OLED_WR_Byte(fill_Data,1);
			}
	}
}

驱动0.96寸与1.3寸OLED不相同的函数:

坐标设置函数:

两个OLED屏幕的坐标设置函数之所以不同,主要是因为它们的硬件特性和寻址模式不同。在编写驱动程序时,需要根据OLED屏幕的数据手册或者技术规格来确定正确的寻址方式和起始偏移。对于不同的屏幕,即使它们的尺寸不同,也可能需要使用类似的函数结构,但内部的计算或偏移值可能不同。 

 在这个函数中,x坐标的值在发送列地址之前被增加了2。这可能是因为1.3寸OLED屏幕有某种特定的寻址方式或者起始偏移,所以需要调整x坐标的起始值。

//1.3寸OLED 坐标设置

	void OLED_Set_Pos(unsigned char x, unsigned char y) 
{ 
	OLED_WR_Byte(0xb0+y,OLED_CMD);
	OLED_WR_Byte((((x+2)&0xf0)>>4)|0x10,OLED_CMD);
	OLED_WR_Byte(((x+2)&0x0f),OLED_CMD); 
}     	

 这个函数在发送列地址之前没有调整x坐标的值。这可能是因为0.96寸OLED屏幕没有那样的起始偏移或者它的寻址模式与1.3寸的不同。

//0.96寸OLED 坐标设置
void OLED_Set_Pos(unsigned char x, unsigned char y) 
{ 
	OLED_WR_Byte(0xb0+y,OLED_CMD);
	OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
	OLED_WR_Byte((x&0x0f),OLED_CMD); 
}   

OLED打印随时会改变的变量的方法 :

(sprintf函数OLED打印方法)

首先需要一个字符数组承接拼接处理的一串字符:

	   char  buf[20];   //用于暂存oled数据

使用sprintf函数将tm结构体中的年份(tm_year)转换为字符串,并保存到buf数组中。tm是一个指向struct tm的指针,这个结构体用于表示日期和时间

		//打印年
		sprintf(buf,"%d",tm->tm_year);
		OLED_ShowString(75,0,(u8 *)buf,16);
	    OLED_ShowCHinese(75+16*2,0,0);  //打印中文“年”

		//打印时间:
	    sprintf(buf,"%02d:%02d:%02d",tm->tm_hour,tm->tm_min,tm->tm_sec);		
 		OLED_ShowString(64,2,(u8 *)buf,16);		          

		//打印日期:
		sprintf(buf,"%02d",tm->tm_mon);	   
		OLED_ShowString(75,4,(u8 *)buf,12);	//打印月	
		OLED_ShowCHinese_small(75+14,4,0);  //打印中文月	    
		sprintf(buf,"%02d",tm->tm_mday);		 
		OLED_ShowString(75+14+12,4,(u8 *)buf,12);	//打印日
		OLED_ShowCHinese_small(75+14+12+14,4,1);  //打印中文日

测试工程下载:

https://download.csdn.net/download/qq_64257614/89213223?spm=1001.2014.3001.5503

测试视频:

1.3寸OLED的驱动显示

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

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

相关文章

2024-5-4

今日流水账&#xff1a; 上午&#xff1a; 之前的那道 kernel pwn 已经成功构造了 dirty pipe 原语&#xff08;&#xff1a;但是不知道为啥修改 /bin/busybox 一直报段错误&#xff0c;悲&#xff0c;后面在探索探索&#xff08;&#xff1a;这里简单尝试写下 /etc/passwd&…

【架构系列】RabbitMQ应用场景及在实际项目中如何搭建可靠的RabbitMQ架构体系

作者:后端小肥肠 创作不易&#xff0c;未经允许禁止转载。 1. 前言 RabbitMQ&#xff0c;作为一款高性能、可靠的消息队列软件&#xff0c;已经成为许多企业和开发团队的首选之一。它的灵活性和可扩展性使得它适用于各种应用场景&#xff0c;从简单的任务队列到复杂的分布式系统…

eNSP-动态路由(ospf协议)

一、拓扑结构搭建 二、主机配置 pc1 pc2 三、路由器配置 1.AR2配置 <Huawei>sys #进入系统视图 [Huawei]int g0/0/0 #进入接口 [Huawei-GigabitEthernet0/0/0]ip address 192.168.0.2 24 #设置ip地址 [Huawei-GigabitEthernet0/0/0]q #返回上一级 [Huawei]int g0/0/1 …

asp.net结课作业中遇到的问题解决2

目录 1、如何实现评论交流的界面 2、如果想要将文字添加到数据库中&#xff0c;而不是乱码&#xff0c;该怎么修改 3、如果想要添加的数据已经存在于数据库&#xff0c;就不允许添加了&#xff0c;该如何实现 4、想要实现某个模块下有好几个小的功能该如何实现 5、想要实现…

Unity 性能优化之数据面板(Statistics)(一)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、unity 统计数据面板&#xff08;Statistics&#xff09;1.Audio属性2.Graphics属性 二、什么是Draw Call&#xff1f;三、Unity3D stats也可以通过代…

大型语言模型的新挑战:AMR语义表示的神秘力量

DeepVisionary 每日深度学习前沿科技推送&顶会论文&数学建模与科技信息前沿资讯分享&#xff0c;与你一起了解前沿科技知识&#xff01; 引言&#xff1a;AMR在大型语言模型中的作用 在自然语言处理&#xff08;NLP&#xff09;的领域中&#xff0c;抽象意义表示&…

【Android学习】自定义文本框和输入监听

实现功能 以上代码可实现功能&#xff1a; 1 自定义文本框样式 2. 文本框触发形式转变 3. 文本框输入长度监听&#xff0c;达到最大长度关闭软键盘 4. password框触发检测phone框内容 1. drawable自定义形状 我创建了editor_focus.xml 和 editor_unfocus.xml&#xff0c;两者仅…

性能优化(一):ArrayList还是LinkedList?

引言 集合作为一种存储数据的容器&#xff0c;是我们日常开发中使用最频繁的对象类型之一。JDK为开发者提供了一系列的集合类型&#xff0c;这些集合类型使用不同的数据结构来实现。因此&#xff0c;不同的集合类型&#xff0c;使用场景也不同。 很多同学在面试的时候&#x…

3.2Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3框架-企业级应用- Vuex

Vuex简介 Vuex概述 Vuex是一个专门为Vue.js应用程序开发的状态管理模式, 它采用集中式存储管理所有组件的公共状态, 并以相应的规 则保证状态以一种可预测的方式发生变化. 试想这样的场景, 比如一个Vue的根实例下面有一个根组件名为App.vue, 它下面有两个子组件A.vue和B.vu…

巧记英语单词

页面 在输入框中填写英语单词的谐音 这样的话就进行了一次英语单词的记忆练习。 页面代码 <% layout(/layouts/default.html, {title: 英语单词管理, libs: [dataGrid]}){ %> <div class"main-content"><div class"box box-main">&l…

如何为 Nestjs 编写单元测试和 E2E 测试

前言 最近在给一个 nestjs 项目写单元测试&#xff08;Unit Testing&#xff09;和 e2e 测试&#xff08;End-to-End Testing&#xff0c;端到端测试&#xff0c;简称 e2e 测试&#xff09;&#xff0c;这是我第一次给后端项目写测试&#xff0c;发现和之前给前端项目写测试还…

练习题(2024/5/4)

1 二叉树的所有路径 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;["1->2->5","…

学习Rust的第26天:Rust中的cp

在本文中复刻了 cp 实用程序的功能&#xff0c;我想默认使其递归&#xff0c;因为每次我想复制时都输入 -R 文件夹都会觉得有点重复&#xff0c;本文代码将与前文代码保持相似&#xff0c;我们只会更改程序的核心功能和一些变量名称以匹配用例 Pseudo Code 伪代码 function cop…

STM32G474 CMAKE VSCODE 开发环境搭建

本篇博文尝试搭建 stm32g474 的开发环境 一. 工具安装 1. 关于 MinGW、OpenOCD、Zadig 这些工具的下载和安装见 JlinkOpenOCDSTM32 Vscode 下载和调试环境搭建_vscode openocd stm32 jlink-CSDN博客 2. 导出一个 STM32 的 CMAKE 工程&#xff0c;这里略过。 3. 安装 ninja …

C++:继承-继承权限

在C中&#xff0c;类的权限分为公有、私有和保护三种。这些权限控制了类的成员&#xff08;数据成员和成员函数&#xff09;对外部代码的可见性和访问性。 公有&#xff08;public&#xff09;权限&#xff1a; 在公有权限下声明的成员可以被类的外部代码直接访问&#xff1b;公…

小程序引入 Vant Weapp 极简教程

一切以 Vant Weapp 官方文档 为准 Vant Weapp 官方文档 - 快速入手 1. 安装nodejs 前往官网下载安装即可 nodejs官网 安装好后 在命令行&#xff08;winr&#xff0c;输入cmd&#xff09;输入 node -v若显示版本信息&#xff0c;即为安装成功 2. 在 小程序根目录 命令行/终端…

langchain+qwen1.5-7b-chat搭建本地RAG系统

已开源&#xff1a;https://github.com/stay-leave/enhance_llm 概念 检索增强生成&#xff08;Retrieval Augmented Generation, RAG&#xff09;是一种结合语言模型和信息检索的技术&#xff0c;用于生成更准确且与上下文相关的输出。 通用模型遇到的问题&#xff0c;也是…

头歌实践教学平台:三维图形观察OpenGL1.0

一.任务描述 根据提示&#xff0c;在右侧修改代码&#xff0c;并自己绘制出图形。平台会对你编写的代码进行测试。 1.本关任务 学习了解三维图形几何变换原理。 理解掌握OpenGL三维图形几何变换的方法。 理解掌握OpenGL程序的模型视图变换。 掌握OpenGL三维图形显示与观察的…

怎么用CAPL与Python交互

怎么用CAPL与其他应用程序交互 怎么用CAPL与Python交互 怎么用CAPL与Python交互 怎么用CAPL与其他应用程序交互前言1、CAPL怎么调Python&#xff1f;1.1CAPL调Python的命令1.2CAPL调用Python实例 2、怎么把python运行的结果返回给CAPL2.1通过环境变量 3、CAPL调Python的输入参…

OCC笔记:选择TopoDS_Shape顶点、边、面等等

1、通过AIS_InteractiveContext的函数访问当前选择的图形 hAISContext->InitSelected(); hAISContext->MoreSelected(); hAISContext->NextSelected()&#xff1b; hAISContext->SelectedShape()&#xff1b; 其中hAISContext->SelectedShape()通过StdSelect_…