关于学习炸鸡佬智能手表 应用硬件IIC1来取代原来软件模拟的IIC

news2024/11/16 3:45:23

一、用完软件模拟IIC,虽然实现了一个通用接口,只要是IO口都可以用,但是既然引脚用到了PB6和PB7,这俩都是自带硬件外设IIC的,不用白不用。这里我也给出硬件IIC的实现,不得不说HAL库封装的真好

1.硬件IIC

这里我加入一个编译宏,在main.h中,实现可以切换软硬件IIC

硬件IIC速度不要太快,我开始跳到400000的时候触摸是无效的。

其他的配置都在CubeMx生成的iic文件中。这里利用句柄的形式也可以切换不同的iic。

因为我只使用了IIC1 这里也可以再添加一个参数指明使用的是IIC几。

#include "iic_hal_hard.h"
#include "main.h"
#if IICSOFT  == 0


/* I2C1 init function */
void MX_I2C1_Init(I2C_HandleTypeDef *hi2cx)
{

  hi2cx->Instance = I2C1;
  hi2cx->Init.ClockSpeed = 100000;
  hi2cx->Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2cx->Init.OwnAddress1 = 0;
  hi2cx->Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2cx->Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2cx->Init.OwnAddress2 = 0;
  hi2cx->Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2cx->Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(hi2cx) != HAL_OK)
  {
    Error_Handler();
  }

}
void IICInit(I2C_HandleTypeDef *hi2cx)
{
		MX_I2C1_Init(hi2cx);
}

uint8_t IIC_Write_One_Byte(I2C_HandleTypeDef *hi2cx, uint8_t daddr,uint8_t reg,uint8_t data)
{
	HAL_StatusTypeDef status;
	status = HAL_I2C_Mem_Write(hi2cx, daddr << 1, reg, I2C_MEMADD_SIZE_8BIT, &data, 1, 1000);
	if (status == HAL_OK)
	{
			return SUCCESS;
	}else
	{
		  return ERROR;
	}
}
uint8_t IIC_Write_Multi_Byte(I2C_HandleTypeDef *hi2cx, uint8_t daddr,uint8_t reg,uint8_t length,uint8_t buff[])
{
	HAL_StatusTypeDef status;

	status = HAL_I2C_Mem_Write(hi2cx, daddr << 1, reg, I2C_MEMADD_SIZE_8BIT, buff, length, 1000);
	if (status == HAL_OK)
	{
			return SUCCESS;// 数据写入寄存器成功
	}
	else
	{
			 return ERROR;// 数据写入失败,可能是从机无应答、通信错误等原因
	}
}
uint8_t IIC_Read_One_Byte(I2C_HandleTypeDef *hi2cx, uint8_t daddr,uint8_t reg)
{
	HAL_StatusTypeDef status;
	uint8_t RxBuff;
	status = HAL_I2C_Mem_Read(hi2cx, daddr << 1, reg, I2C_MEMADD_SIZE_8BIT, &RxBuff, 1, 1000);
	if (status == HAL_OK)
	{
			return RxBuff;
	}else
	{
		return ERROR;
	}
	
}
uint8_t IIC_Read_Multi_Byte(I2C_HandleTypeDef *hi2cx, uint8_t daddr, uint8_t reg, uint8_t length, uint8_t buff[])
{
	HAL_StatusTypeDef status;
	
	status = HAL_I2C_Mem_Read(hi2cx, daddr << 1, reg, I2C_MEMADD_SIZE_8BIT, buff, length, 1000);
	if (status == HAL_OK)
	{
			return SUCCESS;
	}else
	{
		return ERROR;
	}
}

#endif

HAL库封装的,我觉得没有这个中间IIC接口层也可以实现触摸IC的驱动编写。

2 硬件IIC头文件

#ifndef __IIC_HAL_HARD_H
#define __IIC_HAL_HARD_H

#include "stm32f4xx_hal.h"
#include "main.h"

//PB6 PB7 IIC1外设
#if IICSOFT == 0 

