完全解决IIC四引脚OLED1.3寸的显示问题

我是使用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 b00000010 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的使用还有什么问题,欢迎评论留言!!!

最后分享一下最近自己做的小玩意儿

CLion软件编程实现MPU6050

1.3OLED是一种小尺的有机发光二极管显示器,通常用于物联网设备、智能手表等小型设备中。在设计和开发1.3OLEDIIC驱动程序时,以下是一些关键步骤和要点: 1. 确定硬件连接:首先,需要确定IIC总线的连接方式,包括SDA(数据线)和SCL(时钟线)的连接。通常,这些线路应连接到主控制芯片的相应引脚上。 2. 初始化OLED:在驱动程序中,需要进行OLED的初始化,包括设置显示模式、亮度、对比度等参数。这可以通过向OLED发送特定的命令和数据实现。 3. 显示数据传输:通过IIC总线,将要显示的数据传输到OLED上。首先,将发送起始信号和设备地址到IIC总线上,然后发送命令和数据。通常,命令用于控制OLED显示模式、位置等,而数据用于在屏幕上绘制图像、文本等内容。 4. 控制OLED的清除与刷新:当需要清除屏幕上的内容时,可以发送相应的命令或数据到OLED,将所有像素点设置为透明状态。而当需要刷新内容时,只需要更新屏幕上特定像素点的数据。 5. 节能模式:为了延长OLED的使用寿命和节省能源,可以在驱动程序中实现一种节能模式。这可以通过控制OLED的亮度、显示模式等来实现。 总而言之,IIC驱动程序的设计与1.3OLED的初始化、数据传输、清除与刷新以及节能模式等功能密切相关。在编写驱动程序时,需要按照OLED的规格和要求,正确地设置和发送命令和数据,以实现期望的显示效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野生炼丹师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值