IIC驱动OLED(SSD1306) HAL库+CubeMX

news2024/9/23 9:30:02

一.IIC传输数据的格式

1.写操作

2.读操作 

3.IIC信号 

二. IIC底层驱动

1.重新初始化配置延时单元

//软件延时
void I2C_Delay(uint32_t t)
{
    volatile uint32_t tmp = t;
    while(tmp--);
}

void I2C_GPIO_ReInit(void)
{
    /* 1. 使用结构体定义硬件GPIO对象 */
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    
    /* 2. 将SCL和SDA的GPIO寄存器的值恢复为复位上电值 */
    HAL_GPIO_DeInit(SCL_PORT, SCL_PIN);
    HAL_GPIO_DeInit(SDA_PORT, SDA_PIN);
    
    /* 3. 使能SCL和SDA的GPIO的时钟,因为他们都是GPIOF组的,所以这里只使能GPIOF的时钟 */
    __HAL_RCC_GPIOF_CLK_ENABLE();
    
    /* 4. 设置GPIO的模式为开漏输出模式,响应速度设置为快速响应 */
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;     
    GPIO_InitStruct.Pin = SCL_PIN;    
    HAL_GPIO_Init(SCL_PORT, &GPIO_InitStruct);
    
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;       
    GPIO_InitStruct.Pin = SDA_PIN;
    HAL_GPIO_Init(SDA_PORT, &GPIO_InitStruct);
}

 2.配置开始和结束信号

                                                      

void I2C_Start(void)
{
    SCL_H;
    SDA_H;
    I2C_Delay(100);
    SDA_L;
    I2C_Delay(100);
}

void I2C_Stop(void)
{
    SDA_L;
    SCL_H;
    I2C_Delay(100);
    SDA_H;
    I2C_Delay(100);
}

3.从机接收应答位成功得到响应返回0,否则返回-1

接收应答前要先将SDA拉高

int I2C_GetAck(void)
{
    int i = 0;
    SCL_L;
    SDA_H;//释放控制权
    I2C_Delay(100);
    SCL_H;
    while(SDA_IN != 0)
    {
        i++;
        if(i == 100)//防止超时
        {
            SCL_L;
            return -1;
        }
        I2C_Delay(10);
    }
    SCL_L;
    return 0;
}

4.主机发送应答和非应答 

void I2C_ACK(void)
{
    SCL_L;
    SDA_L;
    I2C_Delay(100);
    SCL_H;
    I2C_Delay(100);
}
void I2C_NACK(void)
{
    SCL_L;
    SDA_H;
    I2C_Delay(100);
    SCL_H;
    I2C_Delay(100);
}

5.发送字节 

void I2C_WriteByte(uint8_t data)
{
    uint8_t i = 0;
    for(i=0; i<8; i++)
    {
        SCL_L;
        I2C_Delay(100);
        if(data & 0x80)
        {
            SDA_H;
        }
        else
        {
            SDA_L;
        }
        data <<= 1; // 发出1bit数据后,要更新数据,将data的次高位移位到最高位
        SCL_H;
        I2C_Delay(100);
    }
    I2C_GetAck();
}

6.接收字节 

uint8_t I2C_ReadByte(uint8_t ack)
{
    uint8_t i = 0;
    uint8_t data = 0;
    
    SDA_H;
    for(i=0; i<8; i++)
    {
        SCL_L;
        I2C_Delay(100);
        SCL_H;
        I2C_Delay(100);
        data <<= 1; // 更新数据前,要将上一次数据左移1位用来保存接下来的这一位数据
        if(SDA_IN == 1)    
        {                 
            data++;
        }
        else
        {
            data = data;
        }
    }
    
    // 根据ack决定是否发出应答
    if(ack == 0)
    {
        I2C_ACK();
    }
    else if(ack == 1)
    {
        I2C_NACK();
    }
    
    return data;
}

三.IIC所有代码 

#define SCL_PIN         GPIO_PIN_6
#define SDA_PIN         GPIO_PIN_7

#define SCL_PORT        GPIOB
#define SDA_PORT        GPIOB

