利用STC32F驱动OLED SSD1306

测试OLED液晶模块

OLED显示器
目 录
Contents
前言
编写程序
网络资料
基于51的驱动程序
总 结

01 OLED显示器


一、前言

  手边有一款I2C接口的OLED,  下面利用 STC32F单片机对其进行编程测试,  实验电路是在面包板上搭建的,  主要是为了获得相应的应用子程序,  为今后的应用打下基础。

GM1688719319_1280_800.MPG|_-5

二、编写程序

1、扫描地址

  在面包板上搭建了测试电路, 利用STC32F的 P1.5,P1.4分别输出 I2C 的时钟和数据线, 与OLED SSD1306相连接, 构成测试电路。

GM1688201421_1280_800.MPG|_-3
  首先,利用I2C总线进行扫描, 获得OLED 的 I2C 地址。 扫描地址从 1 开始, 一直到 0x7F。  发送一个写命令, 通过检查是否获得 ACK响应,  确定是否返回对应的 7 位 的地址。 如果没有扫描到,最终返回 0x80。 根据网络上关于 SSD1306的范例程序, SSD1306的 I2C 地址应该为 0x3C
GM1688201680_1280_800.MPG|_-6
  在主程序中, 每隔0.25秒扫描一次,  最终可以获得一个I2C设备地址为 0x3C, 这就是SSD1306的地址。
GM1688201787_1280_800.MPG|_-2

2、软件测试

  下面通过软件编程,  实现对OLED1306 的控制。  很多的子程序是从网络上寻找到的别人编写程序的初始化程序,  利用I2C总线进行控制。  通过对比, 这组OLED 初始化命令所获得显示最为清晰。 这里给出了显示的中间结果,  对应OLED显示的点阵信息对应内存中的 8 × 128 字节的RAM 缓冲区,  下面通过示波器测试输出缓冲区所需要的时间,  这里给出了输出缓冲区需要 44.7毫秒。

GM1688718569_1280_800.MPG|_-9

▲ 图1.2.1 输出缓冲区是缠绵

▲ 图1.2.1 输出缓冲区是缠绵

  为了缩小输出OLED缓冲区的时间,  对 I2C 总线的速度进行修改, 这里将原来初始化的 0xff 修改成 0xc7, 速度应该是提高了8倍。 这是通过实验测试的, 如果速度继续提高, OLED就无法驱动了。  在这个速度型, OLED仍然能够被I2C驱动。  对应的输出时间减小到 7.5ms。 大大提高的 OLED 刷新的速率。

GM1688718942_1280_800.MPG|_-5

02 络资料


一、基于51的驱动程序

/**********************************************************************************
 * 程序名:    SSD1306_IIC驱动程序
 * 作者:      DaveoCKII
 * 日期:      2020.7.21
 * 版本:      STC12C5A60S2
 **********************************************************************************/

typedef unsigned char u8;
//------------------------------------定义列表------------------------------------//
sbit SCL = P3^4;    // 时钟线
sbit SDA = P3^3;    // 数据线
//------------------------------------函数列表------------------------------------//

void OLED_Init(void);            // OLED 初始化

void OLED_Clear(void);            // OLED 清屏

void OLED_WriteCMD(u8 cmd);        // OLED 单次写命令

void OLED_WriteDAT(u8 dat);        // OLED 单次写数据

void OLED_WriteMultiByte(u8 *dat, u8 len, u8 cmd);    // OLED连续写入

void OLED_Frame(u8 P[8][128]);        // OLED 一帧图像写入

void OLED_Frame32(u8 P[4][128]);    // OLED 32行写入(为128X32规格设计)

//------------------------------------内部函数------------------------------------//
static void IIC_START(void);        // IIC_开始信号    (重开始信号用此替代)
static void IIC_STOP(void);         // IIC_结束信号
static void IIC_Write(u8 dat);        // IIC_写数据函数    参数:要写入的数据
//------------------------------------函数内容------------------------------------//

void OLED_WriteCMD(u8 cmd)
{
    
    
    IIC_START();        // 通信开始
    IIC_Write(0X78);    // 写从机地址'0111 100' 读写符号'0'
    IIC_Write(0X00);    // 写命令  Co='0' C/D='000 0000'
    IIC_Write(cmd);        // 写入命令
    IIC_STOP();            // 通信结束
}

