博主平时DIY经常使用OLED,其中以4脚的I2C屏最多,就想着总结一下子,让广大DIY朋友更容易找到资源。
驱动采用的时SSD1306
同学们拿到代码后,可以直接用,其中博主给的代码默认引脚都是
SDA接板子PB11
,SCL接板子PB10
,下载完代码接上之后重启会直接亮屏。
STM32-U8g2驱动OLED屏幕。
U8g2驱动OLED
由于硬件IIC口只有两组(STM32F103C8T6)所以选择IO口有限,各位同学选择的时候注意。
init.h
中需要修改:IO口宏定义
#define IIC_OLED_SDA_Pin GPIO_Pin_11
#define IIC_OLED_SDA_GPIO GPIOB
#define IIC_OLED_SCL_Pin GPIO_Pin_10
#define IIC_OLED_SCL_GPIO GPIOB
和**init.c
中需要修改**:IO口初始化
/*STM32F103C8T6芯片的硬件I2C: PB6 -- SCL; PB7 -- SDA */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//I2C必须开漏输出
GPIO_Init(GPIOB, &GPIO_InitStructure);
博主选择的时I2C2,同学如果想用I2C1的话还需要修改。
init.c
中需要修改:I2C初始化还有所有使用中的I2C都要改为你所用的I2C
void I2C_Configuration(void)
{
I2C_InitTypeDef I2C_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
I2C_DeInit(I2C2);//使用I2C1
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x30;//主机的I2C地址,随便写的
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 1000000;//1M
I2C_Cmd(I2C2, ENABLE);
I2C_Init(I2C2, &I2C_InitStructure);
}
uint8_t u8x8_byte_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) {
uint8_t* data = (uint8_t*) arg_ptr;
switch(msg) {
case U8X8_MSG_BYTE_SEND:
while( arg_int-- > 0 ) {
I2C_SendData(I2C2, *data++);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
continue;
}
break;
case U8X8_MSG_BYTE_INIT:
/* add your custom code to init i2c subsystem */
I2C_Configuration();
break;
case U8X8_MSG_BYTE_SET_DC:
/* ignored for i2c */
break;
case U8X8_MSG_BYTE_START_TRANSFER:
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C2, ENABLE);
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT))
continue;
I2C_Send7bitAddress(I2C2, 0x78, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
continue;
break;
case U8X8_MSG_BYTE_END_TRANSFER:
I2C_GenerateSTOP(I2C2, ENABLE);
break;
default:
return 0;
}
return 1;
}
即可使用。
软件I2C只需要修改为你所使用的引脚即可。别忘了还有初始化中的IO引脚初始化。
#define IIC_OLED_SDA_Pin GPIO_Pin_11
#define IIC_OLED_SDA_GPIO GPIOB
#define IIC_OLED_SCL_Pin GPIO_Pin_10
#define IIC_OLED_SCL_GPIO GPIOB
STM32-普通库驱动OLED屏幕。
oled.c
中需要修改:其实和U8g2库需要改动的地方一样,都是IO口初始化和I2C初始化。如果使用I2C2就不需要改了。
/*STM32F103C8T6芯片的硬件I2C: PB10 -- SCL; PB11 -- SDA */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//I2C必须开漏输出
GPIO_Init(GPIOB, &GPIO_InitStructure);
oled.h
中需要修改:IO口宏定义
#define OLED_SCL_PORT GPIOB
#define OLED_SCL_PIN GPIO_Pin_10
#define OLED_SCLK_Clr() GPIO_ResetBits(OLED_SCL_PORT,OLED_SCL_PIN)//SCL
#define OLED_SCLK_Set() GPIO_SetBits(OLED_SCL_PORT,OLED_SCL_PIN)
#define OLED_SDA_PORT GPIOB
#define OLED_SDA_PIN GPIO_Pin_11
#define OLED_SDIN_Clr() GPIO_ResetBits(OLED_SDA_PORT,OLED_SDA_PIN)//SDA
#define OLED_SDIN_Set() GPIO_SetBits(OLED_SDA_PORT,OLED_SDA_PIN)
即可使用
按照博主以下步骤即可加入汉字显示。
我们以上文中普通库硬件I2C驱动OLED为例子。
PCtoLCD2002
软件。oledfont.h
的unsigned char F16x16[]
数组中,并将unsigned char character[]
字符串的相应位置添加你增加的中文字符。OLED_Show(0,0,"你好");
即可显示,其中的0,0
代表xy
坐标的位置。到此我们就显示了汉字了。按照博主以下步骤即可加入图片显示。
我们以上文中普通库软件I2C驱动OLED为例子。
bmp.h
文件的unsigned char BMP1[]
数组中即可。OLED_DrawBMP(0,0,128,8,BMP1);
。其中0,0
代表起点xy
轴坐标,128,8
代表结束xy
轴坐标。30*30
则代码中显示应为OLED_DrawBMP(50,0,80,6,BMP2);
x1-x0为30
y1-y0
小于图片的话图片显示不全但是不会乱码。gifsplitter2.0.exe
将gif分离成帧。OLED显示GIF
源码地址:https://download.csdn.net/download/weixin_42320020/88759113
拒绝转载!