STM32实现0.96寸OLED显示模拟IIC和IIC四种实现(标准库和HAL库)

news2024/9/23 13:28:15

目录

本文通过四种方法实现OLED显示

设备选择

OLED介绍

接线表设计

OLED应用

1.标准库模拟IIC实现OLED显示

2.标准库IIC实现OLED显示

3.HAL库模拟IIC实现OLED显示

4.HAL库IIC实现OLED显示

实现效果

代码下载


本文通过四种方法实现OLED显示

设备选择

1.单片机:STM32F103

2.0.96寸OLED显示屏 

OLED介绍

OLED (Organic Light-Emitting Diode):有机发光二极管又称为有机电激光显示,OLED显示技术具有自发光的特性,采用薄的有机材料涂层和玻璃基板,当有电流通过时,这些有机材料就会发光,而且OLED显示屏幕可视角度大,功耗低。OLED由于同时具备自发光、不需背光源(只上电是不会亮的,驱动程序和接线正确才会点亮)、对比度高、厚度薄、视角广、反应速度快、可用于挠曲面板、使用温度范围广、结构及制程简单等优异之特性。最先接触的12864屏都是LCD的,需要背光,功耗较高,而OLED的功耗低,更加适合小系统;由于两者发光材料的不同,在不同的环境中,OLED的显示效果较佳。模块供电可以是3.3V也可以是5V,不需要修改模块电路,OLED屏具有多个控制指令,可以控制OLED的亮度、对比度、开关升压电路等指令。操作方便,功能丰富,可显示汉字、ASCII、图案等。
 

接线表设计

序号激光测距模块单片机STM32
1VCC3.3V/5V
2SCLPB6
3SDAPB7
4GNDGND

OLED应用

这里选用0.96寸OLED显示屏,它支持IIC通信,因此代码将以IIC展开。

整个实现过程,分为四种方式实现。

1.标准库模拟IIC实现OLED显示

/**************************************************/
/*               IIC Start                        */
/**************************************************/
void IIC_Start()
{

	OLED_GPIO(OLED_SDA,1);
	OLED_GPIO(OLED_CLK,1);
	OLED_GPIO(OLED_SDA,0);
	OLED_GPIO(OLED_CLK,0);
}

/**************************************************/
/*               IIC Stop                         */
/**************************************************/
void IIC_Stop()
{
	OLED_GPIO(OLED_CLK,1);
	OLED_GPIO(OLED_SDA,0);
	OLED_GPIO(OLED_CLK,1);
	
	OLED_GPIO(OLED_SDA,1);
	OLED_GPIO(OLED_CLK,1);
	
}

void IIC_Wait_Ack()  //检测应答
{
	OLED_GPIO(OLED_SDA,0);
	OLED_GPIO(OLED_CLK,1);
	OLED_GPIO(OLED_CLK,0);

}
/**************************************************/
/*             IIC Write byte                     */
/**************************************************/
void Write_IIC_Byte(uint8_t IIC_Byte)
{
	uint8_t i;
	uint8_t m,da;
	da=IIC_Byte;
	OLED_GPIO(OLED_CLK,0);

	for(i=0;i<8;i++)		
	{
		m=da;
		//	OLED_SCLK_Clr();
		m=m&0x80;
		if(m==0x80)
		{
			OLED_GPIO(OLED_SDA,1);
		}
		else 
			OLED_GPIO(OLED_SDA,0);
		da=da<<1;
		OLED_GPIO(OLED_CLK,1);
		OLED_GPIO(OLED_CLK,0);

	}


}
/*********************************************/
/*      	IIC Write Command		   	     */
/*********************************************/
void Write_IIC_Command(uint8_t IIC_Command) //写命令
{
	IIC_Start();
	Write_IIC_Byte(0x78);	// OLED的I2C地址(禁止修改)
	IIC_Wait_Ack();	
	Write_IIC_Byte(0x00);	// OLED 指令(禁止修改)			
	IIC_Wait_Ack();
	Write_IIC_Byte(IIC_Command); 
	IIC_Wait_Ack();	
	IIC_Stop();
}
/*********************************************/
/*       	IIC Write Data	  	   	         */
/*********************************************/
void Write_IIC_Data(uint8_t IIC_Data)   //写数据
{
	IIC_Start();
	Write_IIC_Byte(0x78);		// OLED的I2C地址(禁止修改)		
	IIC_Wait_Ack();	
	Write_IIC_Byte(0x40);		// OLED 数据(禁止修改)
	IIC_Wait_Ack();	
	Write_IIC_Byte(IIC_Data);
	IIC_Wait_Ack();	
	IIC_Stop();
}
void OLED_WR_Byte(uint8_t dat,uint8_t cmd) 
{
	if(cmd)
	{
		Write_IIC_Data(dat);
	}
	else 
	{
		Write_IIC_Command(dat);
	}
}