void OLED_WriteDAT(u8 dat)
{
    
    
    IIC_START();        // 通信开始
    IIC_Write(0X78);    // 写从机地址'0111 100' 读写符号'0'
    IIC_Write(0X40);    // 写数据  Co='0' C/D='100 0000'
    IIC_Write(dat);        // 写入数据
    IIC_STOP();            // 通信结束
}

// 参数说明: cmd: 0X00,写命令  0X40,写数据
void OLED_WriteMultiByte(u8 *dat, u8 len, u8 cmd)
{
    
    
    u8 i,j;
    IIC_START();        // 通信开始
    IIC_Write(0X78);    // 写从机地址'0111 100' 读写符号'0'
    IIC_Write(cmd);        // 根据参数选择写命令还是数据
    for(i=0; i<len; i++)
        IIC_Write(dat[i]);
    //通信结束
    IIC_STOP();
}

void OLED_Init(void)
{
    
    
    IIC_START();            // 通信开始
    IIC_Write(0X78);        // 写从机地址'0111 100' 读写符号'0'
    IIC_Write(0x00);        // 写命令 Co='0' C/D='000 0000'
    IIC_Write(0XAE);        // 关OLED显示
    // 基础设置
    IIC_Write(0XA4);        // 输出GDDRAM内容
    IIC_Write(0XA6);        // 正常显示(10)
    IIC_Write(0X81);        // 设置对比度
    IIC_Write(0X7F);        //127级对比度
    // COM和SEG输出设置
    IIC_Write(0XD3);        // 设置垂直显示偏移(向上)
    IIC_Write(0X00);        // 偏移0行
    IIC_Write(0X40);        // 设置GDDRAM起始行 0
    IIC_Write(0XA8);        // 设置MUX数 (显示行数)
    IIC_Write(0X3F);        //  MUX=63     (显示63)
    IIC_Write(0XA1);        // 左右反置关(段重映射)
    IIC_Write(0XC8);        // 上下反置关(行重映射)
    IIC_Write(0XDA);        // 设置COM引脚配置
    IIC_Write(0X12);        // 序列COM配置,禁用左右反置
    // 时钟设置
    IIC_Write(0XD5);        // 设置DCLK分频和OSC频率
    IIC_Write(0X80);        // 无分频,8级OSC频率
    // 开OLED
    IIC_Write(0X8D);        // 启用电荷泵
    IIC_Write(0X14);        // 启用电荷泵
    IIC_Write(0XAF);        // 开OLED显示
    // 通信结束
    IIC_STOP();
}

void OLED_Clear(void)
{
    
    
    u8 i,j;
    // 地址设置
    IIC_START();        // 通信开始
    IIC_Write(0X78);    // 写从机地址'0111 100' 读写符号'0'
    IIC_Write(0x00);    // 写命令 Co='0' C/D='000 0000'
    IIC_Write(0X20);    // 设置GDDRAM模式
    IIC_Write(0X00);    // 水平寻址模式
    IIC_Write(0X21);    // 设置列起始和结束地址
    IIC_Write(0X00);    // 列起始地址 0
    IIC_Write(0X7F);    // 列终止地址 127
    IIC_Write(0X22);    // 设置页起始和结束地址
    IIC_Write(0X00);    // 页起始地址 0
    IIC_Write(0X07);    // 页终止地址 7
    // 写入一帧'0'
    IIC_START();        // 通信重开始
    IIC_Write(0X78);    // 写从机地址'0111 100' 读写符号'0'
    IIC_Write(0X40);    // 写数据  Co='0' C/D='100 0000'
    for(i=0; i<8; i++){
    
    
        for(j=0; j<128; j++){
    
    
            IIC_Write(0X00);
        }
    }

    IIC_STOP();
}

