Basically i glued Peter Drescher and Simon Ford libs in a GraphicsDisplay class, then derived TFT or LCD class (which inherits Protocols class), then the most derived ones (Inits), which are per-display and are the only part needed to be adapted to diff hw.

Dependents:   testUniGraphic_150217 maze_TFT_MMA8451Q TFT_test_frdm-kl25z TFT_test_NUCLEO-F411RE ... more

Inits/UC1608.cpp

Committer:
Geremia
Date:
2022-01-25
Revision:
34:c66986d80f72
Parent:
9:1749ae993cfe

File content as of revision 34:c66986d80f72:

 /* mbed UniGraphic library - Device specific class
 * Copyright (c) 2015 Giuliano Dianda
 * Released under the MIT License: http://mbed.org/license/mit
 */
#include "Protocols.h"
#include "UC1608.h"

//////////////////////////////////////////////////////////////////////////////////
// display settings ///////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
#define IC_X_SEGS    240 // UC1608 SEG has range 0-239 (239-0 if MX=1), check your datasheet, important for the orientation
#define IC_Y_COMS    128  // UC1608 COM has range 0-127 (127-0 if MY=1), check your datasheet, important for the orientation
//#define LCDSIZE_X       240 // display X pixels
//#define LCDSIZE_Y       120  // display Y pixels, UC1608 is advertised as 240x128 but display size could be smaller



UC1608::UC1608(proto_t displayproto, PortName port, PinName CS, PinName reset, PinName DC, PinName WR, PinName RD, const char *name , unsigned int LCDSIZE_X, unsigned  int LCDSIZE_Y)
    : LCD(displayproto, port, CS, reset, DC, WR, RD, LCDSIZE_X, LCDSIZE_Y, IC_X_SEGS, IC_Y_COMS, name)
{
    hw_reset();
    BusEnable(true);
    init();
    cls();
    set_orientation(1);
    locate(0,0);
}
UC1608::UC1608(proto_t displayproto, int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC, const char *name, unsigned int LCDSIZE_X, unsigned  int LCDSIZE_Y)
    : LCD(displayproto, Hz, mosi, miso, sclk, CS, reset, DC, LCDSIZE_X, LCDSIZE_Y, IC_X_SEGS, IC_Y_COMS, name)
{
    hw_reset();
    BusEnable(true);
    init();
    cls();
    set_orientation(1);
    locate(0,0);
}
// reset and init the lcd controller
void UC1608::init()
{
    /* Start Initial Sequence ----------------------------------------------------*/
    
  //  wr_cmd8(0xE2);   //  sw reset
    thread_sleep_for(15);
    
    wr_cmd8(0x27);   // Multiplex rate :128   set temperature consenpation 0%
    wr_cmd8(0xEA);   //set bias:1/12bias

    wr_cmd8(0xC4);   // set mirror MX=1,MY=0 (controller->display SEGs wiring inverted)
   // wr_cmd8(0xA0);   // ADC select seg0-seg223
    //wr_cmd8(0xA1);   // ADC select seg223-seg0
   // wr_cmd8(0xC8);   // SHL select com63-com0
    //wr_cmd8(0xC0);   // SHL select com0-com63

    wr_cmd8(0x2F);   //  //Power Control:internal, LCD capacitance 60nf-90nf
    thread_sleep_for(10);
    
   // wr_cmd8(0x81);//Set Gain and Potentiometer
  //  wr_cmd8(0x40|26);//Set Gain and Potentiometer  xx xxxxxx
    set_contrast(26);
    
    wr_cmd8(0x88);   //disable colum/page address wraparound
    wr_cmd8(0xA4);   //  LCD display ram (EntireDisplayOn disable)
    wr_cmd8(0x40);   // start line = 0
    wr_cmd8(0xA6);     // display normal (1 = illuminated)
    wr_cmd8(0xAF);     // display ON 

}
////////////////////////////////////////////////////////////////////
// functions that overrides the standard ones implemented in LCD.cpp
////////////////////////////////////////////////////////////////////
void UC1608::mirrorXY(mirror_t mode)
{
    switch (mode)
    {
        case(NONE):
            wr_cmd8(0xC4); // this is in real X mirror command, but my display have SEGs wired inverted, so assume this is the default no-x-mirror
            break;
        case(X):
            wr_cmd8(0xC0);
            break;
        case(Y):
            wr_cmd8(0xCC);
            break;
        case(XY):
            wr_cmd8(0xC8);
            break;
    }
}
void UC1608::set_contrast(int o)
{
    contrast = o;
  //  wr_cmd8(0x81);      //  set volume
  //  wr_cmd8(0x40|(o&0x3F));
    wr_cmd16(0x8140|(o&0x3F));
}
void UC1608::BusEnable(bool enable)
{
    LCD::BusEnable(!enable); // crap IC has CS not inverted (active HIGH)
}