extern I2C_HandleTypeDef hi2c1;

void IICInit(I2C_HandleTypeDef *hi2cx);

uint8_t IIC_Write_One_Byte(I2C_HandleTypeDef *hi2cx, uint8_t daddr,uint8_t reg,uint8_t data);
uint8_t IIC_Write_Multi_Byte(I2C_HandleTypeDef *hi2cx, uint8_t daddr,uint8_t reg,uint8_t length,uint8_t buff[]);
uint8_t IIC_Read_One_Byte(I2C_HandleTypeDef *hi2cx, uint8_t daddr,uint8_t reg);
uint8_t IIC_Read_Multi_Byte(I2C_HandleTypeDef *hi2cx, uint8_t daddr, uint8_t reg, uint8_t length, uint8_t buff[]);
#endif

#endif

3 修改后的软件IIC

#include "iic_hal.h"
#include "delay.h"
#if IICSOFT == 1

//SCL 低电平期间 SDA可以任意改变电位 高电平不允许改动 因为要采样
// SDA输入模式
void SDA_Input_Mode(iic_bus_t* bus)
{
	 GPIO_InitTypeDef GPIO_InitStructure = {0};
	 
	 GPIO_InitStructure.Pin = bus->IIC_SDA_PIN;
	 GPIO_InitStructure.Pull = GPIO_MODE_INPUT;
	 GPIO_InitStructure.Pull = GPIO_PULLUP;
	 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
	 HAL_GPIO_Init(bus->IIC_SDA_PORT,&GPIO_InitStructure);
}
// SDA输出模式
void SDA_Output_Mode(iic_bus_t* bus)
{
	 GPIO_InitTypeDef GPIO_InitStructure = {0};
	 
	 GPIO_InitStructure.Pin = bus->IIC_SDA_PIN;
	 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;//下次不要这样搞,还是用MX来配置后复制,不然容易错
	 GPIO_InitStructure.Pull = GPIO_NOPULL;
	 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
	 HAL_GPIO_Init(bus->IIC_SDA_PORT,&GPIO_InitStructure);
}

//SDA输出一个位
void SDA_Output(iic_bus_t *bus, uint8_t val)
{
	if(val)
	HAL_GPIO_WritePin(bus->IIC_SDA_PORT,bus->IIC_SDA_PIN,GPIO_PIN_SET);
	else
	HAL_GPIO_WritePin(bus->IIC_SDA_PORT,bus->IIC_SDA_PIN,GPIO_PIN_RESET);
	
}

//SCL输出一个位
void SCL_Output(iic_bus_t *bus, uint8_t val)
{
	if(val)
	HAL_GPIO_WritePin(bus->IIC_SCL_PORT,bus->IIC_SCL_PIN,GPIO_PIN_SET);
	else
	HAL_GPIO_WritePin(bus->IIC_SCL_PORT,bus->IIC_SCL_PIN,GPIO_PIN_RESET);
}

//SDA输入一位 读一位
uint8_t SDA_Input(iic_bus_t *bus)
{
	//我觉得这里可以直接返回读到得值 不用判断了
	return (uint8_t)HAL_GPIO_ReadPin(bus->IIC_SDA_PORT,bus->IIC_SDA_PIN) ;

}