/*********************
 * 函数宏定义
**********************/
#define SCL_H           HAL_GPIO_WritePin(SCL_PORT, SCL_PIN, 1)
#define SCL_L           HAL_GPIO_WritePin(SCL_PORT, SCL_PIN, 0)

#define SDA_H           HAL_GPIO_WritePin(SDA_PORT, SDA_PIN, 1)
#define SDA_L           HAL_GPIO_WritePin(SDA_PORT, SDA_PIN, 0)
#define SDA_IN          HAL_GPIO_ReadPin(SDA_PORT, SDA_PIN)

/*
 *  函数名:I2C_GPIO_ReInit
 *  功能描述:将模拟I2C的SCL和SDA引脚进行重新初始化
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
extern void I2C_GPIO_ReInit(void);

/*
 *  函数名:I2C_Start
 *  功能描述:模拟发出I2C的开始信号-->在SCL的高电平下,SDA的电平由高到低变化
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
extern void I2C_Start(void);

/*
 *  函数名:I2C_Stop
 *  功能描述:模拟发出I2C的停止信号-->在SCL的高电平下,SDA的电平由低到高变化
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
extern void I2C_Stop(void);

/*
 *  函数名:I2C_GetAck
 *  功能描述:模拟I2C获取从设备的响应信号-->在SCL的高电平下,从设备将SDA拉低
 *  输入参数:无
 *  输出参数:无
 *  返回值:成功得到响应返回0,否则返回-1
*/
extern int I2C_GetAck(void);

/*
 *  函数名:I2C_ACK
 *  功能描述:模拟I2C发出一个应答信号,在第九个时钟将SDA拉低
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
extern void I2C_ACK(void);

/*
 *  函数名:I2C_NACK
 *  功能描述:模拟I2C发出一个非应答信号,在第九个时钟将SDA拉高
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
extern void I2C_NACK(void);

/*
 *  函数名:I2C_WriteByte
 *  功能描述:模拟I2C发出一个字节的数据
 *  输入参数:data-->要发送出去的数据,范围0~255
 *  输出参数:无
 *  返回值:无
*/
extern void I2C_WriteByte(uint8_t data);

/*
 *  函数名:I2C_ReadByte
 *  返回值:返回读取到的数据
 *  输入参数:ack-->根据此参数判断在读到一个字节之后是否发出应答信号
 *  输出参数:无
*/
extern uint8_t I2C_ReadByte(uint8_t ack);

#endif /* __DRIVER_I2C_H */
void I2C_Delay(uint32_t t)
{
    volatile uint32_t tmp = t;
    while(tmp--);
}

/*
 *  函数名:I2C_GPIO_ReInit
 *  功能描述:将模拟I2C的SCL和SDA引脚进行重新初始化
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
void I2C_GPIO_ReInit(void)
{
    /* 1. 使用结构体定义硬件GPIO对象 */
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    
    /* 2. 将SCL和SDA的GPIO寄存器的值恢复为复位上电值 */
    HAL_GPIO_DeInit(SCL_PORT, SCL_PIN);
    HAL_GPIO_DeInit(SDA_PORT, SDA_PIN);
    
    /* 3. 使能SCL和SDA的GPIO的时钟,因为他们都是GPIOF组的,所以这里只使能GPIOF的时钟 */
    __HAL_RCC_GPIOF_CLK_ENABLE();
    
    /* 4. 设置GPIO的模式为开漏输出模式,响应速度设置为快速响应 */
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        
    /* 5. 选择要设置的GPIO引脚 */
    GPIO_InitStruct.Pin = SCL_PIN;
    
    /* 6. 调用init函数初始化GPIO */
    HAL_GPIO_Init(SCL_PORT, &GPIO_InitStruct);
    
    GPIO_InitStruct.Pin = SDA_PIN;
    HAL_GPIO_Init(SDA_PORT, &GPIO_InitStruct);
}

