STM32-笔记38-I2C-oled实验

一、什么是I2C?

        I2C总线,全称Inter-Integrated Circuit(互连集成电路),是一种由Philips(现NXP半导体)公司在1980年代初开发的同步 串行 半双工通信总线。

二、有了串口通信为什么要使用I2C?

串口通信对比I2C有一些缺点

        1. 串口通信通常需要至少三条线(TX、RX和GND),而 I2C 总线仅需要两条信号线(SDA和SCL);
        2. 串口通信仅支持一对一通信,而 I2C 总线支持多机通信,允许单个主机与多个从机设备进行通信;
        3. 串口通信通常无应答机制,而 I2C 必须有应答机制;
        4. 串口通讯一般是异步通信,而 I2C 使用同步传输方式,数据在时钟信号(SCL)的控制下传输。

三、I2C的工作原理以及特点

四、IIC总线时序

4.1 起始信号

代码书写方式如下:

//开始信号
void oled_i2c_start(void)
{
    OLED_SCL_SET();
    OLED_SDA_SET();
    OLED_SDA_RESET();
    OLED_SCL_RESET();
}

4.2 停止信号

//停止信号
void oled_i2c_stop(void)
{
    OLED_SCL_SET();
    OLED_SDA_RESET();
    OLED_SDA_SET();
}

4.3 应答信号

//应答信号
void oled_i2c_ack(void)
{
    OLED_SCL_SET();
    OLED_SCL_RESET();
}

4.4 读写时序

一般都是发送,很少接收,这里只展现发送数据

//写一个字节信号
void oled_i2c_write_byte(uint8_t data)
{
    uint8_t i,tmp;
    tmp = data;
    for(i=0;i<8;i++)
    {
        if((tmp & 0x80) == 0x80)//取出最高位,判断最高位是不是1
            OLED_SDA_SET();//如果最高位是1,则sda给一个高电平
        else
            OLED_SDA_RESET();//如果最高位是0,则sda给一个低电平
        tmp = tmp << 1;
        OLED_SCL_SET();
        OLED_SCL_RESET();
    }
}

//写一个字节信号
void oled_i2c_write_byte(uint8_t data)
{
    uint8_t i,tmp;
    tmp = data;
    for(i=0;i<8;i++)
    {
        if((tmp & 0x80) == 0x80)//取出最高位,判断最高位是不是1
            OLED_SDA_SET();//如果最高位是1,则sda给一个高电平
        else
            OLED_SDA_RESET();//如果最高位是0,则sda给一个低电平
        tmp = tmp << 1;
        OLED_SCL_SET();
        OLED_SCL_RESET();
    }
}

4.5 一次完整的I2C时序

五、OLED实验目的

驱动 OLED 屏幕,显示点、线、字符、字符串、汉字、图片等内容。

六、项目实现-OLED通讯协议

复制项目文件19-串口打印功能

重命名为47-OLED实验

打开项目文件

加载文件

代码书写顺序:

oled.c

