dustless 发表于 2011-4-23 08:49:59

SSD1306 OLED显示器使用I2C 有对应的库吗?

SSD1306 OLED显示器使用I2C 有对应的库吗?

ohha3026 发表于 2012-9-24 12:23:00

#ifndef_SH1101A_H_
#define_SH1101A_H_
#include        <util/delay.h>
//#include        <zimo.h>

#define PAR           //定义为并行模式,如不是,注释掉即可,并请一定注意把模块上的跳线改到S,否则可能烧坏IO!!

#define SET_BIT(PORT,BIT)        PORT|=(1<<BIT)
#define        CLR_BIT(PORT,BIT)        PORT&=~(1<<BIT)

#define CON_PORT        PORTB
#define        DATA_PORT        PORTD

#define PS_mode        PB3
#define serial_mode        CLR_BIT(CON_PORT,PS_mode)
#define par_mode        SET_BIT(CON_PORT,PS_mode)

//以下为接口定义,用户根据自己的板子自行定义
#ifdef        PAR
        #define        R_D        PB6
        #define        W_R        PB7
        #define        DC        PB4
        #define        RST        PB5
        #define        CS        PB2
       
        #define        RD_high                SET_BIT(CON_PORT,R_D)
        #define        RD_low                CLR_BIT(CON_PORT,R_D)
        #define        WR_high                SET_BIT(CON_PORT,W_R)
        #define        WR_low                CLR_BIT(CON_PORT,W_R)
        #define        DC_high                SET_BIT(CON_PORT,DC)
        #define        DC_low                CLR_BIT(CON_PORT,DC)
        #define        RST_high        SET_BIT(CON_PORT,RST)
        #define        RST_low                CLR_BIT(CON_PORT,RST)
        #define        CS_high                SET_BIT(CON_PORT,CS)
        #define        CS_low                CLR_BIT(CON_PORT,CS)
#else
        #define        CLK                PD0
        #define DATA        PD1
        #define        DC                PB5
        #define        RST                PB4
        #define        CS                PB2
       
        #define CLK_high        SET_BIT(DATA_PORT,CLK)
        #define CLK_low                CLR_BIT(DATA_PORT,CLK)
        #define        DATA_high        SET_BIT(DATA_PORT,DATA)
        #define        DATA_low        CLR_BIT(DATA_PORT,DATA)
        #define        DC_high                SET_BIT(CON_PORT,DC)
        #define        DC_low                CLR_BIT(CON_PORT,DC)
        #define        RST_high        SET_BIT(CON_PORT,RST)
        #define        RST_low                CLR_BIT(CON_PORT,RST)
        #define        CS_high                SET_BIT(CON_PORT,CS)
        #define        CS_low                CLR_BIT(CON_PORT,CS)
#endif