//从这个严格定义的角度来说,最后将 SCL 拉低这一步不属于起始信号本身的部分
//将 SCL 拉低是为了按照 I2C 通信的正确时序,
//把总线状态调整到适合后续数据传输的起始位置
void IICStart(iic_bus_t *bus)
{
	//当 SCL 为高电平时,SDA 从高电平向低电平跳变
	SDA_Output(bus,1);
	delay_us(2);
	SCL_Output(bus,1);
	delay_us(1);
	SDA_Output(bus,0);
	delay_us(1);
	SCL_Output(bus,0);
	delay_us(1); //
	
}
//严格来说,I2C 协议中定义的停止信号是当 SCL 为高电平时,
//SDA 从低电平向高电平跳变
//为了确保正确的时序过渡:在 I2C 通信中,
//数据的传输和各种信号的产生都是按照严格的时序进行的
void IICStop(iic_bus_t *bus)
{
	//当 SCL 为高电平时,SDA 从低电平向高电平跳变
	SCL_Output(bus,0);
	delay_us(2);
	SDA_Output(bus,0);
	delay_us(1);
	SCL_Output(bus,1);
	delay_us(1); //释放总线
	SDA_Output(bus,1);
	delay_us(1);
	
}
uint8_t IICWaitAck(iic_bus_t *bus)
{	
	uint8_t cErrTime = 5;
	SDA_Input_Mode(bus);//将数据线变成输入模式 接受从机的应答
	SCL_Output(bus,1);// 拉高时钟线
	while(SDA_Input(bus))//读到的数一直是1的话就是没有应答
	{
		cErrTime--;//读5次都没有结果就是没有应答 表示接受结束
		delay_us(1);
		if(0 == cErrTime)
		{
			SDA_Output_Mode(bus);
			IICStop(bus);
			return ERROR;
		}
	}
	//如果给了应答 就是读到了0
	SDA_Output_Mode(bus);//转换成输出模式
	SCL_Output(bus,0);//拉低时钟线 为下一个时序做准备
	delay_us(2);
	return SUCCESS;
}
void IICSendAck(iic_bus_t *bus)
{
	  SDA_Output(bus,0);//我记得是低电平放上数据
		delay_us(1);
    SCL_Output(bus,1);
		delay_us(1);
    SCL_Output(bus,0);
		delay_us(2);
}
void IICSendNotAck(iic_bus_t *bus)
{
	//我记得是低电平放上数据等时钟线高电平稳定采样 且此时不允许修改数据

		SDA_Output(bus,1);
		delay_us(1);
    SCL_Output(bus,1);
		delay_us(1);
    SCL_Output(bus,0);
		delay_us(2);
}


void IICSendByte(iic_bus_t *bus, uint8_t cSendByte)
{
	  uint8_t i;
		for(i=0;i<8;i++)
		{
			SCL_Output(bus,0);
			delay_us(2);
			SDA_Output(bus,((cSendByte >> (7 - i)) & 0x01));
			delay_us(1);
			SCL_Output(bus,1);
			delay_us(1);
		}
		SCL_Output(bus,0);
		delay_us(2);
}


uint8_t IICReceiveByte(iic_bus_t *bus)
{
	uint8_t i, cR_Byte=0;
	uint8_t bit=0;
	SDA_Input_Mode(bus);//接受字节 改成输入模式
	for(i=0;i<8;i++)
	{
		SCL_Output(bus,0); //拉低时钟线 等待从机放数据
		delay_us(2);
		SCL_Output(bus,1);//拉高时钟线 可以采样了
		delay_us(1);
		bit = SDA_Input(bus);
		cR_Byte |= bit << (7-i);

	}
	SCL_Output(bus,0);//拉低时钟线
	SDA_Output_Mode(bus);//改变为输出模式 只有读数据才是输入模式
	return cR_Byte;
}
void IICInit(iic_bus_t *bus)
{
		 GPIO_InitTypeDef GPIO_InitStructure = {0};

		//bus->CLK_ENABLE();
		
    GPIO_InitStructure.Pin = bus->IIC_SDA_PIN ;
		//上面给的是开漏 这里变成推挽搞不懂 ,推挽就不用变输入模式了
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStructure.Pull = GPIO_NOPULL;
    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(bus->IIC_SDA_PORT, &GPIO_InitStructure);
		
		GPIO_InitStructure.Pin = bus->IIC_SCL_PIN ;
    HAL_GPIO_Init(bus->IIC_SCL_PORT, &GPIO_InitStructure);
}
//返回1表示失败
uint8_t IIC_Write_One_Byte(iic_bus_t *bus, uint8_t daddr,uint8_t reg,uint8_t data)
{
		IICStart(bus);//开始信号
		IICSendByte(bus,(daddr << 1));//写从机地址
		if(IICWaitAck(bus)) //无应答停止传输
		{
			IICStop(bus);
			//printf("%d\r\n",IICWaitAck(bus)); 第一次初始化器件的时候会非应答
			return 1;
		}
		IICSendByte(bus,reg);
		IICWaitAck(bus);
		IICSendByte(bus,data);
		IICWaitAck(bus);
		IICStop(bus);
		delay_us(1);
		return 0;
	  
}