#include "oled.h"//初始化oled的gpio
void oled_gpio_init(void)
{GPIO_InitTypeDef gpio_initstruct;OLED_I2C_SCL_CLK();OLED_I2C_SDA_CLK();gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;gpio_initstruct.Pin = OLED_I2C_SCL_PIN;gpio_initstruct.Pull = GPIO_PULLUP;gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(OLED_I2C_SCL_PORT,&gpio_initstruct);gpio_initstruct.Pin = OLED_I2C_SDA_PIN;HAL_GPIO_Init(OLED_I2C_SDA_PORT,&gpio_initstruct);
}/*IIC协议的分装*/
//开始信号
void oled_i2c_start(void)
{OLED_SCL_SET();OLED_SDA_SET();OLED_SDA_RESET();OLED_SCL_RESET();
}
//停止信号
void oled_i2c_stop(void)
{OLED_SCL_SET();OLED_SDA_RESET();OLED_SDA_SET();
}
//应答信号
void oled_i2c_ack(void)
{OLED_SCL_SET();OLED_SCL_RESET();
}
//写一个字节信号
void oled_i2c_write_byte(uint8_t data)
{uint8_t i,tmp;tmp = data;for(i=0;i<8;i++){if((tmp & 0x80) == 0x80)//取出最高位,判断最高位是不是1OLED_SDA_SET();//如果最高位是1,则sda给一个高电平elseOLED_SDA_RESET();//如果最高位是0,则sda给一个低电平tmp = tmp << 1;OLED_SCL_SET();OLED_SCL_RESET();}
}
//发送一个命令信号
void oled_write_cmd(uint8_t cmd)
{oled_i2c_start();oled_i2c_write_byte(0x78);oled_i2c_ack();oled_i2c_write_byte(0x00);oled_i2c_ack();oled_i2c_write_byte(cmd);oled_i2c_ack();oled_i2c_stop();
}
//发送一个数据信号
void oled_write_data(uint8_t data)
{oled_i2c_start();oled_i2c_write_byte(0x78);oled_i2c_ack();oled_i2c_write_byte(0x40);oled_i2c_ack();oled_i2c_write_byte(data);oled_i2c_ack();oled_i2c_stop();
}//初始化OLED函数
void oled_init(void)
{oled_gpio_init();
}

oled.h

#ifndef __OLED_H__
#define __OLED_H__#include "sys.h"
/*SCL引脚*/
#define OLED_I2C_SCL_CLK()   __HAL_RCC_GPIOB_CLK_ENABLE()
#define OLED_I2C_SCL_PORT    GPIOB
#define OLED_I2C_SCL_PIN     GPIO_PIN_6
/*SDA引脚*/
#define OLED_I2C_SDA_CLK()   __HAL_RCC_GPIOB_CLK_ENABLE()
#define OLED_I2C_SDA_PORT    GPIOB
#define OLED_I2C_SDA_PIN     GPIO_PIN_7
/*SCL引脚拉高拉低*/
#define OLED_SCL_SET()       HAL_GPIO_WritePin(OLED_I2C_SCL_PORT,OLED_I2C_SCL_PIN,GPIO_PIN_SET)
#define OLED_SCL_RESET()     HAL_GPIO_WritePin(OLED_I2C_SCL_PORT,OLED_I2C_SCL_PIN,GPIO_PIN_RESET)
/*SDA引脚拉高拉低*/
#define OLED_SDA_SET()       HAL_GPIO_WritePin(OLED_I2C_SCL_PORT,OLED_I2C_SDA_PIN,GPIO_PIN_SET)
#define OLED_SDA_RESET()     HAL_GPIO_WritePin(OLED_I2C_SCL_PORT,OLED_I2C_SDA_PIN,GPIO_PIN_RESET)#endif

七、项目实现-OLED实现点、线、字符

mian.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "oled.h"extern const unsigned char shuai_data[];int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init();//初始化led灯uart1_init(115200);oled_init();printf("hello world!\r\n");oled_fill(0);//清屏函数//字母A-page0oled_set_cursor(0, 0);oled_write_data(0x00); oled_write_data(0x00);oled_write_data(0xC0);oled_write_data(0x38);oled_write_data(0xE0);oled_write_data(0x00);oled_write_data(0x00);oled_write_data(0x00);//page1oled_set_cursor(0, 1);oled_write_data(0x20);oled_write_data(0x3C);oled_write_data(0x23);oled_write_data(0x02);oled_write_data(0x02);oled_write_data(0x27);oled_write_data(0x38);oled_write_data(0x20);while(1){ }
}

oled.c