2.标准库IIC实现OLED显示

/**
  * @brief  I2C_Configuration,初始化硬件IIC引脚
  * @param  无
  * @retval 无
  */
void I2C_Configuration(void)
{
    I2C_InitTypeDef  I2C_InitStructure;
    GPIO_InitTypeDef  GPIO_InitStructure; 

    /*I2C1外设时钟使能 */
    OLED_I2C_CLK_INIT(OLED_I2C_CLK,ENABLE);

    /*I2C1外设GPIO时钟使能 */
    RCC_APB2PeriphClockCmd(OLED_I2C_SCL_GPIO_CLK | OLED_I2C_SDA_GPIO_CLK,ENABLE);

     /* I2C_SCL、I2C_SDA*/
  GPIO_InitStructure.GPIO_Pin = OLED_I2C_SCL_PIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;          // 开漏输出
  GPIO_Init(OLED_I2C_SCL_GPIO_PORT, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = OLED_I2C_SDA_PIN;
  GPIO_Init(OLED_I2C_SDA_GPIO_PORT, &GPIO_InitStructure);   


    /* I2C 配置 */
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;    
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;    /* 高电平数据稳定,低电平数据变化 SCL 时钟线的占空比 */
  I2C_InitStructure.I2C_OwnAddress1 =0x10;    //主机的I2C地址.和其它设备不重复即可
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;  
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; /* I2C的寻址模式 */
  I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;                             /* 通信速率 */

  I2C_Init(OLED_I2C, &I2C_InitStructure);                                         /* I2C1 初始化 */
  I2C_Cmd(OLED_I2C, ENABLE);                                                    /* 使能 I2C1 */

}

 /**
  * @brief  I2C_WriteByte,向OLED寄存器地址写一个byte的数据
  * @param  addr:寄存器地址
    *                   data:要写入的数据
  * @retval 无
  */
void I2C_WriteByte(uint8_t addr,uint8_t data)
{
	while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));

	I2C_GenerateSTART(I2C1, ENABLE);//开启I2C1
	while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/

	I2C_Send7bitAddress(I2C1, OLED_ADDRESS, I2C_Direction_Transmitter);//器件地址 -- 默认0x78
	while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

	I2C_SendData(I2C1, addr);//寄存器地址
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

	I2C_SendData(I2C1, data);//发送数据
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

	I2C_GenerateSTOP(I2C1, ENABLE);//关闭I2C1总线
}


 /**
  * @brief  WriteCmd,向OLED写入命令
  * @param  I2C_Command:命令代码
  * @retval 无
  */
void WriteCmd(unsigned char I2C_Command)//写命令
{
    I2C_WriteByte(0x00, I2C_Command);
}


 /**
  * @brief  WriteDat,向OLED写入数据
  * @param  I2C_Data:数据
  * @retval 无
  */
void WriteDat(unsigned char I2C_Data)//写数据
{
    I2C_WriteByte(0x40, I2C_Data);
}


 /**
  * @brief  OLED_Init,初始化OLED
  * @param  无
  * @retval 无
  */