void OLED_Frame(u8 P[8][128])
{
    
    
    u8 i,j;
    // 地址设置
    IIC_START();        // 通信开始
    IIC_Write(0X78);    // 写从机地址'0111 100' 读写符号'0'
    IIC_Write(0x00);    // 写命令 Co='0' C/D='000 0000'
    IIC_Write(0X20);    // 设置GDDRAM模式
    IIC_Write(0X00);    // 水平寻址模式
    IIC_Write(0X21);    // 设置列起始和结束地址
    IIC_Write(0X00);    // 列起始地址 0
    IIC_Write(0X7F);    // 列终止地址 127
    IIC_Write(0X22);    // 设置页起始和结束地址
    IIC_Write(0X00);    // 页起始地址 0
    IIC_Write(0X07);    // 页终止地址 7
    // 写入一帧数据
    IIC_START();        // 通信重开始
    IIC_Write(0X78);    // 写从机地址'0111 100' 读写符号'0'
    IIC_Write(0X40);    // 写数据  Co='0' C/D='100 0000'
    for(i=0; i<8; i++)
        for(j=0; j<128; j++)
            IIC_Write(P[i][j]);
    // 结束IIC通信
    IIC_STOP();
}

void OLED_Frame32(u8 P[4][128])
{
    
    
    u8 i,j;
    // 地址设置
    IIC_START();        // 通信开始
    IIC_Write(0X78);    // 写从机地址'0111 100' 读写符号'0'
    IIC_Write(0x00);    // 写命令 Co='0' C/D='000 0000'
    IIC_Write(0X20);    // 设置GDDRAM模式
    IIC_Write(0X00);    // 水平寻址模式
    IIC_Write(0X21);    // 设置列起始和结束地址
    IIC_Write(0X00);    // 列起始地址 0
    IIC_Write(0X7F);    // 列终止地址 127
    IIC_Write(0X22);    // 设置页起始和结束地址
    IIC_Write(0X00);    // 页起始地址 0
    IIC_Write(0X07);    // 页终止地址 7
    // 写入32行数据
    IIC_START();        // 通信重开始
    IIC_Write(0X78);    // 写从机地址'0111 100' 读写符号'0'
    IIC_Write(0X40);    // 写数据  Co='0' C/D='100 0000'
    for(i=0; i<4; i++)
        for(j=0; j<128; j++)
            IIC_Write(P[i][j]);
    // 结束IIC通信
    IIC_STOP();
}

//----------------------------------内部函数内容-----------------------------------//

static void IIC_START(void)
{
    
    
    SDA = 1;        // SDA拉高
    SCL = 1;        // SCL拉高 准备发出起始信号
    SDA = 0;        // SDA拉低 发出起始信号
    SCL = 0;        // SCL拉低 开始传输
}

static void IIC_STOP(void)
{
    
    
    SCL = 0;        // SCL拉低 防止可能出现的各种误动作
    SDA = 0;        // SDA拉低
    SCL = 1;        // SCL拉高 准备发出结束信号
    SDA = 1;        // SDA拉高 发出结束信号
}

static void IIC_Write(u8 dat)
{
    
    
    u8 i;
    for(i=0; i<8; i++)
    {
    
    
        SCL = 0;             // 拉低SCL 准备写数据
        SDA = dat & 0X80;    // 写数据
        dat <<= 1;            // 数据格式:高位在前
        SCL = 1;            // 拉高SCL 发送数据
        SCL = 0;            // 拉低SCL 结束发送
    }
    // 快速跳过ACK
    SCL = 1;        // SCL拉高告诉从机响应
    SCL = 0;        // SCL拉低结束询问ACK
}

//---------------------------------------------------------------------------------//
//------------------------------------定义结束-------------------------------------//
//---------------------------------------------------------------------------------//

//---------------------------------------------------------------------------------//
//------------------------------------定义结束-------------------------------------//
//---------------------------------------------------------------------------------//

  结 ※


  文基于 STC32F 单片机测试了 I2C 总结接口的 OLED模块, 改写了相应的程序, 位置后的应用奠定基础。

GM1688719031_1280_800.MPG|_-2

  测试OLED液晶模块

/*
**==============================================================================
** OLED1306.C:             -- by Dr. ZhuoQing, 2023-07-07
**
**==============================================================================
*/

//------------------------------------------------------------------------------

//------------------------------------------------------------------------------

void OLED1306Init(void) {
    
    
    OLED_Init();
    OLED_BufferSet(0x0);    
    OLED_Frame(g_ucOLEDBuffer);    
}

