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
相关文章:
STM32-笔记38-I2C-oled实验
一、什么是I2C? I2C总线,全称Inter-Integrated Circuit(互连集成电路),是一种由Philips(现NXP半导体)公司在1980年代初开发的同步 串行 半双工通信总线。 二、有了串口通信为什么要使用I2C&…...
人大金仓实现主键自增.
使用数据库中自带的参数类型 serial 类型(相当于创建一个INT列), 或者bigserial(相当于创建一个BIGINT列. 示例sql: CREATE TABLE ord(id SERIAL,ord_no INT NOT NULL,ord_name VARCHAR(32),CONSTRAINT "ord_PKEY" PRIMARY KEY ("id"));插入时指定自增值…...
h264之多视点mvc编码及解码过程(JMVC平台举例)
h264标准参考平台JMVC是针对MVC标准的,JMVC支持多视点编码、合流、多视点解码操作。可以利用JMVC生成h264 mvc码流和解码。 JMVC的下载地址是:jvet / JMVC GitLabH.264/AVC multi-view coding (MVC) extension JMVC reference softwarehttps://vcgit.hh…...
小程序学习08—— 系统参数获取和navBar组件样式动态设置
一 系统信息的概念 uni-app提供了异步(uni.getSystemInfo)和同步(uni.getSystemInfoSync)的2个API获取系统信息。 success 返回参数说明: 参数分类说明statusBarHeight手机状态栏的高度system操作系统名称及版本。。。 二 自定义navbar 2.1 获取系统参数 代码展示…...
数据库环境安装(day1)
网址:MySQL 下载(环境准备): (2-5点击此处,然后选择合适的版本) 1.linux在线YUM仓库 下载/安装: wget https://repo.mysql.com//mysql84-community-release-el9-1.noarch.rpm rpm -i https://r…...
网络安全-web渗透环境搭建-BWAPP(基础篇)
01--所需系统环境: 虚拟主机系统部署(vmware,虚拟主机创建、虚拟主机网络配置(桥接,便于网络中多个主机都能访问虚拟主机)、虚拟软件功能,快照、克隆、镜像文件加载,ova文件制作&am…...
当算法遇到线性代数(三):实对称矩阵
实对称矩阵的理论与应用 线性代数系列相关文章(置顶) 1.当算法遇到线性代数(一):二次型和矩阵正定的意义 2.当算法遇到线性代数(二):矩阵特征值的意义 3.当算法遇到线性代数&#x…...
WayLand的架构和协议
WayLand的架构和协议 1. Wayland简介 1.1 Wayland是啥?为啥它这么重要? 嘿,你知道吗?有时候咱们用电脑的时候,是不是觉得图形界面有点慢、有点卡?那是因为我们还在用一个叫X Window System (X11)的老伙计…...
STM32学习(十)
I2C模块内部结构 I2C(Inter-Integrated Circuit)模块是一种由Philips公司开发的二线式串行总线协议,用于短距离通信,允许多个设备共享相同的总线。 硬件连接简单:I2C通信仅需要两条总线,即SCL&…...
进阶篇-Day17:JAVA的日志、枚举、类加载器、反射等介绍】
目录 1、日志1.1 日志概念1.2 日志框架(1) Logback框架:(2)配置文件介绍: 2、枚举3、类加载器3.1 类加载器的介绍3.2 类加载器的加载过程:加载、链接、初始化3.3 类加载器的分类3.4 双亲委派模式…...
Java设计模式 —— 【行为型模式】责任链模式(Chain-of-responsibility Pattern) 详解
文章目录 模式介绍优缺点适用场景模式结构案例实现 模式介绍 责任链模式又名职责链模式,它是一种对象行为的设计模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链&…...
C++和Python中负数取余结果的区别
C中的负数取余规则(取模%)规则 在C中,取余运算( % )的结果符号与被除数相同。从数学定义角度看,C遵循的是尽量让商向零取整的规则。例如计算 -7/3,商是 -2 (向零取整)&a…...
rust学习——环境搭建
rust安装:https://kaisery.github.io/trpl-zh-cn/ch01-01-installation.html 1、vscode装插件: toml语法支持 依赖管理 rust语法支持 2、创建demo 3、查看目录 4、执行文件的几种方式: rust安装:https://www.rust-lang.org/z…...
Linux系统中解决端口占用问题
在日常的 Linux 系统管理和开发过程中,端口占用是一个常见且令人头疼的问题。无论是部署新服务、调试应用程序,还是进行系统维护,遇到端口被占用都可能导致服务无法正常启动或运行。本文将详细介绍在 Linux 系统中如何识别和解决端口占用问题…...
现代软件架构设计:14个质量属性的定义、权衡与最佳实践
1. 引言 1.1 技术架构的重要性 技术架构是指导软件系统设计和开发的核心,它定义了系统的高层结构及关键技术选型。一个优秀的技术架构可以提高开发效率、系统稳定性和扩展能力,确保项目成功落地。面对复杂业务场景,技术架构的设计至关重要&…...
【UE5 C++课程系列笔记】25——多线程基础——FGraphEventRef的简单使用
目录 概念 使用示例1 使用示例2 概念 FGraphEventRef 本质上是对一个异步任务或者一组相关异步任务在虚幻引擎任务图系统中的一种引用(reference)。虚幻引擎的任务图系统用于高效地调度和管理各种异步任务,协调它们的执行顺序以及处理任务…...
计算机网络之---信号与编码
信号 在物理层,信号是用来传输比特流的物理量,它可以是电压、电流、光强度等形式,通常通过电缆、光纤或者无线信道等媒介传播。 信号主要分为以下两种类型: 模拟信号(Analog Signal):信号在时间…...
linux下用命令行给串口写数据和读数据
在 Linux 系统中,串口设备(如 /dev/ttyS3)可以通过命令行进行读写操作。您遇到的问题是因为 Bash 解释了命令行中的字符串 “dis vlan\n”,但并没有按预期向串口设备发送数据。你应该将数据通过重定向发送到串口设备。 下面是如何…...
【生物信息】如何使用 h5py 读取 HDF5 格式文件中的数据并将其转换为 NumPy 数组
data_mat h5py.File(args.data_file) x1 np.array(data_mat[X1]) x2 np.array(data_mat[X2]) if not args.no_labels: y np.array(data_mat[Y]) data_mat.close() 这段代码展示了如何使用 h5py 读取 HDF5 格式文件中的数据并将其转换为 NumPy 数组。以下是代码的详细解释&a…...
纯手工(不基于maven的pom.xml、Web容器)连接MySQL数据库的详细过程(Java Web学习笔记)
1 引言 最近读一些Java Web开发类的书籍时,发现书中的连接数据库的过程缺少了一些关键性的过程,这对初学者非常不友好。为此,本文将给出详细的连接MySQL数据库的过程,并且是纯手工,不依赖于pom.xml和Web容器ÿ…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