uint8_t IIC_Write_Multi_Byte(iic_bus_t *bus, uint8_t daddr,uint8_t reg,uint8_t length,uint8_t buff[])
{
		uint8_t i;
		uint8_t* dataPtr = buff;
		IICStart(bus);//开始信号
		IICSendByte(bus,(daddr << 1));//写从机地址
		if(IICWaitAck(bus)) //无应答停止传输
		{
			IICStop(bus);
			return 1;
		}
		IICSendByte(bus,reg);
		IICWaitAck(bus);
		for(i=0;i<length;i++)
		{
			//IICSendByte(bus,buff[i]);     	
			IICSendByte(bus,*dataPtr++);//利用指针指向缓存区 先解引用给首个元素赋值 再指向下一个字节
			IICWaitAck(bus);
		}
		IICStop(bus);
		delay_us(1);
		return 0;
}
uint8_t IIC_Read_One_Byte(iic_bus_t *bus, uint8_t daddr,uint8_t reg)
{
		uint8_t cR_Byte=0;
	  IICStart(bus);//开始信号
		IICSendByte(bus,(daddr << 1));//写从机地址
		IICWaitAck(bus);
		IICSendByte(bus,reg);
		IICWaitAck(bus);
	
		IICStart(bus);//开始信号
		IICSendByte(bus,(daddr << 1)| 1);//读操作
		IICWaitAck(bus);
		cR_Byte = IICReceiveByte(bus);
		IICSendNotAck(bus);
		IICStop(bus);
		return cR_Byte;
}
uint8_t IIC_Read_Multi_Byte(iic_bus_t *bus, uint8_t daddr, uint8_t reg, uint8_t length, uint8_t buff[])
{
		uint8_t i;
		uint8_t* dataPtr = buff;
		IICStart(bus);//开始信号
		IICSendByte(bus,(daddr << 1)&0xFE );//写从机地址
		IICWaitAck(bus);
		IICSendByte(bus,reg);
		IICWaitAck(bus);
	
	
		IICStart(bus);//开始信号
		IICSendByte(bus,(daddr << 1)| 1);//读操作
		IICWaitAck(bus);
		for(i=0;i<length;i++)
		{
			//buff[i] = IICReceiveByte(bus);
			*dataPtr++ = IICReceiveByte(bus);//右++ 先操作后自加
			if(i<length-1)
				IICSendAck(bus);
			else
				IICSendNotAck(bus);
		}
		
		IICStop(bus);
		return 0;
}
#endif

4 修改后的软件IIC头文件 (就是加了个宏编译)

#ifndef __IIC_HAL_H
#define __IIC_HAL_H

#include "stm32f4xx_hal.h"
#include "main.h"

#if IICSOFT == 1

typedef struct
{
	GPIO_TypeDef* IIC_SDA_PORT;
	GPIO_TypeDef* IIC_SCL_PORT;
	uint32_t IIC_SDA_PIN;
	uint32_t IIC_SCL_PIN;
	// void (*CLK_ENABLE)(void);
}iic_bus_t;//IIC控制器


void IICStart(iic_bus_t *bus);
void IICStop(iic_bus_t *bus);
uint8_t IICWaitAck(iic_bus_t *bus);
void IICSendAck(iic_bus_t *bus);
void IICSendNotAck(iic_bus_t *bus);
void IICSendByte(iic_bus_t *bus, uint8_t cSendByte);
uint8_t IICReceiveByte(iic_bus_t *bus);
void IICInit(iic_bus_t *bus);