/*
 *  函数名:I2C_Start
 *  功能描述:模拟发出I2C的开始信号-->在SCL的高电平下,SDA的电平由高到低变化
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
void I2C_Start(void)
{
    SCL_H;
    SDA_H;
    I2C_Delay(100);
    SDA_L;
    I2C_Delay(100);
}

/*
 *  函数名:I2C_Stop
 *  功能描述:模拟发出I2C的停止信号-->在SCL的高电平下,SDA的电平由低到高变化
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
void I2C_Stop(void)
{
    SDA_L;
    SCL_H;
    I2C_Delay(100);
    SDA_H;
    I2C_Delay(100);
}

/*
 *  函数名:I2C_GetAck
 *  功能描述:模拟I2C获取从设备的响应信号-->在SCL的高电平下,从设备将SDA拉低
 *  输入参数:无
 *  输出参数:无
 *  返回值:成功得到响应返回0,否则返回-1
*/
int I2C_GetAck(void)
{
    int i = 0;
    SCL_L;
    SDA_H;
    I2C_Delay(100);
    SCL_H;
    while(SDA_IN != 0)
    {
        i++;
        if(i == 100)
        {
            SCL_L;
            return -1;
        }
        I2C_Delay(10);
    }
    SCL_L;
    return 0;
}

/*
 *  函数名:I2C_ACK
 *  功能描述:模拟I2C发出一个应答信号,在第九个时钟将SDA拉低
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
void I2C_ACK(void)
{
    SCL_L;
    SDA_L;
    I2C_Delay(100);
    SCL_H;
    I2C_Delay(100);
}

/*
 *  函数名:I2C_NACK
 *  功能描述:模拟I2C发出一个非应答信号,在第九个时钟将SDA拉高
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
void I2C_NACK(void)
{
    SCL_L;
    SDA_H;
    I2C_Delay(100);
    SCL_H;
    I2C_Delay(100);
}

/*
 *  函数名:I2C_WriteByte
 *  功能描述:模拟I2C发出一个字节的数据
 *  输入参数:data-->要发送出去的数据,范围0~255
 *  输出参数:无
 *  返回值:无
*/
void I2C_WriteByte(uint8_t data)
{
    uint8_t i = 0;
    for(i=0; i<8; i++)
    {
        SCL_L;
        I2C_Delay(100);
        if(data & 0x80)
        {
            SDA_H;
        }
        else
        {
            SDA_L;
        }
        data <<= 1; // 发出1bit数据后,要更新数据,将data的次高位移位到最高位
        SCL_H;
        I2C_Delay(100);
    }
    I2C_GetAck();
}

/*
 *  函数名:I2C_ReadByte
 *  返回值:返回读取到的数据
 *  输入参数:ack-->根据此参数判断在读到一个字节之后是否发出应答信号
 *  输出参数:无
*/
uint8_t I2C_ReadByte(uint8_t ack)
{
    uint8_t i = 0;
    uint8_t data = 0;
    
    SDA_H;
    for(i=0; i<8; i++)
    {
        SCL_L;
        I2C_Delay(100);
        SCL_H;
        I2C_Delay(100);
        data <<= 1; // 更新数据前,要将上一次数据左移1位用来保存接下来的这一位数据
        if(SDA_IN == 1)    
        {                 
            data++;
        }
        else
        {
            data = data;
        }
    }
    
    // 根据ack决定是否发出应答
    if(ack == 0)
    {
        I2C_ACK();
    }
    else if(ack == 1)
    {
        I2C_NACK();
    }
    
    return data;
}

四.SSD1306

1.特点

2.SSD1306设备地址

R/W#=1, it is in read mode. R/W#=0, it is in write mode.
0111 1000   0x78 写数据时的设备地址
0111 1000   0x79 读数据时的设备地址
// 第一种,分别定义读写设备地址
#define OLED_WRITE_ADDR      0x78
#define OLED_READ_ADDR       0x79

// 第二种,定义基础地址,通过改变读写位来改变地址
#define OLED_ADDR       0x78
#define OLED_WRITE      0x00
#define OLED_READ       0x01

 3.SSD1306总线格式

3.1发送命令

void OLED_WriteCmd(uint8_t cmd)
{
    I2C_Start();
    I2C_WriteByte(OLED_WRITE_ADDR);//发送设备地址
           // I2C_WriteByte(OLED_ADDR | OLED_WRITE);
    I2C_WriteByte(0x00);//发送控制字节0x00
    I2C_WriteByte(cmd);//发送命令
    I2C_Stop();//停止
}