void OLED_BufferSet(u8 byt) {
    
    
    u8 i, j;
    for(i = 0; i < 8; i ++) {
    
    
        for(j = 0; j < 128; j ++)
            g_ucOLEDBuffer[i][j] = byt;
    }
}    

void OLED1306_Show(void) {
    
    
    OLED_Frame(g_ucOLEDBuffer);
}

//------------------------------------------------------------------------------
void OLED_WriteCMD(u8 cmd) {
    
    

    IIC_START();           // 通信开始
    IIC_Write(0X78);       // 写从机地址'0111 100' 读写符号'0'
    IIC_Write(0X00);       // 写命令  Co='0' C/D='000 0000'
    IIC_Write(cmd);        // 写入命令
    IIC_STOP();            // 通信结束
}

void OLED_WriteDAT(u8 dat) {
    
    

    IIC_START();           // 通信开始
    IIC_Write(0X78    );       // 写从机地址'0111 100' 读写符号'0'
    IIC_Write(0X40);       // 写数据  Co='0' C/D='100 0000'
    IIC_Write(dat);        // 写入数据
    IIC_STOP();            // 通信结束
}

//------------------------------------------------------------------------------
// 参数说明: cmd: 0X00,写命令  0X40,写数据
void OLED_WriteMultiByte(u8 *dat, u8 len, u8 cmd) {
    
    

    u8 i;
    IIC_START();           // 通信开始
    IIC_Write(0X78);       // 写从机地址'0111 100' 读写符号'0'
    IIC_Write(cmd);        // 根据参数选择写命令还是数据
    for(i=0; i<len; i++)
        IIC_Write(dat[i]);
    //通信结束
    IIC_STOP();
}

//------------------------------------------------------------------------------
const unsigned char OLEDInitCmd[] = {
    
    
    0xae,0X00,0X10,0x40,0X81,0XCF,0xff,0xa1,0xa4,
    0xA6,0xc8,0xa8,0x3F,0xd5,0x80,0xd3,0x00,0XDA,0X12,
    0x8d,0x14,0xdb,0x40,0X20,0X02,0xd9,0xf1,0xAF,
};

void OLED_Init(void) {
    
    

    u8 i, length;
    
    length = sizeof(OLEDInitCmd);       
    IIC_START();
    IIC_Write(0X78);       // 写从机地址'0111 100' 读写符号'0'
    IIC_Write(0X00);       // 写命令  Co='0' C/D='000 0000'
    for(i = 0; i < length; i ++) {
    
    
        IIC_Write(OLEDInitCmd[i]);
    }
    
    IIC_STOP();
}

//------------------------------------------------------------------------------
void OLED_Clear(void) {
    
    

    u8 i,j;

    // 地址设置
    IIC_START();        // 通信开始
    IIC_Write(0X78);    // 写从机地址'0111 100' 读写符号'0'
    IIC_Write(0x00);    // 写命令 Co='0' C/D='000 0000'
    IIC_Write(0X20);    // 设置GDDRAM模式
    IIC_Write(0X00);    // 水平寻址模式
    IIC_Write(0X21);    // 设置列起始和结束地址
    IIC_Write(0X00);    // 列起始地址 0
    IIC_Write(0X7F);    // 列终止地址 127
    IIC_Write(0X22);    // 设置页起始和结束地址
    IIC_Write(0X00);    // 页起始地址 0
    IIC_Write(0X07);    // 页终止地址 7           

    // 写入一帧'0'
    IIC_START();        // 通信重开始
    IIC_Write(0X78);    // 写从机地址'0111 100' 读写符号'0'
    IIC_Write(0X40);    // 写数据  Co='0' C/D='100 0000'
    for(i=0; i<8; i++){
    
    
        for(j=0; j<128; j++){
    
    
            IIC_Write(0X00);
        }
    }

    IIC_STOP();
}

