This is a sample program to use an IS color switch from NKK. It reads a file from SD card and send to the switch. Supported file format is the one that is used by a NKK\'s editor for IS series switches. Part of this program is derived from a sample program for PIC micro cotnroller written by NKK.

Dependencies:   mbed SDFileSystem

main.cpp

Committer:
non
Date:
2011-01-30
Revision:
0:290c094a8d94

File content as of revision 0:290c094a8d94:

/*
    Sample program to use IS color switch from NKK.
    Part of this program is derived from a sample program for PIC
    micro cotnroller written by NKK.
*/
#include "mbed.h"
#include "SDFileSystem.h"

SDFileSystem sd(p5, p6, p7, p8, "sd");
SPI spi(p11, p12, p13); // mosi(SDO), miso(SDI), sclk(SCLK)
DigitalOut is_cs(p21);
DigitalOut is_reset(p22);
DigitalOut is_dc(p23);
DigitalOut is_vcc(p24);
DigitalOut led1(LED1);

void    OledAdrInit( int DevType );
void    OledDspMode( int DspMode );
void    OledInit( void );
void    OledSendCommand( const unsigned char *com );
void    OledSendData( const unsigned char *dat, int len );

const int DAT = 1;
const int CMD = 0;
int DevType = 1; // 0:ISC01, 1:ISC15
int DspMode = 1; // 0:256, 1:64k colors

unsigned char dat[64*48*2];
const unsigned char cls[64*48*2] = {0};

int main() {
    // Setup the spi for 8 bit data, high steady state clock,
    // second edge capture, with a 4MHz clock rate
    spi.format(8, 3);
    spi.frequency(4000000);

    OledInit();

#if 1
    for (;;) {
        DIR *d;
        struct dirent *p;
        d = opendir("/sd");
        if (d != NULL) {
            while ((p = readdir(d)) != NULL) {
                char fname[20];
                sprintf(fname, "/sd/%s", p->d_name);
                FILE *fp = fopen(fname, "rb");
                if (fp == NULL) {
                    // error("Could not open file for read\n");
                } else {
                    fread(dat, 1, 8, fp); // skip header
                    fread(dat, 1, sizeof(dat), fp);
                    fclose(fp);
                    OledAdrInit(DevType);
                    OledDspMode(DspMode);
                    OledSendData(dat, 64*48*2);
                }
            }
            closedir(d);
        }
    }
#else
    for (int i=0; i<64*48; i ++) {
        dat[i*2] = (i & 0xff00) >> 8;
        dat[i*2 + 1] = i & 0xff;
    }
    OledAdrInit(DevType);
    OledDspMode(DspMode);
    OledSendData(dat, 64*48*2);

    for (;;) {
        OledAdrInit(DevType);
        OledDspMode(DspMode);
        OledSendData(dat, 64*48*2);
        led1 = 0;
        wait (0.5);
        OledAdrInit(DevType);
        OledDspMode(DspMode);
        OledSendData(cls, 64*48*2);
        led1 = 1;
        wait (0.5);
    }
#endif
}

//    OLED's initial setup commands (IS15)
const    unsigned char    SetupColumnAddress[]        =    {    0x03,    0x15,    0x10,    0x4f    };
const    unsigned char    SetupRowaddress[]            =    {    0x03,    0x75,    0x00,    0x2f    };
const    unsigned char    SetContrastColorA[]         =    {    0x02,    0x81,    0x19    };
const    unsigned char    SetContrastColorB[]         =    {    0x02,    0x82,    0x14    };
const    unsigned char    SetContrastColorC[]         =    {    0x02,    0x83,    0x24    };
const    unsigned char    MasterCurrentControl[]        =    {    0x02,    0x87,    0x0f    };
const    unsigned char    RemapColorDepth[]            =    {    0x02,    0xa0,    0x70    };
const    unsigned char    SetDisplayStartLine[]        =    {    0x02,    0xa1,    0x00    };
const    unsigned char    SetDisplayOffset[]            =    {    0x02,    0xa2,    0x10    };
const    unsigned char    SetDisplayMode[]            =    {    0x01,    0xa4    };
const    unsigned char    SetMultiplexRatio[]            =    {    0x02,    0xa8,    0x2f    };
const    unsigned char    DimModeSetting[]            =    {    0x05,    0xab,    0x12,    0x0c,    0x14,    0x12    };
const    unsigned char    SetDisplayDim[]                =    {    0x01,    0xac    };
const    unsigned char    SetDisplayOff[]                =    {    0x01,    0xae    };
const    unsigned char    SetDisplayNormal[]            =    {    0x01,    0xaf    };
const    unsigned char    SetMasterConfiguration[]    =    {    0x02,    0xad,    0x8e    };
const    unsigned char    PhasePeriodAdjustment[]        =    {    0x02,    0xb1,    0x44    };
const    unsigned char    DisplayClockDivider[]        =    {    0x02,    0xb3,    0xa0    };
const    unsigned char    EnableLinearGrayScale[]        =    {    0x01,    0xb9    };
const    unsigned char    SetPrechargeLevel[]            =    {    0x02,    0xbb,    0x12    };
const    unsigned char    SetVcomh[]                    =    {    0x03,    0xbe,    0x28    };