void OLED_Init(void)
{
    delay_ms(1000);     // 1s,这里的延时很重要,上电后延时,没有错误的冗余设计

    WriteCmd(0xAE); //display off
    WriteCmd(0x20); //Set Memory Addressing Mode    
    WriteCmd(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
    WriteCmd(0xb0); //Set Page Start Address for Page Addressing Mode,0-7
    WriteCmd(0xc8); //Set COM Output Scan Direction
    WriteCmd(0x00); //---set low column address
    WriteCmd(0x10); //---set high column address
    WriteCmd(0x40); //--set start line address
    WriteCmd(0x81); //--set contrast control register
    WriteCmd(0xff); //亮度调节 0x00~0xff
    WriteCmd(0xa1); //--set segment re-map 0 to 127
    WriteCmd(0xa6); //--set normal display
    WriteCmd(0xa8); //--set multiplex ratio(1 to 64)
    WriteCmd(0x3F); //
    WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
    WriteCmd(0xd3); //-set display offset
    WriteCmd(0x00); //-not offset
    WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency
    WriteCmd(0xf0); //--set divide ratio
    WriteCmd(0xd9); //--set pre-charge period
    WriteCmd(0x22); //
    WriteCmd(0xda); //--set com pins hardware configuration
    WriteCmd(0x12);
    WriteCmd(0xdb); //--set vcomh
    WriteCmd(0x20); //0x20,0.77xVcc
    WriteCmd(0x8d); //--set DC-DC enable
    WriteCmd(0x14); //
    WriteCmd(0xaf); //--turn on oled panel
}

3.HAL库模拟IIC实现OLED显示

static void OLED_GPIO_Init(void)
{
	GPIO_InitTypeDef GPIO_Struct;

	/* GPIO Ports Clock Enable */
	__HAL_RCC_GPIOB_CLK_ENABLE();

	GPIO_Struct.Pin = GPIO_PIN_7| GPIO_PIN_6;
	GPIO_Struct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_Struct.Speed =	GPIO_SPEED_FREQ_LOW;
	HAL_GPIO_Init(GPIOB, &GPIO_Struct);

}

void OLED_GPIO(uint8_t add,uint8_t date)
{
	if(add==0)
	{
		if(date==1) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
		else if(date==0)HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
	}
	else if(add==1)
	{
		if(date==1) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
		else if(date==0)HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
	}
}
/**************************************************/
/*               IIC Start                        */
/**************************************************/
void IIC_Start()
{

	OLED_GPIO(OLED_SDA,1);
	OLED_GPIO(OLED_CLK,1);
	OLED_GPIO(OLED_SDA,0);
	OLED_GPIO(OLED_CLK,0);
}

/**************************************************/
/*               IIC Stop                         */
/**************************************************/
void IIC_Stop()
{
	OLED_GPIO(OLED_CLK,1);
	OLED_GPIO(OLED_SDA,0);
	OLED_GPIO(OLED_CLK,1);
	
	OLED_GPIO(OLED_SDA,1);
	OLED_GPIO(OLED_CLK,1);
	
}

void IIC_Wait_Ack()  //检测应答
{
	OLED_GPIO(OLED_SDA,0);
	OLED_GPIO(OLED_CLK,1);
	OLED_GPIO(OLED_CLK,0);

}
/**************************************************/
/*             IIC Write byte                     */
/**************************************************/
void Write_IIC_Byte(uint8_t IIC_Byte)
{
	uint8_t i;
	uint8_t m,da;
	da=IIC_Byte;
	OLED_GPIO(OLED_CLK,0);

	for(i=0;i<8;i++)		
	{
		m=da;
		//	OLED_SCLK_Clr();
		m=m&0x80;
		if(m==0x80)
		{
			OLED_GPIO(OLED_SDA,1);
		}
		else 
			OLED_GPIO(OLED_SDA,0);
		da=da<<1;
		OLED_GPIO(OLED_CLK,1);
		OLED_GPIO(OLED_CLK,0);

	}


}
/*********************************************/
/*      	IIC Write Command		   	     */
/*********************************************/
void Write_IIC_Command(uint8_t IIC_Command) //写命令
{
	IIC_Start();
	Write_IIC_Byte(0x78);	// OLED的I2C地址(禁止修改)
	IIC_Wait_Ack();	
	Write_IIC_Byte(0x00);	// OLED 指令(禁止修改)			
	IIC_Wait_Ack();
	Write_IIC_Byte(IIC_Command); 
	IIC_Wait_Ack();	
	IIC_Stop();
}
/*********************************************/
/*       	IIC Write Data	  	   	         */
/*********************************************/
void Write_IIC_Data(uint8_t IIC_Data)   //写数据
{
	IIC_Start();
	Write_IIC_Byte(0x78);		// OLED的I2C地址(禁止修改)		
	IIC_Wait_Ack();	
	Write_IIC_Byte(0x40);		// OLED 数据(禁止修改)
	IIC_Wait_Ack();	
	Write_IIC_Byte(IIC_Data);
	IIC_Wait_Ack();	
	IIC_Stop();
}
void OLED_WR_Byte(uint8_t dat,uint8_t cmd) 
{
	if(cmd)
	{
		Write_IIC_Data(dat);
	}
	else 
	{
		Write_IIC_Command(dat);
	}
}

4.HAL库IIC实现OLED显示

//写命令
void OLED_WR_CMD(uint8_t cmd)
{
	HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x00,I2C_MEMADD_SIZE_8BIT,&cmd,1,0x100);
}
//写数据
void OLED_WR_DATA(uint8_t data)
{
	HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x40,I2C_MEMADD_SIZE_8BIT,&data,1,0x100);
}