3.2发送数据

void OLED_WriteData(uint8_t data)
{
    I2C_Start();
    I2C_WriteByte(OLED_WRITE_ADDR);//发送设备地址
    // I2C_WriteByte(OLED_ADDR | OLED_WRITE);
    I2C_WriteByte(0x40);
    I2C_WriteByte(data);
    I2C_Stop();
}

3.3发送一组数据

void OLED_WriteNBytes(uint8_t *buf, uint16_t length)
{
    uint16_t i = 0;
    if(buf == NULL) return;
    I2C_Start();
    I2C_WriteByte(OLED_WRITE_ADDR);
    I2C_WriteByte(0x40);
    for(i=0; i<length; i++)
    {
        I2C_WriteByte(buf[i]);
    }
    I2C_Stop();
}

4.显示到屏幕原理

  

 内部显存GDDRAM,被分成8个页从PAGE0-PAGE7,每一个PAGE有128列,可以保存128X64的数据,数据会保存到从每一页的顶行到末行,读到某个位为0时是不会显示亮度的。

5.显存数据 

页地址模式(Page)

在页地址模式下,当往显存里面写入数据后,列地址指针会自动递增1。设置好起始页和起始列之后, 就可以连续发送数据,而不用 每发送一个数据就去指定一个 页和列的地址了,如果列地址指针递增到了设置的结束列地址,那么列地址指针就会复位回到设置的起始列地址,而页地址指针是不会有变化的。为了访问下一页显存中的内容,用户必须设置新的页和列的起始地址。

  

static MEM_MODE mem_mode = PAGE_ADDR_MODE;  // 静态局部变量,保存OLED的地址模式的


//发送命令0xB0-0xB7设置图像显示位置的起始页地址
void OLED_SetPageAddr_PAGE(uint8_t addr)
{
    if(mem_mode != PAGE_ADDR_MODE)  return;
    if(addr > 7)   return;
    OLED_WriteCmd(0xB0 + addr);
}

//发送命令0x00-0x0F设置图像显示位置的起始地址的低四位
//发送命令0x10-0x1F设置图像显示位置的起始地址的高四位
void OLED_SetColAddr_PAGE(uint8_t addr)
{
    if(mem_mode != PAGE_ADDR_MODE)  return;
    if(addr > 0x7F)   return;
    OLED_WriteCmd(0x00 + (addr & 0x0F));
    OLED_WriteCmd(0x10 + (addr>>4));
}

//封装成一个函数
void OLED_SetPosition(uint8_t page, uint8_t col)
{
    OLED_SetPageAddr_PAGE(page);
    OLED_SetColAddr_PAGE(col);
}

6.基础命令函数 

1.Set Contrast Control(设置对比度)

要发送两个命令,先发送0x81,后面又要发送A[7:0]这个字节,是个带参的函数,对于带参函数要进行合法性检测。这里定义的都是uint8_t类型可以不检测。

void OLED_SetContrastValue(uint8_t Value)
{
    OLED_WriteCmd(0x81);
    OLED_WriteCmd(Value);
}

2.Entire Display ON (全屏显示)

设置命令0xA5全屏点亮,设置命令0xA4熄灭

#define ENTIRE_DISP_ON()       OLED_WriteCmd(0xA5) 
#define ENTIRE_DISP_OFF()      OLED_WriteCmd(0xA4) 

 3.Set Normal/Inverse Display(设置正常/反向显示)

对于数据是逻辑1发光显示,还是逻辑0发光显示。

//阴码显示或者阳码显示
#define DISP_NORMAL()          OLED_WriteCmd(0xA6)  
#define DISP_INVERSE()         OLED_WriteCmd(0xA7)

4.Set Display ON/OFF(设置显示打开/关闭)

//打开显示或者关闭显示
#define DISP_ON()              OLED_WriteCmd(0xAF) 
#define DISP_OFF()             OLED_WriteCmd(0xAE) 

7.滚动命令功能函数

1.Continuous Horizontal Scroll Setup(水平方向左/右滚动)