//------------------------------------------------------------------------------
void OLED_Frame(u8 P[8][128]) {
    
    
    
    u8 i,j;

    // 地址设置
    IIC_START();        // 通信开始
    IIC_Write(0X78);    // 写从机地址'0111 100' 读写符号'0'
    IIC_Write(0x00);    // 写命令 Co='0' C/D='000 0000'
    IIC_Write(0X20);    // 设置GDDRAM模式
    IIC_Write(0X00);    // 水平寻址模式
    IIC_Write(0X21);    // 设置列起始和结束地址
    IIC_Write(0X00);    // 列起始地址 0
    IIC_Write(0X7F);    // 列终止地址 127
    IIC_Write(0X22);    // 设置页起始和结束地址
    IIC_Write(0X00);    // 页起始地址 0
    IIC_Write(0X07);    // 页终止地址 7

    // 写入一帧数据
    IIC_START();        // 通信重开始
    IIC_Write(0X78);    // 写从机地址'0111 100' 读写符号'0'
    IIC_Write(0X40);    // 写数据  Co='0' C/D='100 0000'
    for(i=0; i<8; i++) {
    
    
        for(j=0; j<128; j++) {
    
    
            IIC_Write(P[i][j]);                        
        }
    }

    // 结束IIC通信
    IIC_STOP();
}

//------------------------------------------------------------------------------
void OLED_Frame32(u8 P[4][128]) {
    
    

    u8 i,j;

    // 地址设置
    IIC_START();        // 通信开始
    IIC_Write(0X78);    // 写从机地址'0111 100' 读写符号'0'
    IIC_Write(0x00);    // 写命令 Co='0' C/D='000 0000'
    IIC_Write(0X20);    // 设置GDDRAM模式
    IIC_Write(0X00);    // 水平寻址模式
    IIC_Write(0X21);    // 设置列起始和结束地址
    IIC_Write(0X00);    // 列起始地址 0
    IIC_Write(0X7F);    // 列终止地址 127
    IIC_Write(0X22);    // 设置页起始和结束地址
    IIC_Write(0X00);    // 页起始地址 0
    IIC_Write(0X07);    // 页终止地址 7

    // 写入32行数据
    IIC_START();        // 通信重开始
    IIC_Write(0X78);    // 写从机地址'0111 100' 读写符号'0'
    IIC_Write(0X40);    // 写数据  Co='0' C/D='100 0000'
    for(i=0; i<4; i++)
        for(j=0; j<128; j++)
            IIC_Write(P[i][j]);
    // 结束IIC通信
    IIC_STOP();
}

//------------------------------------------------------------------------------
void OLED1306ShowF8X16(unsigned char ucX, unsigned char ucY, unsigned char ucID) {
    
    
    const unsigned char * p;
    unsigned char i;
    
    p = &F8X16[ucID*16];    
    
    for(i = 0; i < 8; i ++) {
    
    
        if(i + ucX >= OLED1306_WIDTH) break;
        g_ucOLEDBuffer[ucY][i+ucX] = *(p + i);
    }
    for(i = 0; i < 8; i ++) {
    
    
        g_ucOLEDBuffer[ucY+1][i+ucX] = *(p + i + 8);
    }
}

void OLED1306ShowF6X8(unsigned char ucX, unsigned char ucY, unsigned char ucID) {
    
    
    const unsigned char * p;
    unsigned char i;
    
    p = (const unsigned char *)&F6x8[ucID];    
    
    for(i = 0; i < 6; i ++) {
    
    
        if(i + ucX >= OLED1306_WIDTH) break;
        g_ucOLEDBuffer[ucY][i+ucX] = *(p + i);
    }
    
}

//------------------------------------------------------------------------------
void OLED1306_GReset(void) {
    
    
    unsigned char i, j;
    for(i = 0; i < 128; i ++) {
    
    
        for(j = 0; j < 8; j ++)
            g_ucOLEDBuffer[j][i] = 0x0;
    }
}

void OLED1306_GSet(void) {
    
    
    unsigned char i, j;
    for(i = 0; i < 128; i ++) {
    
    
        for(j = 0; j < 8; j ++)
            g_ucOLEDBuffer[j][i] = 0xff;
    }
    
}

void OLED1306_GSetP(unsigned char x, unsigned char y) {
    
    
    if(x > OLED1306_WIDTH-1 || y > OLED1306_HEIGHT-1) return;
    g_ucOLEDBuffer[y/8][x] |= (0x01 <<(y%8));
}

