我是使用HAL库驱动I2C四引脚的1.3寸OLED,工程项目文件使用STM32CubeMX生成。
使用HAL库的好处就是不需要添加ii.c和iic.h文件,非常简单。
下面两个函数可以直接使用,不做详解。
//写命令
void OLED_WriteCmd(uint8_t I2C_Command)
{
HAL_I2C_Mem_Write(&hi2c1, 0x78, 0x00, 1, &I2C_Command, 1, 100);
}
//写数据
void OLED_WriteDat(uint8_t I2C_Data)
{
HAL_I2C_Mem_Write(&hi2c1, 0x78, 0x40, 1, &I2C_Data, 1, 100);
}
除了上面提到的代码
1.3寸OLED的清屏函数和坐标设置函数与0.96寸略有不同
OLED_WriteCmd((x & 0x0F)); //设置显示位置—列低地址
OLED_WriteCmd(0x00); //设置显示位置—列低地址
原始0.96寸的代码
//坐标设置
void OLED_SetPos(uint8_t x, uint8_t y)
{
OLED_WriteCmd(0xB0 + y); //设置页地址(0~7)
OLED_WriteCmd(((x & 0xF0) >> 4) | 0x10); //设置显示位置—列高地址
OLED_WriteCmd((x & 0x0F)); //设置显示位置—列低地址
}
//清屏函数
void OLED_Clear(void)
{
uint8_t i, n;
for(i=0;i<8;i++)
{
OLED_WriteCmd(0xB0 + i); //设置页地址(0~7)
OLED_WriteCmd(0x00); //设置显示位置—列低地址
OLED_WriteCmd(0x10); //设置显示位置—列高地址
for(n=0;n<128;n++)
{
OLED_WriteDat(0);
}
} //更新显示
}
使用该函数会屏幕右侧可能会出现白点,或者坐标定位不准确,像这样。
在用0.96寸OLED移植1.3寸OLED程序的时候需要将0.96寸的显示地址向右偏移2
我看到有人是这样解决的
OLED_WriteCmd((x & 0x0F) | 0x02); //设置显示位置—列低地址
OLED_WriteCmd(0x02); //设置显示位置—列低地址(1.3->0x02, 0.96->0x00)
//坐标设置
void OLED_SetPos(uint8_t x, uint8_t y)
{
OLED_WriteCmd(0xB0 + y); //设置页地址(0~7)
OLED_WriteCmd(((x & 0xF0) >> 4) | 0x10); //设置显示位置—列高地址
OLED_WriteCmd((x & 0x0F) | 0x02); //设置显示位置—列低地址
}
//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!
void OLED_Clear(void)
{
uint8_t i, n;
for(i=0;i<8;i++)
{
OLED_WriteCmd(0xB0 + i); //设置页地址(0~7)
OLED_WriteCmd(0x02); //设置显示位置—列低地址(1.3->0x02, 0.96->0x00)
OLED_WriteCmd(0x10); //设置显示位置—列高地址
for(n=0;n<128;n++)
{
OLED_WriteDat(0);
}
} //更新显示
}
这样看似暂时解决了问题,实则不然。
清屏函数没问题了,但是坐标设置有问题
因为当我们设置好初始坐标后,每写1个字节(8位),下一个写的位置会自动加1,也就是坐标右移一位,不需要人为操作。
如果每设置一个坐标,就打一个点就会出现这样的问题。
OLED_WriteCmd((x & 0x0F) | 0x02); //设置显示位置—列低地址
仔细看这句代码,x是8位,当低2位为1的数会和前面的数字重复
比如00000000 b和00000010 b的结果一样,也就是 x为2 和 x为0 的结果一样。
同理:3和1的结果一样,6和4的结果一样,7和5的结果一样。
这样原本写在x=2,3位置的数据,写到了x=0、1位置
正确的代码应该是这样的,默认把x加2
//坐标设置1.3寸
void OLED_SetPos(uint8_t x, uint8_t y)
{
x += 2;
OLED_WriteCmd(0xB0 + y); //设置页地址(0~7)
OLED_WriteCmd((x >> 4) | 0x10); //设置显示位置—列高地址
OLED_WriteCmd(x & 0x0F); //设置显示位置—列低地址
}
完美显示
这样问题就完全解决了
如果大家对OLED的使用还有什么问题,欢迎评论留言!!!
最后分享一下最近自己做的小玩意儿