#include "oled.h"
#include "delay.h"//初始化oled的gpio
void oled_gpio_init(void)
{GPIO_InitTypeDef gpio_initstruct;OLED_I2C_SCL_CLK();OLED_I2C_SDA_CLK();gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;gpio_initstruct.Pin = OLED_I2C_SCL_PIN;gpio_initstruct.Pull = GPIO_PULLUP;gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(OLED_I2C_SCL_PORT,&gpio_initstruct);gpio_initstruct.Pin = OLED_I2C_SDA_PIN;HAL_GPIO_Init(OLED_I2C_SDA_PORT,&gpio_initstruct);
}/*IIC协议的分装*/
//开始信号
void oled_i2c_start(void)
{OLED_SCL_SET();OLED_SDA_SET();OLED_SDA_RESET();OLED_SCL_RESET();
}
//结束信号
void oled_i2c_stop(void)
{OLED_SCL_SET();OLED_SDA_RESET();OLED_SDA_SET();}
//应答信号
void oled_i2c_ack(void)
{OLED_SCL_SET();OLED_SCL_RESET();
}
//写一个字节信号
void oled_i2c_write_byte(uint8_t data)
{uint8_t i,tmp;tmp = data;for(i=0;i<8;i++){if((tmp & 0x80) == 0x80)//取出最高位,判断最高位是不是1OLED_SDA_SET();//如果最高位是1,则sda给一个高电平elseOLED_SDA_RESET();//如果最高位是0,则sda给一个低电平tmp = tmp << 1;OLED_SCL_SET();OLED_SCL_RESET();}
}
//发送一个命令信号
void oled_write_cmd(uint8_t cmd)
{oled_i2c_start();oled_i2c_write_byte(0x78);oled_i2c_ack();oled_i2c_write_byte(0x00);oled_i2c_ack();oled_i2c_write_byte(cmd);oled_i2c_ack();oled_i2c_stop();
}
//发送一个数据信号
void oled_write_data(uint8_t data)
{oled_i2c_start();oled_i2c_write_byte(0x78);oled_i2c_ack();oled_i2c_write_byte(0x40);oled_i2c_ack();oled_i2c_write_byte(data);oled_i2c_ack();oled_i2c_stop();
}//初始化OLED函数
void oled_init(void)
{oled_gpio_init();delay_ms(100);oled_write_cmd(0xAE);    //设置显示开启/关闭,0xAE关闭,0xAF开启oled_write_cmd(0xD5);    //设置显示时钟分频比/振荡器频率oled_write_cmd(0x80);    //0x00~0xFFoled_write_cmd(0xA8);    //设置多路复用率oled_write_cmd(0x3F);    //0x0E~0x3Foled_write_cmd(0xD3);    //设置显示偏移oled_write_cmd(0x00);    //0x00~0x7Foled_write_cmd(0x40);    //设置显示开始行,0x40~0x7Foled_write_cmd(0xA1);    //设置左右方向,0xA1正常,0xA0左右反置oled_write_cmd(0xC8);    //设置上下方向,0xC8正常,0xC0上下反置oled_write_cmd(0xDA);    //设置COM引脚硬件配置oled_write_cmd(0x12);oled_write_cmd(0x81);    //设置对比度oled_write_cmd(0xCF);    //0x00~0xFFoled_write_cmd(0xD9);    //设置预充电周期oled_write_cmd(0xF1);oled_write_cmd(0xDB);    //设置VCOMH取消选择级别oled_write_cmd(0x30);oled_write_cmd(0xA4);    //设置整个显示打开/关闭oled_write_cmd(0xA6);    //设置正常/反色显示,0xA6正常,0xA7反色oled_write_cmd(0x8D);    //设置充电泵oled_write_cmd(0x14);oled_write_cmd(0xAF);    //开启显示
}
//分装的坐标函数
void oled_set_cursor(uint8_t x, uint8_t y)//x是列,y是page
{oled_write_cmd(0xB0 + y);oled_write_cmd((x & 0x0F) | 0x00); oled_write_cmd(((x & 0xF0) >> 4) | 0x10);
}
//清屏函数
void oled_fill(uint8_t data)
{uint8_t i, j;//外层循环循环pagefor(i = 0; i < 8; i++){oled_set_cursor(0, i);for(j = 0; j < 128; j++)oled_write_data(data);}
}

oled.h

#ifndef __OLED_H__
#define __OLED_H__#include "sys.h"
/*SCL引脚*/
#define OLED_I2C_SCL_CLK()   __HAL_RCC_GPIOB_CLK_ENABLE()
#define OLED_I2C_SCL_PORT    GPIOB
#define OLED_I2C_SCL_PIN     GPIO_PIN_6
/*SDA引脚*/
#define OLED_I2C_SDA_CLK()   __HAL_RCC_GPIOB_CLK_ENABLE()
#define OLED_I2C_SDA_PORT    GPIOB
#define OLED_I2C_SDA_PIN     GPIO_PIN_7
/*SCL引脚拉高拉低*/
#define OLED_SCL_SET()       HAL_GPIO_WritePin(OLED_I2C_SCL_PORT,OLED_I2C_SCL_PIN,GPIO_PIN_SET)
#define OLED_SCL_RESET()     HAL_GPIO_WritePin(OLED_I2C_SCL_PORT,OLED_I2C_SCL_PIN,GPIO_PIN_RESET)
/*SDA引脚拉高拉低*/
#define OLED_SDA_SET()       HAL_GPIO_WritePin(OLED_I2C_SCL_PORT,OLED_I2C_SDA_PIN,GPIO_PIN_SET)
#define OLED_SDA_RESET()     HAL_GPIO_WritePin(OLED_I2C_SCL_PORT,OLED_I2C_SDA_PIN,GPIO_PIN_RESET)void oled_init(void);
void oled_write_cmd(uint8_t cmd);
void oled_write_data(uint8_t data);
void oled_set_cursor(uint8_t x, uint8_t y);
void oled_fill(uint8_t data);
#endif

项目实现-显示任意字符汉字图片

mian.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "oled.h"extern const unsigned char shuai_data[];int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init();//初始化led灯uart1_init(115200);oled_init();printf("hello world!\r\n");oled_fill(0);//清屏函数
//    //字母A page0
//    oled_set_cursor(0, 0);
//    oled_write_data(0x00); 
//    oled_write_data(0x00);
//    oled_write_data(0xC0);
//    oled_write_data(0x38);
//    oled_write_data(0xE0);
//    oled_write_data(0x00);
//    oled_write_data(0x00);
//    oled_write_data(0x00);
//    //page1
//    oled_set_cursor(0, 1);
//    oled_write_data(0x20);
//    oled_write_data(0x3C);
//    oled_write_data(0x23);
//    oled_write_data(0x02);
//    oled_write_data(0x02);
//    oled_write_data(0x27);
//    oled_write_data(0x38);
//    oled_write_data(0x20);oled_show_char(0, 0, 'L', 16);oled_show_char(8, 0, 'X', 16);oled_show_char(16, 0, '?', 16);oled_show_char(24, 0, '6', 16);//    oled_show_string(0, 2, "hello LX", 24);//    uint8_t i;
//    for(i = 0; i < 5; i++)
//        oled_show_chinese(i*24, 0, i, 24);//    oled_show_image(0, 0, 128, 8, (unsigned char *)shuai_data);while(1){ }
}