//****************************主要操作函数************************************
void WriteCommand(unsigned com);                //写命令程序
void WriteData(unsigned dat);                        //写数据程序
void esbusini(void);                                        //初始化总线程序
void ini_oled(void);                            //OLED初始化
void ini_dis(void);                                        //显示初始化(清除缓冲区)
void tu(unsigned char X,unsigned char Y,unsigned char * t);
/**************************实现函数********************************************
*函数原型:                WriteCommand(unsigned com);
*功  能:                写指令到OLED显示屏。
*******************************************************************************/
void WriteCommand(unsigned com)
{
//        unsigned char temp;
        #ifdef        PAR
                CS_high;
                DC_low;
                WR_low;       
                RD_high;
                CS_low;
        //        temp=((com&0x55)<<1)|((com&0xaa)>>1);
                DATA_PORT=com;
                CS_high;
        #else
                unsigned char i;
                CS_high;
                DC_low;
                CS_low;
                for(i=0;i<8;i++)
                        {
                                CLK_low;
                                if(com&0x80)
                                        DATA_high;
                                else
                                        DATA_low;
                                com<<=1;
                                CLK_high;
                        }
                CS_high;
        #endif
}
/**************************实现函数********************************************
*函数原型:                void WriteData(unsigned dat);
*功  能:                写数据到oled显示屏。
*******************************************************************************/
void WriteData(unsigned dat)
{
        unsigned char temp;
        #ifdef PAR
                CS_high;
                DC_high;       
                WR_low;
                RD_high;
                CS_low;
                //temp=((dat&0x55)<<1)|((dat&0xaa)>>1);zhushidiaole

                DATA_PORT=dat;
                CS_high;
        #else
                unsigned char i;
                CS_high;
                DC_high;
                CS_low;
                for(i=0;i<8;i++)
                        {
                                CLK_low;
                                if(dat&0x80)
                                        DATA_high;
                                else
                                        DATA_low;
                                dat<<=1;
                                CLK_high;
                        }
                CS_high;
        #endif
}
/**************************实现函数********************************************
*函数原型:                void esbusini(void);
*功  能:                总线初始化。
*******************************************************************************/
void esbusini(void)
{
        RST_high;
        _delay_ms(1);
        RST_low;
        _delay_ms(1);
        RST_high;
}
/**************************实现函数********************************************
*函数原型:                void ini_dis(void);
*功  能:                显示初始化。
*******************************************************************************/
void ini_dis(void)
{
        unsigned char i,j;
        for(i=0;i<8;i++)
        {
                WriteCommand (0xb0+i);    //设置显示位置—行
                WriteCommand (0x02);      //设置显示位置—列低地址
                WriteCommand (0x10);      //设置显示位置—列高地址
                for(j=0;j<128;j++)
                        WriteData(0x00);      //屏幕显示,全亮
        }       
        WriteCommand(0xaf);
}
/**************************实现函数********************************************
*函数原型:                void ini_oled(void);
*功  能:                oled显示的准备工作。
*******************************************************************************/
void ini_oled(void)
{
        esbusini();
        /*************************************************
        // SSD1303 Initialization Command
        *************************************************/
        // Lower Column Address
        WriteCommand(0x00); /* Set Lower Column Address */
        // High Column Address
        WriteCommand(0x10); /* Set Higher Column Address*/
        // Display Start Line
        WriteCommand(0x40); /* Set Display Start Line */
        // Contrast Control Register
        WriteCommand(0x81); /* Set Contrast Control */
        WriteCommand(0xff); /* 0 ~ 255 */
        // Re-map
        WriteCommand(0xA1); /* :column address 0 is map to SEG0 , : columnaddress 131 is map to SEG0*/
        // Entire Display ON/OFF
        WriteCommand(0xA4); /* A4=ON */
        // Normal or Inverse Display
        WriteCommand(0XA6); /* Normal Display*/
        // Multiplex Ratio
        WriteCommand(0xA8); /* Set Multiplex Ratio */
        WriteCommand(0x3f); /* Set to 36 Mux*/
        // Set DC-DC
        WriteCommand(0x8D); /* Set DC-DC */
        WriteCommand(0x14); /* 0x14=ON */
        // Display ON/OFF
        WriteCommand(0xAE); /* AF=ON , AE=OFF*/
        // Display Offset
        WriteCommand(0xD3); /* Set Display Offset */
        WriteCommand(0x00); /* No offset */
        // Display Clock Divide
        WriteCommand(0xD5); /* Set Clock Divide */
        WriteCommand(0x20); /* Set to 80Hz */
        // Area Color Mode
        WriteCommand(0xD8); /* Set Area Color On or Off*/
        WriteCommand(0x00); /* Mono Mode */
        // COM Pins Hardware Configuration
        WriteCommand(0xDA); /* Set Pins HardwareConfiguration */
        WriteCommand(0x12);
        // VCOMH
        WriteCommand(0xDB); /* Set VCOMH */
        WriteCommand(0x00);
        // VP
        WriteCommand(0xD9); /* Set VP */
        WriteCommand(0x22); /* P1=2 , P2=2 */
        WriteCommand(0xc0);//配置成标准应用
        ini_dis();
}
/*******************************function************************************************************/
//*******************显示X,Y坐标处的一个字符。一行可以显示16个字符。X为0到15,Y为0到3**************
void disc(unsigned char X,unsigned char Y,unsigned char * c)
{
        unsigned char n;
        WriteCommand (0xb7-(Y<<1));
        if(X%2)
                WriteCommand (0x08);//偏移3列
        else
                WriteCommand (0x00);
        WriteCommand (0x10+(X>>1));
        for(n=0;n<16;n+=2)
                WriteData(*(c+n));

        WriteCommand (0xb7-(Y<<1)-1);
        if(X%2)
                WriteCommand (0x08);
        else
                WriteCommand (0x00);
        WriteCommand (0x10+(X>>1));
        for(n=1;n<16;n+=2)
                WriteData(*(c+n));
}
void dish(unsigned char X,unsigned char Y,unsigned char * h)
{
        unsigned char n;
        WriteCommand (0xb7-(Y<<1));
        if(X%2)
                WriteCommand (0x08);
        else
                WriteCommand (0x00);
        WriteCommand (0x10+(X>>1));
        for(n=0;n<32;n+=2)
                WriteData(*(h+n));

        WriteCommand (0xb7-(Y<<1)-1);
        if(X%2)
                WriteCommand (0x08);
        else
                WriteCommand (0x00);
        WriteCommand (0x10+(X>>1));
        for(n=1;n<32;n+=2)
                WriteData(*(h+n));
}
void tu(unsigned char X,unsigned char Y,unsigned char * t)
{       
        unsigned char m,n;
        WriteCommand (0xb7-(Y<<1));
        if(X%2)
                WriteCommand (0x08);
        else
                WriteCommand (0x00);
        WriteCommand (0x10+(X>>1));
        for(n=0;n<128;n+=1,m+=1)
                WriteData(*(t+n));

        WriteCommand (0xb7-(Y<<1)-1);
        if(X%2)
                WriteCommand (0x08);
        else
                WriteCommand (0x00);
        WriteCommand (0x10+(X>>1));
        for(n=0;n<128;n+=1)
                WriteData(*(t+n+128));
        WriteCommand (0xb7-(Y<<1)-1);
        if(X%2)
                WriteCommand (0x08);
        else
                WriteCommand (0x00);
        WriteCommand (0x10+(X>>1));
        for(n=0;n<128;n+=1)
                WriteData(*(t+n+256));
WriteCommand (0xb7-(Y<<1)-1);
        if(X%2)
                WriteCommand (0x08);
        else
                WriteCommand (0x00);
        WriteCommand (0x10+(X>>1));
        for(n=0;n<128;n+=1)
                WriteData(*(t+n+384));

WriteCommand (0xb7-(Y<<1)-1);
        if(X%2)
                WriteCommand (0x08);
        else
                WriteCommand (0x00);
        WriteCommand (0x10+(X>>1));
        for(n=0;n<128;n+=1)
                WriteData(*(t+n+512));
}
#endif

ohha3026 发表于 2012-9-24 12:23:35

8080并口模式

madswan 发表于 2013-4-8 14:21:28

ohha3026 发表于 2012-9-24 12:23 static/image/common/back.gif
#ifndef_SH1101A_H_
#define_SH1101A_H_
#include       


请问,这个能够直接用在C51上吗?

ohha3026 发表于 2013-4-11 00:49:27

单这条语句可以 整体程序不行

xiay123 发表于 2014-10-6 10:20:58

mark,mark1
页: [1]
查看完整版本: SSD1306 OLED显示器使用I2C 有对应的库吗?