瑞芯微Rockchip开发者社区
直播中

贾桂林

7年用户 1517经验值
私信 关注
[经验]

如何在RK2206开发板上使用I2C控制OLED液晶屏显示

硬件接口说明

引脚名称开发者可在硬件资源图中查看,也可在oled模块正面面查看。

硬件连接

程序设计

API分析

oled_init()

unsigned int oled_init();

描述:

初始化oled设备。

参数:

返回值:

返回0为成功,反之为失败

oled_deinit()

unsigned int oled_deinit();

描述:

释放oled设备。

参数:

返回值:

返回0为成功,反之为失败

oled_display_on()

void oled_display_on(void);

描述:

oled显示开启。

参数:

返回值:

oled_display_off()

void oled_display_off(void);

描述:

oled显示关闭。

参数:

返回值:

oled_clear()

void oled_clear(void);

描述:

oled清空屏幕。

参数:

返回值:

oled_show_char()

void oled_show_char(uint8_t x, uint8_t y, uint8_t chr, uint8_t chr_size);

描述:

oled显示单个英文字符。

参数:

返回值:

oled_show_num()

void oled_show_num(uint8_t x, uint8_t y, uint32_t num, uint8_t len, uint8_t size);

描述:

oled显示整数。

参数:

返回值:

oled_show_string()

void oled_show_string(uint8_t x, uint8_t y, uint8_t *p, uint8_t chr_size);

描述:

oled显示英文字符串。

参数:

返回值:

oled_draw_bmp()

void oled_draw_bmp(unsigned char x0, 
                unsigned char y0, 
                unsigned char x1, 
                unsigned char y1, 
                unsigned char bmp[]);

描述:

oled显示图片。

参数:

返回值:

OLED器件

OLED显示屏

OLED显示屏是0.96寸OLED显示屏,型号为SSD1306,像素为128 * 64。

OLED液晶屏采用i2c通信方式,根据芯片手册说明,从设备地址为 0x3C。

主要代码分析

这部分代码为i2c初始化的代码。首先用 I2cIoInit() 函数将GPIO0_PC1复用为I2C1_SDA_M1,GPIO0_PC2复用为I2C1_SCL_M1。最后调用 LzI2cInit()函数初始化I2C1端口。

if (I2cIoInit(m_i2cBus) != LZ_HARDWARE_SUCCESS)
{
    printf("%s, %d: I2cIoInit failed!\n", __FILE__, __LINE__);
    return __FILE__;
}
if (LzI2cInit(OLED_I2C_BUS, m_i2c_freq) != LZ_HARDWARE_SUCCESS)
{
    printf("%s, %d: I2cIoInit failed!\n", __FILE__, __LINE__);
    return __FILE__;
}

具体i2c写操作如下:

static inline void Write_IIC_Command(unsigned char IIC_Command)
{
    unsigned char buffer[2];
    unsigned int ret;

    /* 填充数据,第一个字节是通知OLED芯片,下一个字节是命令 */
    buffer[0] = 0x00;
    buffer[1] = IIC_Command;
    ret = LzI2cWrite(OLED_I2C_BUS, OLED_I2C_ADDRESS, buffer, 2);
    if (ret != 0)
    {
        printf("%s, %s, %d: LzI2cWrite failed(%d)!\n", __FILE__, __func__, __LINE__, ret);
    }
}

static inline void Write_IIC_Data(unsigned char IIC_Data)
{
    unsigned char buffer[2];
    unsigned int ret;

    /* 填充数据,第一个字节是通知OLED芯片,下一个字节是数据 */
    buffer[0] = 0x40;
    buffer[1] = IIC_Data;
    ret = LzI2cWrite(OLED_I2C_BUS, OLED_I2C_ADDRESS, buffer, 2);
    if (ret != 0)
    {
        printf("%s, %s, %d: LzI2cWrite failed(%d)!\n", __FILE__, __func__, __LINE__, ret);
    }
}

配置SSD1306启动

LOS_Msleep(200);

Oled_WR_Byte(0xAE, OLED_CMD); //--display off
Oled_WR_Byte(0x00, OLED_CMD); //---set low column address
Oled_WR_Byte(0x10, OLED_CMD); //---set high column address
Oled_WR_Byte(0x40, OLED_CMD); //--set start line address
Oled_WR_Byte(0xB0, OLED_CMD); //--set page address
Oled_WR_Byte(0x81, OLED_CMD); // contract control
Oled_WR_Byte(0xFF, OLED_CMD); //--128
Oled_WR_Byte(0xA1, OLED_CMD); //set segment remap
Oled_WR_Byte(0xA6, OLED_CMD); //--normal / reverse
Oled_WR_Byte(0xA8, OLED_CMD); //--set multiplex ratio(1 to 64)
Oled_WR_Byte(0x3F, OLED_CMD); //--1/32 duty
Oled_WR_Byte(0xC8, OLED_CMD); //Com scan direction
Oled_WR_Byte(0xD3, OLED_CMD); //-set display offset
Oled_WR_Byte(0x00, OLED_CMD); //

Oled_WR_Byte(0xD5, OLED_CMD); //set osc division
Oled_WR_Byte(0x80, OLED_CMD); //

Oled_WR_Byte(0xD8, OLED_CMD); //set area color mode off
Oled_WR_Byte(0x05, OLED_CMD); //

Oled_WR_Byte(0xD9, OLED_CMD); //Set Pre-Charge Period
Oled_WR_Byte(0xF1, OLED_CMD); //

Oled_WR_Byte(0xDA, OLED_CMD); //set com pin configuartion
Oled_WR_Byte(0x12, OLED_CMD); //

Oled_WR_Byte(0xDB, OLED_CMD); //set Vcomh
Oled_WR_Byte(0x30, OLED_CMD); //

Oled_WR_Byte(0x8D, OLED_CMD); //set charge pump enable
Oled_WR_Byte(0x14, OLED_CMD); //

Oled_WR_Byte(0xAF, OLED_CMD); //--turn on oled panel

这部分代码将SSD1306的启动配置。

编译调试

修改 BUILD.gn 文件

修改 vendor/lockzhiner/lingpi/sample 路径下 BUILD.gn 文件,指定 b5_oled 参与编译。

"b5_oled",

在主目录下输入编译命令。

hb build -f

运行结果

示例代码编译烧录代码后,按下开发板的RESET按键,通过串口助手查看日志,并请使用带有LCD屏幕显示如下:

========= Oled Process =============

原作者:王小彬 Gitee

更多回帖

发帖
×
20
完善资料,
赚取积分