typedef enum
{
    H_RIGHT     = 0x26,
    H_LEFT      = 0x27,
}H_SCROLL_DIR;  // 水平滚动方向


void OLED_H_Scroll(H_SCROLL_DIR dir,uint8_t start, uint8_t fr_time, uint8_t end)
{
    //合法性检测,数量不一定满足0-7个
    if((dir!=H_RIGHT)&&(dir!=H_LEFT)) return;
    if(start>0x07||fr_time>0x07||end>0x07) return;
    OLED_WriteCmd(dir);
    OLED_WriteCmd(0x00);
    OLED_WriteCmd(start);
    OLED_WriteCmd(fr_time);
    OLED_WriteCmd(end);
    OLED_WriteCmd(0x00);
    OLED_WriteCmd(0xFF);
}

2.Continuous Vertical and Horizontal Scroll Setup(垂直方向左右滚动设置)

typedef enum
{
    HV_RIGHT    = 0x29,
    HV_LEFT     = 0x2A,
}HV_SCROLL_DIR;     // 水平和垂直滚动的方向


void OLED_HV_Scroll(HV_SCROLL_DIR dir, uint8_t start, uint8_t fr_time, uint8_t end, uint8_t offset)
{
    if((dir!=HV_RIGHT)&&(dir!=HV_LEFT)) return;
    if(start>0x07||fr_time>0x07||end>0x07||offset>0x3F) return; 
    OLED_WriteCmd(dir);
    OLED_WriteCmd(0x00);
    OLED_WriteCmd(start);
    OLED_WriteCmd(fr_time);
    OLED_WriteCmd(end);
    OLED_WriteCmd(offset);
}

3.开始/结束滚动

//开始或者停止滚动
#define SCROLL_ON()             OLED_WriteCmd(0x2F)
#define SCROLL_OFF()            OLED_WriteCmd(0x2E)

4.Set Vertical Scroll Area(设置垂直滚动区域)

void OLED_SetVScrollArea(uint8_t area, uint8_t row_num)
{
    if((area>0x3F) || (row_num>0x7F))return;
    OLED_WriteCmd(0xA3);
    OLED_WriteCmd(area);
    OLED_WriteCmd(row_num);
}

8.寻址设置命令表

typedef enum
{
    H_ADDR_MODE     = 0,    // 水平地址模式
    V_ADDR_MODE     = 1,    // 垂直地址模式
    PAGE_ADDR_MODE  = 2,    // 页地址模式
}MEM_MODE;  // 内存地址模式

static MEM_MODE mem_mode = PAGE_ADDR_MODE;  // 静态局部变量,保存OLED的地址模式的

1.设置OLED在页地址模式下的显示起始column地址

void OLED_SetColAddr_PAGE(uint8_t addr)
{
    //先要判断当前的地址是否是页地址模式
    if(mem_mode != PAGE_ADDR_MODE)  return;
    if(addr > 0x7F)   return;
    OLED_WriteCmd(0x00 + (addr & 0x0F));
    OLED_WriteCmd(0x10 + (addr>>4));
}

 

2.Set Memory Addressing Mode(设置内存寻址模式)

void OLED_SetMemAddrMode(MEM_MODE mode)
{
    if((mode != H_ADDR_MODE) && (mode != V_ADDR_MODE) && (mode != PAGE_ADDR_MODE))   
    return;
    OLED_WriteCmd(0x20);
    OLED_WriteCmd(mode);
    mem_mode = mode;
}

3.Set Column Address(在水平和垂直模式下的起始column地址和终止column地址)

void OLED_SetColAddr_HV(uint8_t start, uint8_t end)
{
    if(mem_mode == PAGE_ADDR_MODE)      return;
    if((start > 127) || (end > 127))    return;
    OLED_WriteCmd(0x21);
    OLED_WriteCmd(start);
    OLED_WriteCmd(end);
}

4.分别在水平垂直模式和页地址模式的起始页地址和结束页地址

