Graphic LCD Display ST7565R

This is a nice 128 by 64 pixel LCD Display, available from RS

RS-564416

RS-564393 a bit smaller

and from DOGM Graphics (nice data-sheet)

 

Note: there is no built in Alphabet

The display is divided into 8 lines, of 8 pixels, by 128.

 

This does mean that for graphics, you are bound by an 8, 16, 24 .. pixel high stripe.

 

I have used SPI, as the MBED is plenty fast enough, and only ends up needing 5 wires, plus 2 power.

 

CODE:

#include "GLCD-ST7565R.h"
#include "char.h"
#include "mbed.h"

// pin remapping


GLCD_ST7565R::GLCD_ST7565R (PinName mosi ,      PinName miso,       PinName sclk,
                            PinName GLCD_CS,  PinName GLCD_DC,  PinName GLCD_Reset) :  
                            // mosi, miso, clk, CS, DC, Reset
                            _spi (mosi, miso, sclk),
                            _GLCD_CS    (GLCD_CS),       
                            _GLCD_DC    (GLCD_DC),      
                            _GLCD_Reset (GLCD_Reset) 
{
    // Default constructor ..
    _normal = 1;
    Init_GLCD();
}


/*
//SPI spi(p11, p12, p13); // mosi, miso, sclk

//DigitalOut  n_OLED_Reset      (p24);
//DigitalOut  n_OLED_CS         (p25);
//DigitalOut  n_OLED_DC         (p26);
*/

// ------------------------------------------------------
void GLCD_ST7565R::comm_out (unsigned char command) {
    _GLCD_DC = 0;
    _GLCD_CS = 0;

    _spi.write (command);
    _GLCD_CS = 1;
}
// **********************************************************  //
void GLCD_ST7565R::data_out (unsigned char data) {
    _GLCD_DC = 1;
    _GLCD_CS = 0;
    if (_normal)
    {
    _spi.write (data);
    }
    else // _invert
    {
    _spi.write (~data);
    }
    _GLCD_CS = 1;
}
// **********************************************************  //
void GLCD_ST7565R::Init_GLCD(void) {
    _spi.format(8,0); 
    _spi.frequency(200000); 


    // send some dummy packets ..
    comm_out(0x00);
    comm_out(0x00);
    
    // force Hardware reset ..
    _GLCD_Reset = 0;
    _GLCD_CS = 1;
    // reset
    wait_ms(200);
    _GLCD_Reset = 0;
    wait_ms(500);
    _GLCD_Reset = 1;
    wait_ms(500);
    
    #define RotDisplay


    comm_out(0x40);     //set command unlock
    
    #ifdef RotDisplay
    comm_out(0xa1);     //$A0=Normal $A1=Invert  akkow sensiable X:Y mapping
    comm_out(0xc0 | 0x00); //Select COM output scan direction
    #else
    comm_out(0xa0);     //$A0=Normal $A1=Invert  akkow sensiable X:Y mapping
    comm_out(0xc0 | 0x08); //Select COM output scan direction
    #endif

    comm_out(0xa7);     //
    comm_out(0xa2);     //LCD Bias
    comm_out(0x2f);     //set multiplex ratio

    comm_out(0xf8);     //Booster Ratio
    comm_out(0x00);     // 0=2x,3x,4x 1=5x, 3=6x

    comm_out(0x27);     //V0 (Rb/Ra) ? Contrast

    comm_out(0x81);     //Electronic VOLUME ($16)
    comm_out(0x05);     //..value

    comm_out(0xac);     //Sleep mode ?
    comm_out(0x00);     //second byte

 
    #ifdef invert
    comm_out(0xa4 | 0); //$A0=Normal $A1=Invert(9) 1 = black screen ?? no writing
    #else
    comm_out(0xa6 | 0); //$A0=Normal $A1=Invert(9)
    #endif

    cleanDDRAM(0x00);

    comm_out(0xaf);     //Display = ON

    comm_out(0xb0);     // page (0..16)
    comm_out(0x40);     // display start line ($40..$7f)
    comm_out(0x10);     // Column Address ($10 | MSB) (4-bits)
    comm_out(0x00);     // ...............($00 | LSB) (4-bits)

}

// **********************************************************  //

void GLCD_ST7565R::GLCD_String (char Coll, char Line, char *Phrase) 
{

    _col = Coll;
    _row = Line;
    

    Line = Line & 0x07;
    
    #ifdef RotDisplay
    Coll += 4;              // adjust for rotated display ..
    #endif

    // select ln, coll ..
    comm_out(0xb0 | Line); // display start line ($40..$7f)  roll ?

    comm_out(0x10 | (Coll >> 4) );
    comm_out(0x00 | (Coll & 0x0f));

    while (*Phrase) {
        GLCDCharC_GEN(*Phrase++);
    }
}

/* ******************************************************* */
/* ******************************************************* */

// locate ..
void GLCD_ST7565R::GLCD_Locate (char Coll, char Line)
{
    _col = Coll;
    _row = Line;
    
    Line = Line & 0x07;
    
    #ifdef RotDisplay
    Coll += 4;              // adjust for rotated display ..
    #endif

    // select ln, coll ..
    comm_out(0xb0 | Line); // display start line ($40..$7f)  roll ?

    comm_out(0x10 | (Coll >> 4) );
    comm_out(0x00 | (Coll & 0x0f));
}

