响应式相册网站模板,界面设计包括哪三个方面,怎样加入网销平台,建设部网站工程设计收费标准I2C (Inter-Integrated Circuit): I2C 是一种用于在芯片之间进行短距离数字通信的串行通信协议。它允许多个设备通过两根导线#xff08;一根数据线 SDA 和一根时钟线 SCL#xff09;进行通信。I2C 常常用于嵌入式系统中连接传感器、存储器、显示屏和其他外设。 数据线和时钟… I2C (Inter-Integrated Circuit): I2C 是一种用于在芯片之间进行短距离数字通信的串行通信协议。它允许多个设备通过两根导线一根数据线 SDA 和一根时钟线 SCL进行通信。I2C 常常用于嵌入式系统中连接传感器、存储器、显示屏和其他外设。 数据线和时钟线是用于串行通信的两种基本信号线。它们通常用于协调和传输数据确保发送和接收设备之间的同步和正确的通信。以下是它们的作用 数据线SDA - Serial Data Line 数据线用于传输实际的数据位。在串行通信中每个数据位按照顺序一个接一个地传输。SDA 承载着要发送或接收的二进制数据每个数据位都在 SDA 上进行传输。 时钟线SCL - Serial Clock Line 时钟线是一个用于同步的信号线。它定义了数据位何时开始传输和何时结束以及每个位的持续时间。SCL 的频率决定了通信速率即每秒传输的位数。 在串行通信中数据和时钟信号的组合允许设备在相同的时序下进行通信。发送设备通过时钟线告诉接收设备何时读取数据线上的位。这种同步机制确保了数据的正确性和可靠性。 例如对于 I2CInter-Integrated Circuit协议SDA 是数据线而 SCL 是时钟线。在每个时钟周期内一个数据位被传输或接收并且通过时钟信号进行同步。这种机制使得可以在两根线上进行双向通信同时在同一总线上连接多个设备。 总的来说数据线和时钟线是串行通信中的基本元素它们协同工作以实现可靠和同步的数据传输。 用到的库函数 HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c,uint16_t DevAddress,uint16_t MemAddress,uint16_t MemAddSize,uint8_t *pData,uint16_t Size,uint32_t Timeout) 函数的参数如下 hi2c: I2C外设的句柄包含了I2C外设的配置和状态信息。DevAddress: 目标设备的I2C地址。MemAddress: 目标设备的内存地址即要写入数据的位置。MemAddSize: 内存地址的大小以字节为单位通常是1或2个字节。pData: 要写入的数据的指针。Size: 要写入的数据的字节数。Timeout: 操作的超时时间以毫秒为单位。 这个函数的作用是在指定的I2C总线上向目标设备的指定内存地址写入一定数量的数据。函数返回一个 HAL_StatusTypeDef 类型的状态表示操作的成功或失败。 向OLED写命令的封装
void Oled_Write_Cmd(uint8_t dataCmd)
{HAL_I2C_Mem_Write(hi2c1, 0x78, 0x00, I2C_MEMADD_SIZE_8BIT,dataCmd, 1, 0xff);
} 向OLED写数据的封装
void Oled_Write_Data(uint8_t dataData)
{HAL_I2C_Mem_Write(hi2c1, 0x78, 0x40, I2C_MEMADD_SIZE_8BIT,dataData, 1, 0xff);
}
OLED实验 接线 SCL -- PB6 SDA -- PB7 void Oled_Write_Cmd(uint8_t dataCmd)
{HAL_I2C_Mem_Write(hi2c1, 0x78, 0x00, I2C_MEMADD_SIZE_8BIT,dataCmd, 1, 0xff);
}
void Oled_Write_Data(uint8_t dataData)
{HAL_I2C_Mem_Write(hi2c1, 0x78, 0x40, I2C_MEMADD_SIZE_8BIT,dataData, 1, 0xff);
}
void Oled_Init(void){Oled_Write_Cmd(0xAE);//--display offOled_Write_Cmd(0x00);//---set low column addressOled_Write_Cmd(0x10);//---set high column addressOled_Write_Cmd(0x40);//--set start line addressOled_Write_Cmd(0xB0);//--set page addressOled_Write_Cmd(0x81); // contract controlOled_Write_Cmd(0xFF);//--128Oled_Write_Cmd(0xA1);//set segment remapOled_Write_Cmd(0xA6);//--normal / reverseOled_Write_Cmd(0xA8);//--set multiplex ratio(1 to 64)Oled_Write_Cmd(0x3F);//--1/32 dutyOled_Write_Cmd(0xC8);//Com scan directionOled_Write_Cmd(0xD3);//-set display offsetOled_Write_Cmd(0x00);//Oled_Write_Cmd(0xD5);//set osc divisionOled_Write_Cmd(0x80);//Oled_Write_Cmd(0xD8);//set area color mode offOled_Write_Cmd(0x05);//Oled_Write_Cmd(0xD9);//Set Pre-Charge PeriodOled_Write_Cmd(0xF1);//Oled_Write_Cmd(0xDA);//set com pin configuartionOled_Write_Cmd(0x12);//Oled_Write_Cmd(0xDB);//set VcomhOled_Write_Cmd(0x30);//Oled_Write_Cmd(0x8D);//set charge pump enableOled_Write_Cmd(0x14);//Oled_Write_Cmd(0xAF);//--turn on oled panel
}void Oled_Screen_Clear(void){int i,n;Oled_Write_Cmd (0x20); //set memory addressing modeOled_Write_Cmd (0x02); //page addressing modefor(i0;i8;i){Oled_Write_Cmd(0xb0i); Oled_Write_Cmd(0x00); Oled_Write_Cmd(0x10); for(n0;n128;n)Oled_Write_Data(0x00);}
}
unsigned char bmpImager[] {
/*-- 调入了一幅图像D:\无标题.bmp --*/
/*-- 宽度x高度128x64 --128x8x8*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xF0,0x08,0x0C,0x04,0x06,0x06,0x0C,0x04,0x0C,0xFC,0x1C,0x74,0xFC,0xF8,
0xF0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x01,0x07,0x04,0x88,0xF8,0x08,0x08,0x0C,0x06,0x01,0x00,0x00,0x01,0x1F,
0x7F,0xFF,0xDC,0xF8,0xE0,0xC0,0x40,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x10,0x18,0x08,0x0C,
0x04,0x04,0x06,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x60,0xC0,0x80,0x80,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
0x03,0x06,0x1C,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0xFC,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x88,0xE8,0x38,0x0E,0x09,0x08,
0x08,0x88,0xE8,0x18,0x08,0x08,0x08,0x00,0x00,0xFF,0x89,0x89,0x89,0xFF,0x00,0xFF,
0x89,0x89,0x89,0x89,0xFF,0x00,0x00,0x04,0x04,0x84,0x74,0x6F,0xA4,0x24,0x24,0x24,
0x24,0xA4,0x64,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x80,0xF0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x7F,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x08,0x09,0x09,0x06,0x06,
0x06,0x05,0x08,0x08,0x10,0x10,0x00,0x00,0x0C,0x03,0x10,0x10,0x10,0x1F,0x18,0x07,
0x00,0x00,0x10,0x10,0x1F,0x00,0x10,0x08,0x06,0x11,0x10,0x08,0x09,0x0A,0x06,0x06,
0x0B,0x08,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,
0x1E,0x03,0x00,0x00,0xC0,0x60,0x30,0x0C,0x04,0x06,0x02,0x01,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
0x1E,0x60,0x78,0x0F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};void Oled_Show_Image(unsigned char *image)
{unsigned char i;unsigned int j;for(i0;i8;i){Oled_Write_Cmd(0xB0 i);//page0--page7//每个page从0列Oled_Write_Cmd(0x00);Oled_Write_Cmd(0x10);//0到127列依次写入0每写入数据列地址自动偏移for(j 128 * i; j(128 * (i1));j){Oled_Write_Data(image[j]);}}
}int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_I2C1_Init();//1. OLED初始化Oled_Init();//2. 选择一个位置//2.1 确认页寻址模式Oled_Write_Cmd(0x20);Oled_Write_Cmd(0x02);Oled_Screen_Clear();Oled_Show_Image(bmpImager);while (1){}} 这段代码是一个用于控制OLED显示屏的STM32程序通过I2C总线进行通信。以下是代码的主要部分的解释 Oled_Write_Cmd 函数 用于向OLED发送命令。使用了 HAL_I2C_Mem_Write 函数该函数用于通过I2C总线向设备的指定内存地址写入数据。在这里使用 HAL_I2C_Mem_Write 函数向OLED发送命令包括设备地址、内存地址命令地址、数据长度等参数。 Oled_Write_Data 函数 用于向OLED发送数据。同样使用了 HAL_I2C_Mem_Write 函数但这次写入的是数据而不是命令。 Oled_Init 函数 用于OLED的初始化设置了一系列的初始化命令例如关闭显示、设置列地址、设置起始行地址等。 Oled_Screen_Clear 函数 用于清除OLED屏幕内容。设置OLED为页寻址模式然后对每一页的每一列写入0实现清屏效果。 Oled_Show_Image 函数 用于在OLED上显示图像。接收一个指向图像数据的指针然后将数据逐页逐列写入OLED。 main 函数 在 main 函数中首先进行了系统初始化、GPIO初始化和I2C初始化。调用了 Oled_Init 进行OLED的初始化。调用了 Oled_Screen_Clear 进行OLED的清屏。最后调用了 Oled_Show_Image 显示了一个预定义的图像。 总的来说这个程序通过I2C总线控制OLED屏幕进行初始化、清屏并显示图像。其中使用了HAL库提供的函数来简化硬件控制的实现。 图像显示函数 void Oled_Show_Image(unsigned char *image)
{unsigned char i;unsigned int j;for(i0; i8; i){Oled_Write_Cmd(0xB0 i); // 设置页地址Page Address范围是0xB0到0xB7Oled_Write_Cmd(0x00); // 设置列地址的低四位Oled_Write_Cmd(0x10); // 设置列地址的高四位// 每个page从0列开始写入数据列地址自动偏移for(j 128 * i; j (128 * (i1)); j){Oled_Write_Data(image[j]); // 写入图像数据}}
}Oled_Write_Cmd(0xB0 i);: 设置OLED的页地址因为OLED是分页显示的每页有8行。0xB0是页地址的基准值通过 i 的变化可以在0xB0到0xB7之间循环选择页。 Oled_Write_Cmd(0x00);: 设置列地址的低四位因为一共有128列这里设置低四位为0表示从第0列开始写入数据。 Oled_Write_Cmd(0x10);: 设置列地址的高四位因为列地址是8位的这里设置高四位为0x1表示从第16列开始写入数据。这是因为OLED内部的存储结构是每个列占8个像素所以16列的高四位为1。 for(j 128 * i; j (128 * (i1)); j) { Oled_Write_Data(image[j]); }: 通过循环逐列写入图像数据。j 的取值范围是从0到127实际上每页的图像数据在 image 数组中是连续存放的因此通过这个循环可以将一整页的图像数据逐列写入OLED。
OLED的宽度为128像素高度为64像素。这是一种常见的OLED屏幕分辨率。在这种情况下每个页面Page有8行共有64/8 8个页面。
具体到代码中的 Oled_Show_Image 函数它通过循环遍历8个页面每个页面逐列写入图像数据。每个页面有128列因为OLED的宽度是128像素。
在这个例子中假设 image 数组中的数据是按照每个页面从左到右、从上到下的顺序存储的每个像素用一个字节表示。因此通过循环逐页逐列写入数据可以正确地将整个图像显示在OLED上。