//函数名:OLED_SetPageAddr_HV
//功能描述:设置OLED在水平地址模式或垂直地址模式下像素显示的起始页地址和结束页地址
void OLED_SetPageAddr_HV(uint8_t start, uint8_t end)
{
    if(mem_mode == PAGE_ADDR_MODE)      return;
    if((start > 7) || (end > 7))        return; 
    OLED_WriteCmd(0x22);
    OLED_WriteCmd(start);
    OLED_WriteCmd(end);
}

// 函数名:OLED_SetPageAddr_PAGE
//功能描述:设置OLED在页地址模式下的显示起始页地址
void OLED_SetPageAddr_PAGE(uint8_t addr)
{
    if(mem_mode != PAGE_ADDR_MODE)  return;
    if(addr > 7)   return;
    OLED_WriteCmd(0xB0 + addr);
}

 

9.硬件配置功能函数

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

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

相关文章

python+pytest接口自动化-requests发送post请求

简介 在HTTP协议中&#xff0c;与get请求把请求参数直接放在url中不同&#xff0c;post请求的请求数据需通过消息主体(request body)中传递。 且协议中并没有规定post请求的请求数据必须使用什么样的编码方式&#xff0c;所以其请求数据可以有不同的编码方式&#xff0c;服务…

Linux的基本指令(3)

16.cal指令 cal命令可以用来显示公历&#xff08;阳历&#xff09;日历。公历是现在国际通用的历法&#xff0c;又称格列历&#xff0c;通称阳历。“阳历”又名“太阳历”&#xff0c;系以地球绕行太阳一周为一年&#xff0c;为西方各国所通用&#xff0c;故又名“西历”。 命…

手动创建映像及在OpenStack云计算平台的镜像应用

目录 一、下载 rhel7.6 安装ISO 二、在VMware 的虚拟机内创建虚拟机 三、更改一些设置 1、使用httpd暴露&#xff08;在外部虚拟机&#xff09; 2、添加软件仓库 3、 安装 ACPI 服务 4、使用 cloud-init 获取公钥 5、安装 cloud-utils-growpart 以允许调整分区大小 6、…

H5游戏和小程序游戏的区别是什么,分别有什么优势?

H5游戏和小程序游戏都是基于互联网的游戏形式&#xff0c;但它们在技术实现、发布平台和用户体验等方面存在一些区别。 技术实现&#xff1a; H5游戏&#xff1a; 使用HTML5、CSS3、JavaScript等Web技术进行开发。这意味着玩家可以通过任何支持Web浏览器的设备访问游戏&#…

CAD随机多面体_圆柱试件3D插件

插件介绍 CAD随机多面体_圆柱试件3D插件可用于在AutoCAD软件内生成随机三维多面体及外侧圆柱体试件。插件可确保多面体之间不发生干涉&#xff0c;且多面体与外侧圆柱体试件之间保持适配关系&#xff0c;确保生成的模型导入有限元软件后几何合理有效。本插件主要可应用于三维混…

对 .NET程序2G虚拟地址紧张崩溃 的最后一次反思

一&#xff1a;背景 1. 讲故事 最近接连遇到了几起 2G 虚拟地址紧张 导致的程序崩溃&#xff0c;基本上 90% 都集中在医疗行业&#xff0c;真的很无语&#xff0c;他们用的都是一些上古的 XP&#xff0c;Windows7 x86&#xff0c;我也知道技术人很难也基本无法推动硬件系统和…

XG916Ⅱ轮式装载机后驱动桥设计机械设计CAD

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;装载机 获取完整论文报告工程源文件 本次设计内容为XG916Ⅱ装载机后驱动桥设计&#xff0c;大致上分为主传动的设计&#xff0c;差速器的设计&#xff0c;半轴的设计&#xff0c;最终传动的设计四大部分。其中主传动锥齿轮…

读懂搜狐财报里的“生长密码”

自然界中各种植物的生长&#xff0c;在某些方面都合乎一定的数学规律。比如&#xff0c;斐波那契数列&#xff1a;树木各个年份对应的枝丫数、不同花朵的花瓣数量都对应着“1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5……”的数字。 科学家们认为&#xff0c;斐波…

最近iphone手机的交管12123闪退,打不开的解决办法?