uint8_t IIC_Write_One_Byte(iic_bus_t *bus, uint8_t daddr,uint8_t reg,uint8_t data);
uint8_t IIC_Write_Multi_Byte(iic_bus_t *bus, uint8_t daddr,uint8_t reg,uint8_t length,uint8_t buff[]);
uint8_t IIC_Read_One_Byte(iic_bus_t *bus, uint8_t daddr,uint8_t reg);
uint8_t IIC_Read_Multi_Byte(iic_bus_t *bus, uint8_t daddr, uint8_t reg, uint8_t length, uint8_t buff[]);
#endif

#endif

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

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

相关文章

力扣-Mysql-3328-查找每个州的城市 II(中等)

一、题目来源 3328. 查找每个州的城市 II - 力扣&#xff08;LeetCode&#xff09; 二、数据表结构 表&#xff1a;cities ---------------------- | Column Name | Type | ---------------------- | state | varchar | | city | varchar | ----------------…

curl命令提交大json

有个客户需要提交一个4M左右的pdf&#xff0c;接口里传的是pdf字节流base64编码后的字符串。 直接curl -XPOST -d json串 api接口会报 参数过长报错Argument list too long 网上搜了下解决方案把json串放到文本里然后通过json.txt引入参数 这一试不要紧&#xff0c;差点儿导致…

gitlab和jenkins连接

一&#xff1a;jenkins 配置 安装gitlab插件 生成密钥 id_rsa 要上传到jenkins&#xff0c;id_rsa.pub要上传到gitlab cat /root/.ssh/id_rsa 复制查看的内容 可以看到已经成功创建出来了对于gitlab的认证凭据 二&#xff1a;配置gitlab cat /root/.ssh/id_rsa.pub 复制查…

<项目代码>YOLOv8 玉米地杂草识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

Ubuntu+ROS 机械臂拾取和放置

官方链接&#xff1a;https://github.com/skumra/baxter-pnp 1.下载并安装 SDK 依赖项 sudo apt-get install python-wstool python-rosdep 2.创建新的 catkin 工作区 mkdir -p ~/ros_ws/src cd ~/ros_ws/src 3.使用 wstool 下载 rosinstall 文件并将其复制到 Catkin 工作区…

【Linux学习】【Ubuntu入门】1-4 ubuntu终端操作与shell命令1

1.使用快捷键CtrlAltT打开命令终端&#xff0c;或者单击右键点击… 2.常用shell命令 目录信息查看命令&#xff1a;ls ls -a&#xff1a;显示目录所有文件及文件夹&#xff0c;包括隐藏文件&#xff0c;比如以.开头的 ls -l&#xff1a;显示文件的详细信息 ls -al&#xff1…

【含开题报告+文档+PPT+源码】基于springboot的毕业设计选题管理系统

开题报告 毕业设计选题作为高校教学环节中的重要一环&#xff0c;其选题质量和管理效率直接关系到学生毕业设计的质量和毕业要求的达成。然而&#xff0c;传统的选题管理方式往往存在信息不对称、流程繁琐、效率低下等问题&#xff0c;无法满足高校教学管理现代化、信息化的需…

第四十二章 Vue中使用mutations修改Vuex仓库数据

目录 一、mutations修改仓库数据 1.1. 概述 1.2. mutations修改数据基本步骤 1.3. 完整代码 1.3.1. main.js 1.3.2. App.vue 1.3.3. index.js 1.3.4. Son1.vue 1.3.5. Son2.vue 二、mutations传参语法 2.1. mutations传参基本步骤 2.2. 完整代码 2.2.1. index.js …

【MYSQL】锁详解(全局锁、表级锁、行级锁)【快速理解】