const    unsigned char    ColorDepth64k[]                =    {    0x02,    0xa0,    0x70    };
const    unsigned char    ColorDepth256[]                =    {    0x02,    0xa0,    0x30    };

//    OLED's initial setup commands (for display only type (IS01) )
const    unsigned char    SetupColumnAddress_d[]        =    {    0x03,    0x15,    0x16,    0x49    }; //display
const    unsigned char    SetupRowaddress_d[]            =    {    0x03,    0x75,    0x00,    0x23    }; //display
const    unsigned char    SetContrastColorA_d[]         =    {    0x02,    0x81,    0x0f    }; //display
const    unsigned char    SetContrastColorB_d[]         =    {    0x02,    0x82,    0x0e    }; //display
const    unsigned char    SetContrastColorC_d[]         =    {    0x02,    0x83,    0x1b    }; //display
const    unsigned char    SetDisplayOffset_d[]            =    {    0x02,    0xa2,    0x1c    }; //display
const    unsigned char    SetMultiplexRatio_d[]            =    {    0x02,    0xa8,    0x23    }; //display
const    unsigned char    DimModeSetting_d[]            =    {    0x05,    0xab,    0x0b,    0x08,    0x0f,    0x12    }; //display
const    unsigned char    DisplayClockDivider_d[]        =    {    0x02,    0xb3,    0x30    }; //display
const    unsigned char    SetVcomh_d[]                    =    {    0x03,    0xbe,    0x21    }; //display
//
//        Change OLED's address setting
//
void    OledAdrInit( int DevType )    {
    if (DevType) {
        OledSendCommand( SetupColumnAddress );
        OledSendCommand( SetupRowaddress );
    } else {
        OledSendCommand( SetupColumnAddress_d );
        OledSendCommand( SetupRowaddress_d );
    }
}

//
//        Change OLED's color depth setting (64K or 256 colors)
//
void    OledDspMode( int DspMode )    {
    if ( DspMode )    {
        OledSendCommand( ColorDepth64k );
    } else    {
        OledSendCommand( ColorDepth256 );
    }
}

//
//        initial settings of OLED
//
void    OledInit( void )    {
    volatile unsigned char    delay = 0x20;

    //    reset OLED
    is_vcc = 0;
    is_reset = 0;
    wait_us(3);
    is_reset = 1;
    is_vcc = 1;

    //    initial settings
    OledAdrInit(DevType);

    if (DevType) {
        OledSendCommand( SetContrastColorA );
        OledSendCommand( SetContrastColorB );
        OledSendCommand( SetContrastColorC );
        OledSendCommand( MasterCurrentControl );
        OledSendCommand( SetDisplayStartLine );
        OledSendCommand( SetDisplayOffset );
        OledSendCommand( SetDisplayMode );
        OledSendCommand( SetMultiplexRatio );
        OledSendCommand( DimModeSetting );
        OledSendCommand( SetMasterConfiguration );
        OledSendCommand( PhasePeriodAdjustment );
        OledSendCommand( DisplayClockDivider );
        OledSendCommand( EnableLinearGrayScale );
        OledSendCommand( SetPrechargeLevel );
        OledSendCommand( SetVcomh );
    } else {
        OledSendCommand( SetContrastColorA_d );
        OledSendCommand( SetContrastColorB_d );
        OledSendCommand( SetContrastColorC_d );
        OledSendCommand( MasterCurrentControl );
        OledSendCommand( SetDisplayStartLine );
        OledSendCommand( SetDisplayOffset_d );
        OledSendCommand( SetDisplayMode );
        OledSendCommand( SetMultiplexRatio_d );
        OledSendCommand( DimModeSetting_d );
        OledSendCommand( SetMasterConfiguration );
        OledSendCommand( PhasePeriodAdjustment );
        OledSendCommand( DisplayClockDivider_d );
        OledSendCommand( EnableLinearGrayScale );
        OledSendCommand( SetPrechargeLevel );
        OledSendCommand( SetVcomh_d );
    }

    //    display mode settings
    OledDspMode(DspMode);

    OledSendCommand( SetDisplayNormal );
}

//
//      Send a command / data to OLED via SPI
//
void    OledSend( const unsigned char *p, int len )    {
    for (; len>0; len --, p ++) {
        is_cs = 0;
        spi.write(*p);
        is_cs = 1;
    }
}

//
//        Send a command to OLED
//
void    OledSendCommand( const unsigned char *com )    {
    is_dc = CMD;
    OledSend(com+1, *com);
}

//
//        Send data to OLED
//
void    OledSendData( const unsigned char *dat, int len )    {
    is_dc = DAT;
    OledSend(dat, len);
}