苹果手机系统和新版软件不配&#xff0c;终极决绝办法&#xff1a;升级IOS系统就好 可能是手机的内存不足了&#xff0c;因为在使用APP时&#xff0c;需要占用手机的内存&#xff0c;如果手机内存不足以支持软件允许&#xff0c;软件就会闪退。车主可以清理一下手机的内存&…

高压配电室无人值守

高压配电室无人值守是指高压配电室在没有现场人员持续值守的情况下进行运行和管理。这种模式的实现依赖于先进的智能化技术和自动化系统&#xff0c;以确保配电室的安全、稳定和高效运行。 无人值守智能高压配电室的优势包括&#xff1a; 成本降低&#xff1a;无需常驻人员值守…

堆的实现(C语言版)

文章目录 概述堆的实现初始化销毁插入删除取堆顶元素求堆的长度判断堆是否为空 完整代码 概述 如果有一个关键码的集合K {k0,k1,k2…kn-1}&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中&#xff0c;并满足&#xff1a;Ki <K2*i1 且 Ki<K2…

Fiddler 无法抓包手机 https 报文的解决方案来啦!!

解决手机https无法抓包的问题 当你测试App的时候&#xff0c;想要通过Fiddler/Charles等工具抓包看下https请求的数据情况&#xff0c;发现大部分的App都提示网络异常/无数据等等信息 这时候怎么解决呢&#xff1f; 以软件测试面试提刷题APP为例&#xff1a; Fiddler上的显示…

excel自己记录

1、清除换行符号 2、添加特殊符号&并清除换行符号 7日&15日&30日&60日 3、判断单元格最后一个字符是不是数字&#xff0c;不是就删掉 IF(ISNUMBER(--RIGHT(B2,1)),B2,SUBSTITUTE(B2,RIGHT(B2,1),"")) ISNUMBER(--RIGHT(B2,1))判断最右边的一个数是否…

【正点原子STM32连载】 第五十八章 手写识别实验(Julia分形)实验 摘自【正点原子】APM32F407最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html## 第五…

[Python程序打包: 使用PyInstaller制作单文件exe以及打包GUI程序详解]

文章目录 概要Python 程序打包—使用 Pyinstaller 打包 exePython程序打包—使用Pyinstaller打包GUI程序Python程序打包—使用 Pyinstaller 设置 exe 图标小结 概要 使用PyInstaller工具将Python程序打包成可执行&#xff08;EXE&#xff09;文件。将Python程序打包成EXE的好处…

socket can中是如何根据 结构体can_bittiming_const中的字段 计算bitrate的?

在 SocketCAN 中&#xff0c;can_bittiming_const 结构体用于表示 CAN 总线的定时参数&#xff0c;包括位率&#xff08;bitrate&#xff09;的计算。can_bittiming_const 包含了许多与位率相关的参数&#xff0c;其中一些参数用于计算实际的位率。 下面是一些与位率计算相关的…

java中关键字 volatile 和 synchronized 有什么区别

java中 volatile 和 synchronized 有什么区别&#xff1f;

城市NOA到来时刻,车企密集上车NVIDIA

作者 |张祥威 编辑 |德新 基于双NVIDIA DRIVE Orin实现城市NOA&#xff0c;已是今天国内汽车行业的主流做法。 这款芯片获得广泛的市场认同&#xff0c;用时仅一年多。去年3月&#xff0c; NVIDIA DRIVE Orin正式投产&#xff0c;此后从造车新势力一路来到更多自主品牌的车内&…

初学vue3与ts:路由跳转带参数

index-router <!-- 路由跳转 --> <template><div><div class"title-sub flex"><div>1、用router-link跳转带参数id1&#xff1a;</div><router-link to"./link?id1"><button>点我跳转</button>&…

逆矩阵相关性质与例题

1.方阵的行列式&#xff1a;就是将方阵中的每一个元素转换至行列式中。 1.性质一&#xff1a;转置方阵的行列式等于转置前的行列式。&#xff08;对标性质&#xff1a;行列式与它的转置行列式相等&#xff09; 2.性质二&#xff1a;|ka||a|*k的n次方&#xff0c;n为方阵阶数。 …