oled.c

#include "oled.h"
#include "delay.h"
#include "font.h"//初始化oled的gpio
void oled_gpio_init(void)
{GPIO_InitTypeDef gpio_initstruct;OLED_I2C_SCL_CLK();OLED_I2C_SDA_CLK();gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;gpio_initstruct.Pin = OLED_I2C_SCL_PIN;gpio_initstruct.Pull = GPIO_PULLUP;gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(OLED_I2C_SCL_PORT,&gpio_initstruct);gpio_initstruct.Pin = OLED_I2C_SDA_PIN;HAL_GPIO_Init(OLED_I2C_SDA_PORT,&gpio_initstruct);
}/*IIC协议的分装*/
//开始信号
void oled_i2c_start(void)
{OLED_SCL_SET();OLED_SDA_SET();OLED_SDA_RESET();OLED_SCL_RESET();
}
//结束信号
void oled_i2c_stop(void)
{OLED_SCL_SET();OLED_SDA_RESET();OLED_SDA_SET();}
//应答信号
void oled_i2c_ack(void)
{OLED_SCL_SET();OLED_SCL_RESET();
}
//写一个字节信号
void oled_i2c_write_byte(uint8_t data)
{uint8_t i,tmp;tmp = data;for(i=0;i<8;i++){if((tmp & 0x80) == 0x80)//取出最高位,判断最高位是不是1OLED_SDA_SET();//如果最高位是1,则sda给一个高电平elseOLED_SDA_RESET();//如果最高位是0,则sda给一个低电平tmp = tmp << 1;OLED_SCL_SET();OLED_SCL_RESET();}
}
//发送一个命令信号
void oled_write_cmd(uint8_t cmd)
{oled_i2c_start();oled_i2c_write_byte(0x78);oled_i2c_ack();oled_i2c_write_byte(0x00);oled_i2c_ack();oled_i2c_write_byte(cmd);oled_i2c_ack();oled_i2c_stop();
}
//发送一个数据信号
void oled_write_data(uint8_t data)
{oled_i2c_start();oled_i2c_write_byte(0x78);oled_i2c_ack();oled_i2c_write_byte(0x40);oled_i2c_ack();oled_i2c_write_byte(data);oled_i2c_ack();oled_i2c_stop();
}//初始化OLED函数
void oled_init(void)
{oled_gpio_init();delay_ms(100);oled_write_cmd(0xAE);    //设置显示开启/关闭,0xAE关闭,0xAF开启oled_write_cmd(0xD5);    //设置显示时钟分频比/振荡器频率oled_write_cmd(0x80);    //0x00~0xFFoled_write_cmd(0xA8);    //设置多路复用率oled_write_cmd(0x3F);    //0x0E~0x3Foled_write_cmd(0xD3);    //设置显示偏移oled_write_cmd(0x00);    //0x00~0x7Foled_write_cmd(0x40);    //设置显示开始行,0x40~0x7Foled_write_cmd(0xA1);    //设置左右方向,0xA1正常,0xA0左右反置oled_write_cmd(0xC8);    //设置上下方向,0xC8正常,0xC0上下反置oled_write_cmd(0xDA);    //设置COM引脚硬件配置oled_write_cmd(0x12);oled_write_cmd(0x81);    //设置对比度oled_write_cmd(0xCF);    //0x00~0xFFoled_write_cmd(0xD9);    //设置预充电周期oled_write_cmd(0xF1);oled_write_cmd(0xDB);    //设置VCOMH取消选择级别oled_write_cmd(0x30);oled_write_cmd(0xA4);    //设置整个显示打开/关闭oled_write_cmd(0xA6);    //设置正常/反色显示,0xA6正常,0xA7反色oled_write_cmd(0x8D);    //设置充电泵oled_write_cmd(0x14);oled_write_cmd(0xAF);    //开启显示
}
//分装的坐标函数
void oled_set_cursor(uint8_t x, uint8_t y)//x是列,y是page
{oled_write_cmd(0xB0 + y);oled_write_cmd((x & 0x0F) | 0x00); oled_write_cmd(((x & 0xF0) >> 4) | 0x10);
}
//清屏函数
void oled_fill(uint8_t data)
{uint8_t i, j;//外层循环循环pagefor(i = 0; i < 8; i++){oled_set_cursor(0, i);for(j = 0; j < 128; j++)oled_write_data(data);}
}
//指定显示字符 - 列坐标-page -哪个字符-字符大小
void oled_show_char(uint8_t x, uint8_t y, uint8_t num, uint8_t size)
{uint8_t i, j, page;num = num - ' ';page = size / 8;if(size % 8)//判断字符大小page++;for(j = 0; j < page; j++)//page循环{oled_set_cursor(x, y + j);for(i = size / 2 * j; i < size /2 * (j + 1); i++){if(size == 12)oled_write_data(ascii_6X12[num][i]);else if(size == 16)oled_write_data(ascii_8X16[num][i]);else if(size == 24)oled_write_data(ascii_12X24[num][i]);}}
}
//显示字符串
void oled_show_string(uint8_t x, uint8_t y, char *p, uint8_t size)
{while(*p != '\0'){oled_show_char(x, y, *p, size);x += size/2;//偏移字符p++;}
}
//显示汉字
void oled_show_chinese(uint8_t x, uint8_t y, uint8_t N, uint8_t size)
{uint16_t i, j;for(j = 0; j < size/8; j++){oled_set_cursor(x, y + j);for(i = size *j; i < size * (j + 1); i++){if(size == 16)oled_write_data(chinese_16x16[N][i]);else if(size == 24)oled_write_data(chinese_24x24[N][i]);}}
}
//显示图片
void oled_show_image(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t *bmp)
{uint8_t i, j;for(j = 0; j < height; j++){oled_set_cursor(x, y + j);for(i = 0; i < width; i++)oled_write_data(bmp[width * j + i]);}
}

oled.h

#ifndef __OLED_H__
#define __OLED_H__#include "sys.h"
/*SCL引脚*/
#define OLED_I2C_SCL_CLK()   __HAL_RCC_GPIOB_CLK_ENABLE()
#define OLED_I2C_SCL_PORT    GPIOB
#define OLED_I2C_SCL_PIN     GPIO_PIN_6
/*SDA引脚*/
#define OLED_I2C_SDA_CLK()   __HAL_RCC_GPIOB_CLK_ENABLE()
#define OLED_I2C_SDA_PORT    GPIOB
#define OLED_I2C_SDA_PIN     GPIO_PIN_7
/*SCL引脚拉高拉低*/
#define OLED_SCL_SET()       HAL_GPIO_WritePin(OLED_I2C_SCL_PORT,OLED_I2C_SCL_PIN,GPIO_PIN_SET)
#define OLED_SCL_RESET()     HAL_GPIO_WritePin(OLED_I2C_SCL_PORT,OLED_I2C_SCL_PIN,GPIO_PIN_RESET)
/*SDA引脚拉高拉低*/
#define OLED_SDA_SET()       HAL_GPIO_WritePin(OLED_I2C_SCL_PORT,OLED_I2C_SDA_PIN,GPIO_PIN_SET)
#define OLED_SDA_RESET()     HAL_GPIO_WritePin(OLED_I2C_SCL_PORT,OLED_I2C_SDA_PIN,GPIO_PIN_RESET)void oled_init(void);
void oled_write_cmd(uint8_t cmd);
void oled_write_data(uint8_t data);
void oled_set_cursor(uint8_t x, uint8_t y);
void oled_fill(uint8_t data);
void oled_show_char(uint8_t x, uint8_t y, uint8_t num, uint8_t size);
void oled_show_string(uint8_t x, uint8_t y, char *p, uint8_t size);
void oled_show_chinese(uint8_t x, uint8_t y, uint8_t N, uint8_t size);
void oled_show_image(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t *bmp);
#endif

font.h

#ifndef __FONT_H__
#define __FONT_H__//16号汉字
const unsigned char chinese_16x16[][32] =
{    /*汉字的字模*/};//24号汉字
const unsigned char chinese_24x24[][72] =
{/*汉字的字模*/
};const unsigned char ascii_6X12[][12]={/*可见的ASCII字符集字模*/
};//16*16 ASCII字符集点阵
const unsigned char ascii_8X16[][16]=      
{/*可见的ASCII字符集字模*/
};//16*16 ASCII字符集点阵
const unsigned char ascii_12X24[][36]=
{/*可见的ASCII字符集字模*/ 
};
//汉字帅
const unsigned char shuai_data[] = {/*汉字帅的字模*/
};#endif

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

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

相关文章

《C++11》右值引用深度解析:性能优化的秘密武器

C11引入了一个新的概念——右值引用&#xff0c;这是一个相当深奥且重要的概念。为了理解右值引用&#xff0c;我们需要先理解左值和右值的概念&#xff0c;然后再理解左值引用和右值引用。本文将详细解析这些概念&#xff0c;并通过实例进行说明&#xff0c;以揭示右值引用如何…

libevent定时器的性能测试(与rte_timer对比)

前言 接着上篇文章&#xff0c;rte_timer的性能测试https://blog.csdn.net/jacicson1987/article/details/144997298 进行常用的libevent的定时器测试&#xff0c;看看有什么区别&#xff0c;测试方法还是一样&#xff0c;代码放在下面。 测试方法 100万个定时器&#xff0…

C# 事件

目录 1、事件模型的5个组成部分2、使用内置委托类型声明事件2.1 EventHandler2.1.1 &#xff1f;2.1.2 this2.1.3 使用匿名函数和lamda表达式2.1.3.1 匿名函数2.1.3.2 lamda表达式 2.1.4 异常处理 2.2 EventHandler<TEventArgs> 3、使用自定义委托类型声明事件3.1 事件的…

英伟达 RTX 5090 显卡赋能医疗大模型:变革、挑战与展望

一、英伟达 RTX 5090 与 RTX 4090 技术参数对比 1.1 核心架构与制程工艺 在探讨英伟达 RTX 4090 与 RTX 5090 的差异时&#xff0c;核心架构与制程工艺无疑是最为关键的基础要素&#xff0c;它们从根本上决定了两款显卡的性能上限与应用潜力。 1.1.1 核心架构差异 RTX 4090…

爬虫学习记录

1.概念 通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程 通用爬虫:抓取的是一整张页面数据聚焦爬虫:抓取的是页面中的特定局部内容增量式爬虫:监测网站中数据更新的情况,只会抓取网站中最新更新出来的数据 robots.txt协议: 君子协议,网站后面添加robotx.txt…

玩机搞机基本常识-------列举安卓机型一些不常用的adb联机命令

前面分享过很多 常用的adb命令&#xff0c;今天分享一些不经常使用的adb指令。以作备用 1---查看当前手机所有app包名 adb shell pm list package 2--查看当前机型所有apk包安装位置 adb shell pm list package -f 3--- 清除指定应用程序数据【例如清除浏览器应用的数据】 …

【25考研】川大计算机复试情况,重点是啥?怎么准备?

24年进入复试的同学中&#xff0c;有10位同学的复试成绩为0分。具体是个人原因还是校方原因&#xff0c;还尚不明确。但是C哥提醒&#xff0c;一定要认真复习&#xff01;复试完后不要跟任何人讨论有关复试的题目及细节&#xff01; 一、复试内容 四川大学复试内容较多&#xf…

计算机的错误计算(二百零五)

摘要 基于一位读者的问题&#xff0c;提出题目&#xff1a;能用数值计算证明 吗&#xff1f;请选用不同的点&#xff08;即差别大的数&#xff09;与不同的精度。实验表明&#xff0c;大模型理解了题意。但是&#xff0c;其推理能力值得商榷。 例1. 就摘要中问题&#xff0…

回归预测 | MATLAB实GRU多输入单输出回归预测

回归预测 | MATLAB实GRU多输入单输出回归预测 目录 回归预测 | MATLAB实GRU多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB实GRU多输入单输出回归预测。使用GRU作为RNN的一种变体来处理时间序列数据。GRU相比传统的RNN有较好的记…

unity学习12:地图相关的一些基础2, 增加layer种草种树

目录 参考学习 1 地图设置 1.1 上次制作的地图&#xff0c;稍微加点地形完善下. 1.2 调整下camera 1.3 摄像机camera的移动速度 1.4 地图属性&#xff0c;terrain settings 1.5 但是&#xff0c;地图看起来像沙漠一样&#xff0c;很单调 2 paint terrain / paint textu…

数据挖掘——数据预处理

数据挖掘——数据预处理 数据预处理数据预处理 ——主要任务数据清洗如何处理丢失的数据如何处理噪声数据如何处理不一致数据 数据集成相关分析相关系数(也成为皮尔逊相关系数)协方差 数据规约降维法&#xff1a;PCA主成分分析降数据——抽样法数据压缩 数据预处理 数据预处理…

Python入门教程 —— 网络编程

1.网络通信概念 简单来说,网络是用物理链路将各个孤立的工作站或主机相连在一起,组成数据链路,从而达到资源共享和通信的目的。 使用网络的目的,就是为了联通多方然后进行通信,即把数据从一方传递给另外一方。 前面的学习编写的程序都是单机的,即不能和其他电脑上的程…

鸿蒙APP之从开发到发布的一点心得

引言&#xff1a; 做鸿蒙开发大概有1年左右时间了&#xff0c;从最开始的看官方文档、看B站视频&#xff0c;到后来成功发布两款个人APP&#xff08;房贷计算极简版、时简时钟 轻喷&#xff0c;谢谢&#xff09;。简单描述一下里边遇到的坑以及一些经历吧。 学习鸿蒙开发 个…

力扣刷题:数组OJ篇(上)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 目录 1.消失的数字&#xff08;1&#xff09;题目描…

linux下多个硬盘划分到同一挂载点

Linux下多个硬盘划分到同一挂载点 需要明确的几个概念 物理卷: 物理卷是物理存储设备&#xff08;如硬盘分区、整个硬盘、RAID 阵列等&#xff09;在逻辑卷管理&#xff08;LVM - Logical Volume Manager&#xff09;系统中的抽象表示。它是构建逻辑卷组的基本单元 假设我们有…

2.STM32F407ZGT6-外部中断

参考&#xff1a; 1.正点原子。 前言&#xff1a; MCU最重要的一个领域–中断。总结下嵌套向量和外部中断的概念。达到&#xff1a; 1.NVIC是什么&#xff0c;了解中断的整体管理理念。 2.中断里面最简单的外部中断&#xff0c;怎么配置处理。 3.使用STM32CubeMX配置外部中断的…

《HeadFirst设计模式》笔记(下)

代理模式 代理要做的就是控制和管理访问。 你的客户对象所做的就像是在做远程方法调用&#xff0c;但其实只是调用本地堆中的“代理”对象上的方法&#xff0c;再由代理处理所有网络通信的低层细节。 Java的RMI提供了客户辅助对象和服务辅助对象&#xff0c;为客户辅助对象…

【学Rust开发CAD】1 环境搭建

文章目录 一、搭建C/C编译环境二、安装Rust三、配置 PATH 环境变量四、验证安装结果五、安装编辑工具 一、搭建C/C编译环境 Rust 的编译工具依赖 C 语言的编译工具&#xff0c;这意味着你的电脑上至少已经存在一个 C 语言的编译环境。如果你使用的是 Linux 系统&#xff0c;往…

【Linux系列】Vim 编辑器中的高效文本编辑技巧:删除操作

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Python爬虫与1688图片搜索API接口:深度解析与显著收益

在电子商务的浩瀚海洋中&#xff0c;数据是驱动业务决策的核心引擎。阿里巴巴旗下的1688平台&#xff0c;作为全球领先的B2B在线市场&#xff0c;不仅汇聚了海量的商品信息&#xff0c;还提供了丰富的API接口&#xff0c;为开发者提供了强大的数据获取工具。本文将深入探讨1688…