NHD-0216KZW-AG5 - serial interface - initialization

Comments

1 comment

  • Saurabh_B

    Hello,
    You can find an example on how to use the Serial OLED below:

    sbit SCL = P3^4;
    sbit SDOUT = P1^0;
    sbit SDIN = P1^1;
    sbit C_S = P3^3;

    void delay(unsigned int n) //Delay subroutine
    {
    unsigned int i,j;
    for (i=0;i<n;i++)
       for (j=0;j<250;j++)
       {;}
    }
     

    void WriteCommand(unsigned char ins)
    {
    unsigned char i;
    C_S=0;
    SCL = 0;
    SDOUT = 0;  //RS = 0 (Command)
    SCL = 1; //RS registered
    SCL = 0;
    SDOUT = 0;  //RW = 0
    SCL = 1; //RW registered
    SCL = 0;

    for (i=0x80;i;i>>=1)
    {
    if((ins&0x80)==0x80)
    SDOUT = 1;
    else
    SDOUT = 0;
    ins=(ins<<1);
    SCL = 0;
    SCL = 1;
    SCL = 0;
    }

        C_S=1;
    }

    void WriteDataInit()
    {

    C_S=0;
    SCL = 0;
    SDOUT = 1; //RS = 1 (Data)
    SCL = 0; //RS registered
    SCL = 1;
    SCL = 0;
    SDOUT = 0;  //RW = 0
    SCL = 1; //RS registered
    SCL = 0;

    }
    void WriteData(unsigned char dat)
    {
    unsigned char i;
    for (i=0x80;i;i>>=1)
    {
    if((dat&0x80)==0x80)
    SDOUT = 1;
    else
    SDOUT = 0;
    dat=(dat<<1);
    SCL = 0;
    SCL = 1;
    SCL = 0;
    }

    }

    void init()
    {
    WriteCommand(0x38);//function set
    delay(30);
    WriteCommand(0x06);//entry mode set
    delay(30);
    WriteCommand(0x02);//return home
    delay(30);
    WriteCommand(0x01);//clear display
    delay(30);
    WriteCommand(0x0c);//display on
    delay(30);
    WriteCommand(0x80);//line 1 character 1
    delay(30);
    }

    void main()
    {
    char i=0x21, j;



    init();

    while(1)
    {
    C_S = 1;
    WriteCommand(0x80); //Line 1

    WriteDataInit();
    //WriteDataInit() must only be executed once before starting to write data
    //if WriteDataInit() is executed between writes, the display will recognize the two bits as data bits and not RS/RW bits. 
    for(j=0; j<20; j++)
    {
    WriteData(i++);
    delay(10);
    }

    C_S = 1;
    //Pulling C_S High means write data is completed
    //if next instruction to the display is data, must use WriteDataInit() first
    //if write command is executed without pulling C_S high, it will recognize the following instruction on the bus as data regardless
    WriteCommand(0xC0); //Line 2

    WriteDataInit();
    for(j=0; j<20; j++)
    {
    WriteData(i++);
    delay(10);
    }

    C_S = 1;
    WriteCommand(0x94); //Line 3

    WriteDataInit();
    for(j=0; j<20; j++)
    {
    WriteData(i++);
    delay(10);
    }


    C_S = 1;
    WriteCommand(0xD4); //Line 4

    WriteDataInit();
    for(j=0; j<20; j++)
    {
    WriteData(i++);
    delay(10);
    }

    }
    }
    0

Please sign in to leave a comment.