完全解决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全套资料 132 X 64 Dot Matrix OLED/PLED Preliminary Segment/Common Driver with Controller 1 V0.2 Features „ Support maximum 132 X 64 dot matrix panel „ Embedded 132 X 64 bits SRAM „ Operating voltage: - Logic voltage supply: VDD1 = 1.65V - 3.5V - DC-DC voltage supply: VDD2 = 3.0V – 4.2V - OLED Operating voltage supply: External VPP supply = 6.4V - 13.0V Internal VPP generator = 6.4V - 9.0V „ Maximum segment output current: 200μA „ Maximum common sink current: 27mA „ 8-bit 6800-series parallel interface, 8-bit 8080-series parallel interface, 3-wire & 4-wire serial peripheral interface, 400KHz fast I2C bus interface „ Programmable frame frequency and multiplexing ratio „ Row re-mapping and column re-mapping (ADC) „ Vertical scrolling „ On-chip oscillator „ Programmable Internal charge pump circuit output „ 256-step contrast control on monochrome passive OLED panel „ Low power consumption - Sleep mode: <5μA - VDD1=0V,VDD2=3.0V – 4.2V: <5μA - VDD1,2=0V,VPP=3.0V – 4.2V: <5μA „ Wide range of operating temperatures: -40 to +85°C „ Available in COG form, thickness: 300μm General Description SH1106 is a single-chip CMOS OLED/PLED driver with controller for organic/polymer light emitting diode dot-matrix graphic display system. SH1106 consists of 132 segments, 64 commons that can support a maximum display resolution of 132 X 64. It is designed for Common Cathode type OLED panel. SH1106 embeds with contrast control, display RAM oscillator and efficient DC-DC converter, which reduces the number of external components and power consumption. SH1106 is suitable for a wide range of compact portable applications, such as sub-display of mobile phone, calculator and MP3 player, etc.
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

PsnForLife

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

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

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

打赏作者

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

抵扣说明:

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

余额充值