打印
[应用相关]

I2C接口的SSD1306---OLED驱动

[复制链接]
4075|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dentsgot|  楼主 | 2016-5-18 20:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*
    这个液晶只需要两根线用模拟或者硬件的I2C都可以 硬件设计非常简单
*/
#define I2C_SDA_LOW()   
#define I2C_SDA_HIGH()

#define I2C_SCL_LOW()
#define I2C_SCL_HIGH()

#defien I2C_SDA_Read()

#define
BIRGTHNESS             //OLED的亮度  00~255

#define OLED_WIDTH    128
#define OLED_HIGH    (8*8)

#define I2C_OLED    0x78

#define I2C_Delay()    //实现延时4us

/* 见名知意 移植的时候只需要把以上的宏的具体实现方法写上去 就可以了  下面的代码用的是普通IO口模拟I2C (速度还是可以的) 这个芯片 不用上拉电阻 好像也能行
*/  

static void I2C_Start(void)
{
    I2C_SDA_HIGH();
    I2C_SCL_HIGH();
    I2C_Delay();
    I2C_SDA_LOW();
    I2C_Delay();
    I2C_SCL_LOW();
    I2C_Delay();
}

static void I2C_Stop(void)
{
    I2C_SDA_LOW();
    I2C_SCL_HIGH();
    I2C_Delay();
    I2C_SDA_HIGH();
    I2C_Delay();
}

static uint8_t I2C_WaitAck(void)  //0:aCK     1:NoAck
{
    I2C_SDA_HIGH();
    I2C_SCL_HIGH();
    I2C_Delay();
    if(I2C_SDA_Read())
        return 1;
    I2C_SCL_LOW();
    I2C_Delay();
    return 0;
}

static void I2C_SendByte(uint8_t Byte)
{
    uint8_t Cnt;
    for(Cnt=0;Cnt<8;Cnt++)
    {
        if(Byte&0x80)
            I2C_SDA_HIGH();
        else
            I2C_SDA_LOW();
        I2C_SCL_HIGH();
        I2C_Delay();
        I2C_SCL_LOW();
        I2C_Delay();
    }
}

static uint8_t OLED_WriteCmd(uint8_t Cmd)
{
    I2C_Start();
    I2C_SendByte(I2C_OLED);
    if(I2C_WaitAck())
        return 1;
    I2C_SendByte(0x00);
    if(I2C_WaitAck())
        return 2;
    I2C_SendByte(Cmd);
    if(I2C_WaitAck())
        return 3;
    I2C_Stop();
    return 0;
}

评分
参与人数 1威望 +3 收起 理由
SD10A + 3 7.37MHZ 不需要延时
沙发
dentsgot|  楼主 | 2016-5-18 20:58 | 只看该作者
static uint8_t OLED_WriteData(uint8_t Data)
{
    I2C_Start();
    I2C_SendByte(I2C_OLED);
    if(I2C_WaitAck())
        return 1;
    I2C_SendByte(0x40);
    if(I2C_WaitAck())
        return 2;
    I2C_SendByte(Data);
    if(I2C_WaitAck())
        return 3;
    I2C_Stop();
    return 0;
}

static uint8_t OLED_SetXY(uint8_t x,uint8_t y)
{
    OLED_WriteCmd(0xb0|y);//y
    OLED_WriteCmd(((0xf0&x)>>4))|0x10);//设置x高4位
    OLED_WriteCmd(((0x0f&x)>>4))|0x01);//设置x低4位
}

uint8_t OLED_Clear(void)
{
    uint8_t x,y;
    OLED_SetXY(0,0);
    for(y=0;y<OLED_HIGH/8;y++)
    {
        if(OLED_SetXY(0,y))
            return 1;
        for(x=0;x<OLED_WIDTH;x++)
        {
            if(OLED_WriteData(0x00))
                return 2;
        }
    }
    return 0;
}

uint8_t OLED_Init(void)
{
   // 延时一下 再初始化 OLED_Delay(100000);    if(OLED_WriteCmd(0xae))
        return 1;//--turn off oled panel
    if(OLED_WriteCmd(0x00))
          return 2;//---set low column address
    if(OLED_WriteCmd(0x10))
        return 3;//---set high column address
    if(OLED_WriteCmd(0x40))
        return 4;//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
    if(OLED_WriteCmd(0x81))
        return 5;//--set contrast control register
    if(OLED_WriteCmd(Brightness))
        return 6; // Set SEG Output Current Brightness
    if(OLED_WriteCmd(0xa1))
        return 7;//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
    if(OLED_WriteCmd(0xc8))
        return 8;//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
    if(OLED_WriteCmd(0xa6))
        return 9;//--set normal display
    if(OLED_WriteCmd(0xa8))
        return 10;//--set multiplex ratio(1 to 64)
    if(OLED_WriteCmd(0x3f))
                return 11;//--1/64 duty
    if(OLED_WriteCmd(0xd3))
        return 12;//-set display offset        Shift Mapping RAM Counter (0x00~0x3F)
    if(OLED_WriteCmd(0x00))
        return 13;//-not offset
    if(OLED_WriteCmd(0xd5))
        return 14;//--set display clock divide ratio/oscillator frequency
    if(OLED_WriteCmd(0x80))
        return 15;//--set divide ratio, Set Clock as 100 Frames/Sec
    if(OLED_WriteCmd(0xd9))
        return 16;//--set pre-charge period
    if(OLED_WriteCmd(0xf1))
        return 17;//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
    if(OLED_WriteCmd(0xda))
        return 18;//--set com pins hardware configuration
    if(OLED_WriteCmd(0x12))
        return 19;
    if(OLED_WriteCmd(0xdb))
        return 20;//--set vcomh
    if(OLED_WriteCmd(0x40))
        return 21;//Set VCOM Deselect Level
    if(OLED_WriteCmd(0x20))
        return 22;//-Set Page Addressing Mode (0x00/0x01/0x02)
    if(OLED_WriteCmd(0x02))
        return 23;//
    if(OLED_WriteCmd(0x8d))
        return 24;//--set Charge Pump enable/disable
    if(OLED_WriteCmd(0x14))
        return 25;//--set(0x10) disable
    if(OLED_WriteCmd(0xa4))
        return 26;// Disable Entire Display On (0xa4/0xa5)
    if(OLED_WriteCmd(0xa6))
        return 27;// Disable Inverse Display On (0xa6/a7)
    if(OLED_WriteCmd(0xaf))
        return 28;//--turn on oled panel
    if(OLED_Clear(0x00))
        return 29; //初始清屏
    if(OLED_SetXY(0,0))
        return 30;
    return 0;
}




使用特权

评论回复
板凳
yiyigirl2014| | 2016-5-18 23:33 | 只看该作者
哪个液晶?说一下型号啊,OLED的型号很多的。

使用特权

评论回复
地板
baoanlcm| | 2016-5-19 14:39 | 只看该作者
可能是12864的

使用特权

评论回复
5
qgmfly| | 2016-10-19 17:02 | 只看该作者
楼主能打包分享一下吗?

使用特权

评论回复
6
aaronhu| | 2017-6-22 12:50 | 只看该作者
many thanks! code for reference!

使用特权

评论回复
7
SD10A| | 2017-11-2 20:59 | 只看该作者

我想问问LZ  横排显示 是哪个指令  我做的变成纵排的了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

164

帖子

2

粉丝