找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 21688|回复: 1
收起左侧

I2C接口的SSD1306---OLED驱动

[复制链接]
ID:75926 发表于 2015-4-10 16:58 | 显示全部楼层 |阅读模式
/*
    这个液晶只需要两根线用模拟或者硬件的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;
}

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;
}





回复

使用道具 举报

ID:119067 发表于 2016-5-8 16:46 | 显示全部楼层
您好,我想用stc12c5a32s2写一个时钟程序在IIC-oled12864上显示,但是不知道时钟数据怎样在oled上显示
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表