void OLED1306_GResetP(unsigned char x, unsigned char y) {
    
    
    if(x > OLED1306_WIDTH-1 || y > OLED1306_HEIGHT-1) return;
    g_ucOLEDBuffer[y/8][x] &= ~(0x01<<(y%8));
}

unsigned char OLED1306_GGetP(unsigned char x, unsigned char y) {
    
    
    if(x > OLED1306_WIDTH-1 || y > OLED1306_HEIGHT-1) return 0x0;
    return (g_ucOLEDBuffer[y/8][x] >> (y%8)) & 0x01;
}

void OLED1306_GSetByte(unsigned char sdata, unsigned char page, unsigned char column) {
    
    
    if(page > 7 || column > 127) return;
    g_ucOLEDBuffer[page][column] = sdata;
}

void OLED1306_GFlipPart(unsigned char x,unsigned char y,
                       unsigned char width,unsigned char height) {
    
    
    unsigned char i,j;

    for(i = x; i < x+width; i++){
    
    
        for(j = y; j < y+height;j++){
    
    
            if(OLED1306_GGetP(i,j)){
    
    
                OLED1306_GResetP(i,j);
            } else{
    
    
                OLED1306_GSetP(i,j);
            }
        }
    }
}

void OLED1306_GModifyPart(unsigned char x1,unsigned char y1,
                         unsigned char x2,unsigned char y2,
                         unsigned char color) {
    
    
    unsigned char i,j;

    for(i = x1;i < x2; i ++) {
    
    
        for(j = y1;j < y2; j++) {
    
    
            if(color)
                OLED1306_GSetP(i,j);
            else OLED1306_GResetP(i,j);
        }
    }
}

void OLED1306_GDrawBitmap(unsigned char x,unsigned char y, const unsigned char *dat,
                         unsigned char width, unsigned char height) {
    
    
                          
    unsigned char i,j,offset,index,fast_fill;
    const unsigned char *p;
    
    offset = 0;
    index = 0;
    fast_fill = 0;
    p = dat;
    
    offset = y%8;
    if(offset == 0) fast_fill=1;
    offset = 0;
    
    for(i = x; i < x+width; i++){
    
    
        for(j = y;j < y+height; j++){
    
    
            if(fast_fill){
    
    
                OLED1306_GSetByte(*p,(u8)(j/8),i);
                j += 8;
                p ++;
            } else {
    
    
                if((*p>>offset)&0x01){
    
    
                    OLED1306_GSetP(i,j);
                }else{
    
    
                    OLED1306_GResetP(i,j);
                }
                offset++;
                if(offset%8==0){
    
     p++;offset=0;};
            }
        }
    }
}

void OLED1306_GDrawChar(unsigned char x,unsigned char y,const char dat,
                       unsigned char width,unsigned char height) {
    
    
                        
    unsigned char i,j,offset,index,fast_fill;
    const unsigned char *p;
    
    offset = 0;
    index = 0;
    fast_fill = 0;
    
    index=(int)dat;
    
    if(index>126||index<32) return;//不在可绘制列表内
    
//    p=&ascii[index-32][0];

    offset=y%8;
    if(offset==0)fast_fill=1;
    offset=0;
    
    for(i=x;i<x+width;i++){
    
    
        for(j=y;j<y+height;j++){
    
    
            if(fast_fill){
    
    
                OLED1306_GSetByte(*p,(u8)(j/8),i);
                j+=8;
                p++;
            }else{
    
    
                if((*p>>offset)&0x01){
    
    
                    OLED1306_GSetP(i,j);
                }else{
    
    
                    OLED1306_GResetP(i,j);
                }
                offset++;
                if(offset%8==0){
    
    p++;offset=0;};
            }
        }
    }
}

void OLED1306_GDrawString(unsigned char x,unsigned char y,const char *dat,
                         unsigned char width,unsigned char height) {
    
    
    unsigned char x_pos;
    
    x_pos = x;
    
    while(*dat!=0){
    
    
        if(*dat=='\n'){
    
     y+=height;dat++;x_pos=x;continue;}
        
        if(x_pos>OLED1306_WIDTH-1||y>OLED1306_HEIGHT-1){
    
    dat++;continue;}
        
        OLED1306_GDrawChar(x_pos,y,*dat,width,height);
        x_pos+=width;
        dat++;
    }
}

