0.96寸OLED-单独驱动和U8g2驱动-硬件软件IIC
博主平时DIY经常使用OLED,其中以4脚的I2C屏最多,就想着总结一下子,让广大DIY朋友更容易找到资源。
驱动采用的时SSD1306
同学们拿到代码后,可以直接用,其中博主给的代码默认引脚都是
SDA接板子PB11
,SCL接板子PB10
,下载完代码接上之后重启会直接亮屏。
U8g2驱动OLDE
STM32-U8g2驱动OLED屏幕。
U8g2驱动OLED
U8g2硬件I2C驱动
由于硬件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);//使用I2C1I2C_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;//1MI2C_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;
}
即可使用。
U8g2软件I2C驱动
软件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
普通库驱动OLDE
STM32-普通库驱动OLED屏幕。
普通库硬件I2C驱动
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);
普通库软件I2C驱动
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结尾的照片。如果不是可以在线转换。图片格式转换链接:https://www.gaitubao.com/jpg-gif-png。
- 使用系统画图工具打开打开。
- 主页图像栏重新调整大小点机像素,取消勾选保持纵横比,调整合适的水平和垂直像素(0.96的OLED屏分辨为128*64)保存图片。
- 打开取模软件,点击设置,调为图中的参数。 返回主界面点击模式->选择图形模式。
- 复制到
bmp.h
文件的unsigned char BMP1[]
数组中即可。 - 调用函数
OLED_DrawBMP(0,0,128,8,BMP1);
。其中0,0
代表起点xy
轴坐标,128,8
代表结束xy
轴坐标。
复杂图形取模显示
- 将图片转为
128*64
分辨率的bmp
格式。 - 使用
Image2Lcd v2.9
打开图像,调整亮度,得到希望得到的显示率。
- 输出为bmp格式。
- 然后调用插入简单图片方式导入程序。
显示小图片
- 调整合适大小在PCtolcd形成字模。
- 放到代码数组中。
- 计算好图片分辨率和显示分辨率。例如:图片
30*30
则代码中显示应为OLED_DrawBMP(50,0,80,6,BMP2);
x1-x0为30
y1-y0
小于图片的话图片显示不全但是不会乱码。
显示gif
- 用
gifsplitter2.0.exe
将gif分离成帧。 - 之后跟显示图片一样。
OLED显示GIF
源码地址:https://download.csdn.net/download/weixin_42320020/88759113
拒绝转载!