/* ******************************************************* */
/* ******************************************************* */

// printf ..
int GLCD_ST7565R::_putc (int c) 
{
    GLCDCharC_GEN(c);

    return c;    
}

int GLCD_ST7565R::_getc() 
{
    return -1;
}

/* ******************************************************* */

void GLCD_ST7565R::GLCDCharC_GEN (unsigned char Alph) {
    unsigned char line, BitsOut;
    int pt;

    if (Alph < 0x20) Alph = 0x20;     // canot display ..
    Alph -= 0x20;                      // array of data starts @ "space" ~ $20 !

    //Alph = Alph << 3;
    pt = Alph;
    pt = pt<< 3;


    for (line = 0; line<8; line++) 
    {
        BitsOut = Character8x7[pt | line];
        data_out(BitsOut);
        
        
        
        
        
    _col ++;
    
    // catch for over printing ..
    if (_col > 127)
    {
        _col = 0;
        _row++;
        _row &= 0x07;
        
        GLCD_Locate(_col, _row);
    }        
        
        
        
        
        
        
        
        
    }
    
    // detect if width is low, eg 'i' as opposed to 'H',
    // .... only a few char's are shorter, no gain is not high enough.
}

/* ************************************************************** */

void GLCD_ST7565R::GLCD_Bargraph (char Line, char Percent) {
    Line = Line & 0x07;
    
    
    char Coll;              // adjust for rotated display ..
        #ifdef RotDisplay
        Coll = 4;
        #else
        Coll = 0;
        #endif    
    char Len,ch;

    // select ln, coll ..
    comm_out(0xb0 | Line); // display start line ($40..$7f)  roll ?

    comm_out(0x10 | (Coll >> 4) );
    comm_out(0x00 | (Coll & 0x0f));
    
    data_out(0x00);
    data_out(0x00);
    data_out(0x00);
    data_out(0x00);

    data_out(0x3e);
    
    for (Len = 0; Len < 120; Len++)
    {
        ch = 0x41;
        if (Len < Percent) ch |= 0x3e;
        data_out(ch);
    }
    data_out(0x3e);
}

/* ************************************************************** */

void GLCD_ST7565R::GLCD_Draw_Box (char x, char y, char xx, char yy) {
}





// **********************************************************  //


void GLCD_ST7565R::cleanDDRAM(int pattern) {
    int Ln,Col;

    for (Ln=0;Ln<8;Ln++) {
        comm_out(0xb0|Ln); // display start line ($40..$7f)  roll ?

        comm_out(0x10);
        #ifdef RotDisplay
        comm_out(0x04);
        #else
        comm_out(0x00);
        #endif

        for (Col=0;Col<128;Col++) {
            //data_out(j); wait_ms (30);
            data_out(pattern);
            //data_out(0x81);
        }
    }
}

// -----------------------------------------------------------------

void GLCD_ST7565R::DrawBitMap (void) {
}

// ----------------------------------------------------------------

void GLCD_ST7565R::FatalFileWarning(char *Message)
{
        cleanDDRAM(0x00);
        GLCD_Locate (0,0);
        printf(" ** WARNING ** ");
                
        GLCD_Locate (0,2);
        printf(" Could not open");
        
        GLCD_Locate (0,4);
        printf("     file!     ");
        
        GLCD_Locate (0,6);
        printf (Message);
}

#ifndef _GLCD_h_
#define _GLCD_h_ 


#include "mbed.h"

/*
class TextLCD : public Stream {
public:
*/


class GLCD_ST7565R :public Stream {

public:
    
    GLCD_ST7565R (PinName mosi ,      PinName miso,       PinName sclk,  PinName GLCD_CS,  PinName GLCD_DC,  PinName GLCD_Reset);
    



void cleanDDRAM(int);
void Init_GLCD(void);
void comm_out (unsigned char command);
void data_out (unsigned char data);
void GLCD_String (char px, char py, char *Phrase);
//void  (unsigned char Alph);
void GLCDCharC_GEN (unsigned char Alph);
void DrawBitMap (void);
void GLCD_Bargraph (char Line, char Percent);
void GLCD_Draw_Box (char x, char y, char xx, char yy);

void GLCD_Locate (char Coll, char Line);

void FatalFileWarning(char *Message);

protected:

    // Stream implementation functions
    virtual int _putc (int);
    virtual int _getc (void);
    
    int _col;
    int _row;
    int _normal;
    
    
// int printf(const char* format, ...);

//private: // ??
    SPI _spi;
    DigitalOut _GLCD_CS;
    DigitalOut _GLCD_DC;
    DigitalOut _GLCD_Reset;
    
      
     




};



#endif

Additional code:

 

sprintf (String, "/sd/mydir/sdtest.txt" );

 

FILE *fp = fopen (String, "r");

 

if(!fp)

{

glcd.FatalFileWarning(String);

}

else

{

// normal operation

}

 

Pictures as well.

 

I used a 40 way IDC Cable (e.g. an old Hard Disk Drive cable)

cut down, and the centor 28 conductors soldered to the LCD Leads.

with the outside 4 connectors, (2 each side) going to the LED pins.

IDC Connection

 

Not too clear from the photo, but the capacitors are soldered DIAGONALLY across the pins.

connections

Connections etc., and

 

copper

 

EAGLE schematics after that

#mce_temp_url#


1 comment

28 Oct 2010

I have some code for it here.

You need to log in to post a comment