void OLED1306_GDrawL_V(unsigned char X_B,unsigned char Y_B,unsigned char height) {
    
    
    unsigned char Y;

    for(Y=Y_B;Y<Y_B+height;Y++) {
    
            
        OLED1306_GSetP(X_B,Y);
    }
}

void OLED1306_GDrawL_R(unsigned char X_B,unsigned char Y_B,unsigned char width) {
    
    
    unsigned char X;
    
    for(X=X_B;X<X_B+width;X++)
    {
    
    
        OLED1306_GSetP(X,Y_B);
    }
}

void OLED1306_GDrawHollowRect(unsigned char xpos,unsigned char ypos,
                             unsigned char iwidth,unsigned char iheight) {
    
    
    OLED1306_GDrawL_R(xpos,ypos,iwidth);
    OLED1306_GDrawL_R(xpos,(u8)(ypos+iheight-1),iwidth);
    
    OLED1306_GDrawL_V(xpos,ypos,iheight);
    OLED1306_GDrawL_V((u8)(xpos+iwidth-1),ypos,iheight);
}

void OLED1306_GDrawSolidRect(unsigned char xpos,unsigned char ypos,
                           unsigned char iwidth,unsigned char iheight) {
    
    
    unsigned char i,j;
    
    for(i=xpos;i<xpos+iwidth;i++){
    
    
        for(j=ypos;j<ypos+iheight;j++){
    
    
            OLED1306_GSetP(i,j);
        }
    }
}

void OLED1306_GDrawNetRect(unsigned char xpos,unsigned char ypos,
                          unsigned char iwidth, unsigned char iheight) {
    
    
    unsigned char i,j;

    for(i=xpos;i<xpos+iwidth;i++){
    
    
        for(j=ypos;j<ypos+iheight;j++){
    
    
            if(i%2==0||j%2==0)
                OLED1306_GResetP(i,j);
            else OLED1306_GSetP(i,j);
        }
    }
}

void OLED1306_GDrawRectdotO(unsigned char xpos,unsigned char ypos,
                           unsigned char iwidth,unsigned char iheight,
                           unsigned char density) {
    
    
    unsigned char i;

    for(i=xpos+2;i<xpos+iwidth-2;i+=density){
    
    
        OLED1306_GSetP(i, (u8)(ypos+2));
    }
        
    for(i=xpos+2;i<xpos+iwidth-2;i+=density){
    
    
        OLED1306_GSetP(i, (u8)(ypos+iheight-3));
    }
    
    for(i=ypos+2;i<ypos+iheight-2;i+=density){
    
    
        OLED1306_GSetP((u8)(xpos+2), i);
    }
    
    for(i=ypos+2;i<ypos+iheight-2;i+=density){
    
    
        OLED1306_GSetP((u8)(xpos+iwidth-3), i);
    }
    
    OLED1306_GDrawHollowRect(xpos,ypos,iwidth,iheight);   
}

void OLED1306_GDrawRectdotI(unsigned char xpos,unsigned char ypos,
                           unsigned char iwidth,unsigned char iheight,
                           unsigned char density)                            {
    
    
    unsigned char i;
    
    for(i=xpos;i<xpos+iwidth;i+=density){
    
    
        OLED1306_GSetP(i, ypos);
    }
    for(i=xpos;i<xpos+iwidth;i+=density){
    
    
        OLED1306_GSetP(i, (u8)(ypos+iheight-1));
    }
    for(i=ypos;i<ypos+iheight;i+=density){
    
    
        OLED1306_GSetP(xpos, i);
    }
    for(i=ypos;i<ypos+iheight;i+=density){
    
    
        OLED1306_GSetP((u8)(xpos+iwidth-1), i);
    }
    OLED1306_GDrawHollowRect((u8)(xpos+2),(u8)(ypos+2),(u8)(iwidth-4),(u8)(iheight-4));
}

//------------------------------------------------------------------------------
void OLED1306ShowString(unsigned char ucX, unsigned char ucY, unsigned char * pString) {
    
    
    while(*(pString)) {
    
    
        OLED1306ShowF8X16(ucX, ucY, (u8)(*(pString)-' '));
        pString ++;
        ucX += 8;        
    }    
}