void WriteCmd()
{
  HAL_Delay(1000);     // 1s,这里的延时很重要,上电后延时,没有错误的冗余设计

	OLED_WR_CMD(0xAE); //display off
	OLED_WR_CMD(0x20); //Set Memory Addressing Mode    
	OLED_WR_CMD(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
	OLED_WR_CMD(0xb0); //Set Page Start Address for Page Addressing Mode,0-7
	OLED_WR_CMD(0xc8); //Set COM Output Scan Direction
	OLED_WR_CMD(0x00); //---set low column address
	OLED_WR_CMD(0x10); //---set high column address
	OLED_WR_CMD(0x40); //--set start line address
	OLED_WR_CMD(0x81); //--set contrast control register
	OLED_WR_CMD(0xff); //亮度调节 0x00~0xff
	OLED_WR_CMD(0xa1); //--set segment re-map 0 to 127
	OLED_WR_CMD(0xa6); //--set normal display
	OLED_WR_CMD(0xa8); //--set multiplex ratio(1 to 64)
	OLED_WR_CMD(0x3F); //
	OLED_WR_CMD(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
	OLED_WR_CMD(0xd3); //-set display offset
	OLED_WR_CMD(0x00); //-not offset
	OLED_WR_CMD(0xd5); //--set display clock divide ratio/oscillator frequency
	OLED_WR_CMD(0xf0); //--set divide ratio
	OLED_WR_CMD(0xd9); //--set pre-charge period
	OLED_WR_CMD(0x22); //
	OLED_WR_CMD(0xda); //--set com pins hardware configuration
	OLED_WR_CMD(0x12);
	OLED_WR_CMD(0xdb); //--set vcomh
	OLED_WR_CMD(0x20); //0x20,0.77xVcc
	OLED_WR_CMD(0x8d); //--set DC-DC enable
	OLED_WR_CMD(0x14); //
	OLED_WR_CMD(0xaf); //--turn on oled panel
}

实现效果

 由于频闪的原因,拍不全。

从代码上可以发现,IIC实现比模拟IIC实现起来要简单不少。

代码下载

创作不易,下面提供下载链接,涉及以上四种实现方法源码。

如有问题或需求可私信交流

源码下载地址:

STM32实现0.96寸OLED显示模拟IIC和IIC四种实现(标准库和HAL库)-C文档类资源-CSDN文库

吾芯电子工作室

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

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

相关文章

数字电路中的基础电路结构

基本单元&#xff1a; 1.1 与非门 1.2 或非门 2输入与非门需要4个晶体管&#xff08;n输入与非门需要2xn个晶体管&#xff09;&#xff0c;非门需要两个晶体管&#xff0c;2输入或非门需要6个晶体管&#xff08;n输入或非门需要 2xn 2个晶体管&#xff09;。 静态存储器 1bi…

用 Java 的 IO 流进行读写文件操作

前言 在计算机领域里 IO&#xff0c;有时也写作 I/O&#xff0c;是Input / Output的缩写&#xff0c;也就是输入和输出。这里的输入和输出是指不同系统之间的数据输入和输出&#xff0c;比如读写文件数据&#xff0c;读写网络数据等等。 本文内容大纲如下: Java 有哪些IO框…

数据结构【AVL树模拟实现】

目录 AVL树概念 AVL树结构 insert AVL树的旋转 新节点插入较高右子树的右侧---右右&#xff1a;左单旋 新节点插入较高左子树的左侧---左左&#xff1a;右单旋 新节点插入较高左子树的右侧---左右&#xff1a;先左单旋再右单旋 新节点插入较高右子树的左侧---右左&…

Bug解决:出现C++:internal compiler error: killed(program cc1plus)

最近在学习hyperscan过程中&#xff0c;安装的过程总是会出现 C&#xff1a;internal compiler error: killed(program cc1plus) 反复查找之后既不是版本问题也不是依赖问题&#xff0c;查阅了很多解决方案后&#xff0c;确认是交换空间不足&#xff0c;所以我们解决的方法是临…

Kotlin 开发Android app(七)上:Kotlin函数fun

对于函数来说&#xff0c;现在的语言越来越想把它往变量上靠。 确实对于函数来说&#xff0c;他应该有很多变量的特性。 在Kotlin 中&#xff0c;定义函数是很简单的一件事情&#xff0c;我觉得编程有的时候是被一些语言给高复杂了&#xff0c;命名很简单的一些事情&#xff0…

matlab绘图

clear a-2:0.1:2; b-3:0.1:3; [x,y]meshgrid(a,b); z(1-(x.2)/4-(y.2)/9).^(1/2); mesh(x,y,z) hold on mesh(x,y,-z) clear a-1:0.1:1; b-2:0.1:2; [x,y]meshgrid(a,b); z(4/9)*(x.2)(y.2); mesh(x,y,z)

运维监控系统 PIGOSS BSM 拓扑自动发现原理

PIGOSS BSM提供了自动发现拓扑功能&#xff0c;能够发现全网拓扑、指定网段拓扑、路由拓扑&#xff0c;能够自动关联系统已经监控的设备的状态在拓扑图上实时显示。在做全网发现的时候&#xff0c;可以指定网段或起始路由器&#xff0c;并设定全网的snmp配置参数后&#xff0c;…

vue 使用webpack打包,出现路径404 ,导致白屏webpack-bundle-analyzer使用

使用webpack打包时&#xff0c;遇到两个问题&#xff0c;导致页面出现白屏 一个是cdn对于静态文件限制大小&#xff0c;不能大于2MB&#xff0c;超过这个大小后&#xff0c;就不能上传cdn成功&#xff0c;导致页面加载时&#xff0c;长时间白屏&#xff0c;且找不到资源&#x…

INTERSPEECH 2022|FS-CANet: 基于全带子带交叉注意力机制的语音增强

INTERSPEECH 2022 FS-CANet: 基于全带子带交叉注意力机制的语音增强 本文由清华大学与腾讯天籁实验室、香港中文大学合作&#xff0c;提出了一个全带-子带交叉注意力&#xff08;FSCA&#xff09;模块来交互融合全局信息和局部信息&#xff0c;并将其应用于FullSubNet&#…

Dubbo源码(十) 与Spring一起学习Dubbo里的Aware

目录 一、Spring 1.BeanNameAware 2. BeanClassLoaderAware 3. ApplicationContextAware 4. EnvironmentAware 5. ApplicationEventPublisherAware 6. aware注入时机 二、Dubbo 1. ExtensionAccessorAware 三、小结 现在很多同行做java开发几年了&#xff0c;被迫停留…

[附源码]java毕业设计竞价拍卖系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

灵雀云ACP 斩获“2022金边奖-最佳云原生边缘云平台”

近日&#xff0c;由边缘计算社区主办的全球边缘计算大会上海站成功召开&#xff0c;灵雀云凭借出色的全栈云原生技术实力、专业的高品质服务以及在边缘云场景的丰富落地实践&#xff0c;斩获“2022金边奖-最佳云原生边缘云平台”奖项。 “十四五”规划中明确指出要“协同发展云…

使用kubeadm部署kubernetes集群

文章目录环境环境初始化配置hosts配置时钟同步禁用firewalld、selinux、postfix禁用swap分区开启IP转发、修改内核信息配置IPVS安装Docker配置yum源安装docker-ce配置镜像加速器安装kubernetes组件配置yum源安装kubeadm、kubelet、kubectl工具配置containerd部署master安装pod网…

UTF-8、Unicode编码与汉字的相关内容

介绍 UTF-8是Unicode的一种实现方式&#xff0c;比如一个汉字用Unicode编码表示是两个字节&#xff0c;而用UTF8编码表示则为3个字节。 之所以写这篇文章&#xff0c;是因为我的webserver程序中&#xff0c;浏览器发送资源请求且该资源名为中文时出现了编码问题。 UTF8编码 U…

【SQL 中级语法 2】自连接的用法

SQL的连接运算根据其特征的不同&#xff0c;有着不同的名称&#xff0c;如内连接、外连接、交叉连接等。一般来说&#xff0c;这些连接大都是以不同的表或视图为对象进行的&#xff0c;但针对相同的表或相同的视图的连接也并没有被禁止。针对相同的表进行的连接被称为“自连接”…

python之排序

目录1. 对一维array中的数值进行从大到小排序2. 将DataFrame的列逆序排列3. 根据字符串中的数字进行排序3.2 啊4. 列表参考资料1. 对一维array中的数值进行从大到小排序 import numpy as np a np.array([5,6,8,2,1,7,5,3,90,78,62,5,4,2,9,4]) # b a.sort(axis0,kindquickso…

抑制剂拮抗剂等小分子化合物

小分子化合物主要通过调节其蛋白靶点的活性发挥作用。目前小分子化合物的蛋白靶点主要包括酶、离子通道和受体三大类。根据靶点种类的不同&#xff0c;小分子化合物发挥着不同的作用。 1. 酶的抑制剂&#xff08;enzyme inhibitor&#xff09; 在所有的小分子化合物中&#xff…

【虹科案例】虹科脉冲发生器在半导体行业中的应用

非易失性存储单元特点 存储器研究的趋势是开发一种称为非易失性 RAM 的新型存储器&#xff0c;它将 RAM 的速度与大容量存储器的数据存储相结合。几年来有许多新单元类型的提议&#xff0c;例如 FeRAM&#xff08;铁电存储器&#xff09;、ReRAM&#xff08;电阻式存储器&…

C++string类的模拟实现以及经验分享

文章目录1. 为什么学习string类&#xff1f;1.1 C语言中的字符串1.2 两个面试题2. string类的实现构造函数&#xff1a;拷贝构造函数赋值运算符重载&#xff1a;析构函数流提取运算符重载1. 为什么学习string类&#xff1f; 1.1 C语言中的字符串 C语言中&#xff0c;字符串是…

5款十分小众,却又非常好用的良心软件

今天推荐5款十分小众的软件&#xff0c;知道的人不多&#xff0c;但是每个都是非常非常好用的&#xff0c;有兴趣的小伙伴可以自行搜索下载。 1.杀毒软件——火绒安全软件 首先说一下国产杀软之光&#xff0c;这是一款电脑安全软件&#xff0c;病毒库更新及时&#xff0c;界面…