目录 一、全局锁 二、表级锁 1.表锁 2.元数据锁 3.意向锁 三、行级锁 1. 行锁 2.间隙锁 3.临建锁 锁是处理并发情况下&#xff0c;对数据的一致性的关键因素&#xff0c;也是并发情况下对效率影响非常大的。 1、全局锁&#xff1a;锁定表中所有数据。 2、表级锁&#xff1a;…

客户案例|智能进化:通过大模型重塑企业智能客服体验

01 概 述 随着人工智能技术的快速发展&#xff0c;客户对服务体验的期待和需求不断升级。在此背景下&#xff0c;大模型技术的崛起&#xff0c;为智能客服领域带来了创造性的变革。 在上篇文章《在后LLM时代&#xff0c;关于新一代智能体的思考》中有提到&#xff0c;智能客服…

【Leetcode 中等】34. 在排序数组中查找元素的第一个和最后一个位置

原题链接 Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置 题目 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必…

直接缓存映射Direct Mapped Cache

这张图展示了**直接映射缓存&#xff08;Direct Mapped Cache&#xff09;**的结构和工作原理&#xff0c;并解释了如何将主存中的块映射到缓存中的特定行&#xff08;组&#xff09;。以下是引用第 0 块和第 8 块时的细节分析&#xff1a; 直接映射缓存的特点 映射规则&…

基于Java Springboot图书馆管理系统

一、作品包含 源码数据库文档全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据库&#xff1a;MySQL8.0 数据…

Python中的HTML

文章目录 一. HTML1. html的定义2. html的作用3. 基本结构4. 常用的html标签5. 列表标签① 无序列表② 有序列表 6. 表格标签7. 表单标签8. 表单提交① 表单属性设置② 表单元素属性设置 一. HTML 1. html的定义 HTML 的全称为&#xff1a;HyperText Mark-up Language, 指的是…

大数据新视界 -- 大数据大厂之 Impala 存储格式转换:从原理到实践,开启大数据性能优化星际之旅(下)(20/30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【优选算法 — 滑动窗口】水果成篮 找到字符串中所有字母异位词

水果成篮 水果成篮 题目描述 因为只有两个篮子&#xff0c;每个篮子装的水果种类相同&#xff0c;如果从 0 开始摘&#xff0c;则只能摘 0 和 1 两个种类 &#xff1b; 因为当我们在两个果篮都装有水果的情况下&#xff0c;如果再走到下一颗果树&#xff0c;果树的水果种类…

【ubuntu16.04】机器人学习笔记遇到的问题及解决办法:仿真小海龟

18版本的后面会出问题&#xff0c;避免万一我还是用了之前的16版本&#xff0c;虽然还没有解决粘贴的问题&#xff0c;但是安装ros很成功 可参考该文章博主讲的很详细&#xff0c;成功画出海龟 最后要把鼠标停在第三个终端&#xff0c;再去点击键盘&#xff0c;海龟才会动哦

游戏引擎学习第九天

视频参考:https://www.bilibili.com/video/BV1ouUPYAErK/ 修改之前的方波数据&#xff0c;改播放正弦波 下面主要讲关于浮点数 1. char&#xff08;字符类型&#xff09; 大小&#xff1a;1 字节&#xff08;8 位&#xff09;表示方式&#xff1a;char 存储的是一个字符的 A…

探索 JNI - Rust 与 Java 互调实战

真正的救赎&#xff0c;并非厮杀后的胜利&#xff0c;而是能在苦难之中&#xff0c;找到生的力量和内心的安宁。 ——加缪Albert Camus 一、Rust Java &#xff1f; Java 和 Rust 是两种现代编程语言&#xff0c;各自具有独特的优势&#xff0c;适用于不同的应用场景。 1、…

C++11新特性(二)

目录 一、C11的{} 1.初始化列表 2.initializer_list 二、可变参数模版 1.语法与原理 2.包扩展 3.empalce接口 三、新的类功能 四、lambda 1.语法 2.捕捉列表 3.原理 五、句装器 1.function 2.bind 一、C11的{} 1.初始化列表 C11以后想统⼀初始化⽅式&#xff0…