void OLED1306ShowStringCo(unsigned char ucX, unsigned char ucY, const unsigned char * pString) {
    
    
    while(*(pString)) {
    
    
        OLED1306ShowF8X16(ucX, ucY, (u8)(*(pString)-' '));
        pString ++;
        ucX += 8;        
    }        
}

//==============================================================================
//                END OF FILE : OLED1306.C
//------------------------------------------------------------------------------
/*
**==============================================================================
** OLED1306.H:            -- by Dr. ZhuoQing, 2023-07-07
**
**  Description:
**
**==============================================================================
*/
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//==============================================================================
void OLED1306Init(void);

//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
typedef unsigned char u8;

//------------------------------------------------------------------------------
void OLED_WriteCMD(u8 cmd);
void OLED_WriteDAT(u8 dat);

void OLED_WriteMultiByte(u8 *dat, u8 len, u8 cmd);
void OLED_Init(void);
void OLED_Clear(void);
void OLED_Frame(u8 P[8][128]);
void OLED_Frame32(u8 P[4][128]);

//------------------------------------------------------------------------------
OLED1306_EXT u8 g_ucOLEDBuffer[8][128];

void OLED_BufferSet(u8 byt);
void OLED1306_Show(void);

//------------------------------------------------------------------------------
void OLED1306ShowF8X16(unsigned char ucX, unsigned char ucY, unsigned char ucID);
void OLED1306ShowF6X8(unsigned char ucX, unsigned char ucY, unsigned char ucID);

void OLED1306ShowString(unsigned char ucX, unsigned char ucY, unsigned char * pString);
void OLED1306ShowStringCo(unsigned char ucX, unsigned char ucY, const unsigned char * pString);

//------------------------------------------------------------------------------

void OLED1306_GReset(void);
void OLED1306_GSet(void);
void OLED1306_GSetP(unsigned char x, unsigned char y);
void OLED1306_GResetP(unsigned char x, unsigned char y);
unsigned char OLED1306_GGetP(unsigned char x, unsigned char y);
void OLED1306_GSetByte(unsigned char sdata, unsigned char page, unsigned char column);
void OLED1306_GFlipPart(unsigned char x,unsigned char y,
                       unsigned char width,unsigned char height);
void OLED1306_GModifyPart(unsigned char x1,unsigned char y1,
                         unsigned char x2,unsigned char y2,
                         unsigned char color);
void OLED1306_GDrawBitmap(unsigned char x,unsigned char y, const unsigned char *dat,
                         unsigned char width, unsigned char height);
void OLED1306_GDrawChar(unsigned char x,unsigned char y,const char dat,
                       unsigned char width,unsigned char height);
void OLED1306_GDrawString(unsigned char x,unsigned char y,const char *dat,
                         unsigned char width,unsigned char height);
void OLED1306_GDrawL_V(unsigned char X_B,unsigned char Y_B,unsigned char height);
void OLED1306_GDrawL_R(unsigned char X_B,unsigned char Y_B,unsigned char width);
void OLED1306_GDrawHollowRect(unsigned char xpos,unsigned char ypos,
                             unsigned char iwidth,unsigned char iheight);
void OLED1306_GDrawSolidRect(unsigned char xpos,unsigned char ypos,
                           unsigned char iwidth,unsigned char iheight);
void OLED1306_GDrawNetRect(unsigned char xpos,unsigned char ypos,
                          unsigned char iwidth, unsigned char iheight);
void OLED1306_GDrawRectdotO(unsigned char xpos,unsigned char ypos,
                           unsigned char iwidth,unsigned char iheight,
                           unsigned char density);
void OLED1306_GDrawRectdotI(unsigned char xpos,unsigned char ypos,
                           unsigned char iwidth,unsigned char iheight,
                           unsigned char density);
                           
//==============================================================================
//             END OF FILE : OLED1306.H
//------------------------------------------------------------------------------


■ 相关文献链接:

● 相关图表链接:

猜你喜欢

转载自blog.csdn.net/zhuoqingjoking97298/article/details/131492289