This is the final version of Mini Gateway for Automation and Security desgined for Renesas GR Peach Design Contest

Dependencies:   GR-PEACH_video GraphicsFramework HTTPServer R_BSP mbed-rpc mbed-rtos Socket lwip-eth lwip-sys lwip FATFileSystem

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Committer:
vipinranka
Date:
Wed Jan 11 11:41:30 2017 +0000
Revision:
12:9a20164dcc47
This is the final version MGAS Project for Renesas GR Peach Design Contest

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vipinranka 12:9a20164dcc47 1 /* mbed UniGraphic library - Device specific class
vipinranka 12:9a20164dcc47 2 * Copyright (c) 2015 Peter Drescher
vipinranka 12:9a20164dcc47 3 * Released under the MIT License: http://mbed.org/license/mit
vipinranka 12:9a20164dcc47 4 */
vipinranka 12:9a20164dcc47 5
vipinranka 12:9a20164dcc47 6 #include "Protocols.h"
vipinranka 12:9a20164dcc47 7 #include "SSD1306.h"
vipinranka 12:9a20164dcc47 8
vipinranka 12:9a20164dcc47 9 //////////////////////////////////////////////////////////////////////////////////
vipinranka 12:9a20164dcc47 10 // display settings ///////////////////////////////////////////////////////
vipinranka 12:9a20164dcc47 11 /////////////////////////////////////////////////////////////////////////
vipinranka 12:9a20164dcc47 12
vipinranka 12:9a20164dcc47 13
vipinranka 12:9a20164dcc47 14 #define IC_X_SEGS 128 // UC1608 SEG has range 0-239 (239-0 if MX=1), check your datasheet, important for the orientation
vipinranka 12:9a20164dcc47 15 #define IC_Y_COMS 64 // UC1608 COM has range 0-127 (127-0 if MY=1), check your datasheet, important for the orientation
vipinranka 12:9a20164dcc47 16
vipinranka 12:9a20164dcc47 17 #define SSD1306_SETCONTRAST 0x81
vipinranka 12:9a20164dcc47 18 #define SSD1306_DISPLAYALLON_RESUME 0xA4
vipinranka 12:9a20164dcc47 19 #define SSD1306_DISPLAYALLON 0xA5
vipinranka 12:9a20164dcc47 20 #define SSD1306_NORMALDISPLAY 0xA6
vipinranka 12:9a20164dcc47 21 #define SSD1306_INVERTDISPLAY 0xA7
vipinranka 12:9a20164dcc47 22 #define SSD1306_DISPLAYOFF 0xAE
vipinranka 12:9a20164dcc47 23 #define SSD1306_DISPLAYON 0xAF
vipinranka 12:9a20164dcc47 24 #define SSD1306_SETDISPLAYOFFSET 0xD3
vipinranka 12:9a20164dcc47 25 #define SSD1306_SETCOMPINS 0xDA
vipinranka 12:9a20164dcc47 26 #define SSD1306_SETVCOMDETECT 0xDB
vipinranka 12:9a20164dcc47 27 #define SSD1306_SETDISPLAYCLOCKDIV 0xD5
vipinranka 12:9a20164dcc47 28 #define SSD1306_SETPRECHARGE 0xD9
vipinranka 12:9a20164dcc47 29 #define SSD1306_SETMULTIPLEX 0xA8
vipinranka 12:9a20164dcc47 30 #define SSD1306_SETLOWCOLUMN 0x00
vipinranka 12:9a20164dcc47 31 #define SSD1306_SETHIGHCOLUMN 0x10
vipinranka 12:9a20164dcc47 32 #define SSD1306_SETSTARTLINE 0x40
vipinranka 12:9a20164dcc47 33 #define SSD1306_MEMORYMODE 0x20
vipinranka 12:9a20164dcc47 34 #define SSD1306_COMSCANINC 0xC0
vipinranka 12:9a20164dcc47 35 #define SSD1306_COMSCANDEC 0xC8
vipinranka 12:9a20164dcc47 36 #define SSD1306_SEGREMAP 0xA0
vipinranka 12:9a20164dcc47 37 #define SSD1306_CHARGEPUMP 0x8D
vipinranka 12:9a20164dcc47 38
vipinranka 12:9a20164dcc47 39 SSD1306::SSD1306(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)
vipinranka 12:9a20164dcc47 40 : LCD(displayproto, port, CS, reset, DC, WR, RD, LCDSIZE_X, LCDSIZE_Y, IC_X_SEGS, IC_Y_COMS, name)
vipinranka 12:9a20164dcc47 41 {
vipinranka 12:9a20164dcc47 42 hw_reset();
vipinranka 12:9a20164dcc47 43 BusEnable(true);
vipinranka 12:9a20164dcc47 44 init();
vipinranka 12:9a20164dcc47 45 cls();
vipinranka 12:9a20164dcc47 46 set_orientation(1);
vipinranka 12:9a20164dcc47 47 locate(0,0);
vipinranka 12:9a20164dcc47 48 }
vipinranka 12:9a20164dcc47 49 SSD1306::SSD1306(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)
vipinranka 12:9a20164dcc47 50 : LCD(displayproto, Hz, mosi, miso, sclk, CS, reset, DC, LCDSIZE_X, LCDSIZE_Y, IC_X_SEGS, IC_Y_COMS, name)
vipinranka 12:9a20164dcc47 51 {
vipinranka 12:9a20164dcc47 52 hw_reset();
vipinranka 12:9a20164dcc47 53 BusEnable(true);
vipinranka 12:9a20164dcc47 54 init();
vipinranka 12:9a20164dcc47 55 cls();
vipinranka 12:9a20164dcc47 56 set_orientation(1);
vipinranka 12:9a20164dcc47 57 locate(0,0);
vipinranka 12:9a20164dcc47 58 }
vipinranka 12:9a20164dcc47 59 // reset and init the lcd controller
vipinranka 12:9a20164dcc47 60 void SSD1306::init()
vipinranka 12:9a20164dcc47 61 {
vipinranka 12:9a20164dcc47 62 /* Start Initial Sequence ----------------------------------------------------*/
vipinranka 12:9a20164dcc47 63
vipinranka 12:9a20164dcc47 64 // wr_cmd8(0xE2); // sw reset
vipinranka 12:9a20164dcc47 65 wait_ms(15);
vipinranka 12:9a20164dcc47 66
vipinranka 12:9a20164dcc47 67 wr_cmd8(SSD1306_DISPLAYOFF); // no problem in SPI_16 for single byte cmds
vipinranka 12:9a20164dcc47 68 wr_cmd16((SSD1306_SETDISPLAYCLOCKDIV<<8)|0x80); // wr_cmd16 for multibyte cmds issue in SPI16 mode
vipinranka 12:9a20164dcc47 69 // wr_cmd8(0x80); // in SPI_16 it would become 0xE380 and will break things up
vipinranka 12:9a20164dcc47 70 wr_cmd16((SSD1306_SETMULTIPLEX<<8)|63);
vipinranka 12:9a20164dcc47 71 // wr_cmd8(63);
vipinranka 12:9a20164dcc47 72
vipinranka 12:9a20164dcc47 73 wr_cmd16((SSD1306_SETDISPLAYOFFSET<<8)|0x00);
vipinranka 12:9a20164dcc47 74 // wr_cmd8(0x0);
vipinranka 12:9a20164dcc47 75
vipinranka 12:9a20164dcc47 76 wr_cmd8(SSD1306_SETSTARTLINE | 0x0); // line #0
vipinranka 12:9a20164dcc47 77
vipinranka 12:9a20164dcc47 78 wr_cmd16((SSD1306_CHARGEPUMP<<8)|0x14);
vipinranka 12:9a20164dcc47 79 // wr_cmd8(0x14); // 0x10
vipinranka 12:9a20164dcc47 80
vipinranka 12:9a20164dcc47 81 wr_cmd16((SSD1306_MEMORYMODE<<8)|0x00);
vipinranka 12:9a20164dcc47 82 // wr_cmd8(0x00); // 0x0 act like ks0108
vipinranka 12:9a20164dcc47 83
vipinranka 12:9a20164dcc47 84 wr_cmd8(SSD1306_SEGREMAP ); //| 0x1);
vipinranka 12:9a20164dcc47 85
vipinranka 12:9a20164dcc47 86 wr_cmd8(SSD1306_COMSCANDEC);
vipinranka 12:9a20164dcc47 87
vipinranka 12:9a20164dcc47 88 wr_cmd16((SSD1306_SETCOMPINS<<8)|0x12);
vipinranka 12:9a20164dcc47 89 // wr_cmd8(0x12); // LCDSIZE_Y == 32 ? 0x02 : 0x12);
vipinranka 12:9a20164dcc47 90
vipinranka 12:9a20164dcc47 91 wr_cmd16((SSD1306_SETCONTRAST<<8)|0xCF);
vipinranka 12:9a20164dcc47 92 // wr_cmd8(0xCF); // _rawHeight == 32 ? 0x8F : ((vccstate == SSD1306_EXTERNALVCC) ? 0x9F : 0xCF) );
vipinranka 12:9a20164dcc47 93
vipinranka 12:9a20164dcc47 94 wr_cmd16((SSD1306_SETPRECHARGE<<8)|0xF1);
vipinranka 12:9a20164dcc47 95 // wr_cmd8(0xF1); // : 0x22);
vipinranka 12:9a20164dcc47 96
vipinranka 12:9a20164dcc47 97 wr_cmd16((SSD1306_SETVCOMDETECT<<8)|0x40);
vipinranka 12:9a20164dcc47 98 // wr_cmd8(0x40);
vipinranka 12:9a20164dcc47 99
vipinranka 12:9a20164dcc47 100 wr_cmd8(SSD1306_DISPLAYALLON_RESUME);
vipinranka 12:9a20164dcc47 101
vipinranka 12:9a20164dcc47 102 //wr_cmd8(SSD1306_NORMALDISPLAY);
vipinranka 12:9a20164dcc47 103 wr_cmd8(SSD1306_INVERTDISPLAY);
vipinranka 12:9a20164dcc47 104
vipinranka 12:9a20164dcc47 105 wr_cmd8(SSD1306_DISPLAYON);
vipinranka 12:9a20164dcc47 106 }
vipinranka 12:9a20164dcc47 107
vipinranka 12:9a20164dcc47 108 ////////////////////////////////////////////////////////////////////
vipinranka 12:9a20164dcc47 109 // functions that overrides the standard ones implemented in LCD.cpp
vipinranka 12:9a20164dcc47 110 ////////////////////////////////////////////////////////////////////
vipinranka 12:9a20164dcc47 111
vipinranka 12:9a20164dcc47 112 void SSD1306::mirrorXY(mirror_t mode)
vipinranka 12:9a20164dcc47 113 {
vipinranka 12:9a20164dcc47 114 switch (mode)
vipinranka 12:9a20164dcc47 115 {
vipinranka 12:9a20164dcc47 116 case(NONE):
vipinranka 12:9a20164dcc47 117 wr_cmd16(0xA0C0);
vipinranka 12:9a20164dcc47 118 break;
vipinranka 12:9a20164dcc47 119 case(X):
vipinranka 12:9a20164dcc47 120 wr_cmd16(0xA1C0);
vipinranka 12:9a20164dcc47 121 break;
vipinranka 12:9a20164dcc47 122 case(Y):
vipinranka 12:9a20164dcc47 123 wr_cmd16(0xA0C8);
vipinranka 12:9a20164dcc47 124 break;
vipinranka 12:9a20164dcc47 125 case(XY):
vipinranka 12:9a20164dcc47 126 wr_cmd16(0xA1C8);
vipinranka 12:9a20164dcc47 127 break;
vipinranka 12:9a20164dcc47 128 }
vipinranka 12:9a20164dcc47 129 }
vipinranka 12:9a20164dcc47 130
vipinranka 12:9a20164dcc47 131 void SSD1306::set_contrast(int o)
vipinranka 12:9a20164dcc47 132 {
vipinranka 12:9a20164dcc47 133 contrast = o;
vipinranka 12:9a20164dcc47 134
vipinranka 12:9a20164dcc47 135 wr_cmd16(0x8100|(o&0xFF));
vipinranka 12:9a20164dcc47 136 }
vipinranka 12:9a20164dcc47 137
vipinranka 12:9a20164dcc47 138 ////////////////////////////////////////////////////////////////////
vipinranka 12:9a20164dcc47 139 // functions that overrides the standard ones implemented in LCD.cpp
vipinranka 12:9a20164dcc47 140 ////////////////////////////////////////////////////////////////////
vipinranka 12:9a20164dcc47 141
vipinranka 12:9a20164dcc47 142
vipinranka 12:9a20164dcc47 143 const uint8_t scroll_speed[8]={3,2,1,6,0,5,4,7};
vipinranka 12:9a20164dcc47 144
vipinranka 12:9a20164dcc47 145 ////////////////////////////////////////////////////////////////////
vipinranka 12:9a20164dcc47 146 // functions addon to LCD.cpp
vipinranka 12:9a20164dcc47 147 ////////////////////////////////////////////////////////////////////
vipinranka 12:9a20164dcc47 148 void SSD1306::horizontal_scroll(int l_r,int s_page,int e_page,int speed){
vipinranka 12:9a20164dcc47 149 wr_cmd8(0x2E); // deactivate scroll before change
vipinranka 12:9a20164dcc47 150 if(l_r == 1){
vipinranka 12:9a20164dcc47 151 wr_cmd16(0x2700); // horizontal scroll left
vipinranka 12:9a20164dcc47 152 }
vipinranka 12:9a20164dcc47 153 else {
vipinranka 12:9a20164dcc47 154 wr_cmd16(0x2600);
vipinranka 12:9a20164dcc47 155 }
vipinranka 12:9a20164dcc47 156 wr_cmd16((s_page & 0x07)<<8 | (scroll_speed[speed & 0x07]));
vipinranka 12:9a20164dcc47 157 wr_cmd16((e_page & 0x07)<<8 );
vipinranka 12:9a20164dcc47 158 wr_cmd16(0xFF2F);
vipinranka 12:9a20164dcc47 159 }
vipinranka 12:9a20164dcc47 160
vipinranka 12:9a20164dcc47 161 void SSD1306::horiz_vert_scroll(int l_r,int s_page,int e_page,int v_off,int speed){
vipinranka 12:9a20164dcc47 162 wr_cmd8(0x2E); // deactivate scroll before change
vipinranka 12:9a20164dcc47 163 if(l_r == 1){
vipinranka 12:9a20164dcc47 164 wr_cmd16(0x2A00); // horizontal scroll left
vipinranka 12:9a20164dcc47 165 }
vipinranka 12:9a20164dcc47 166 else {
vipinranka 12:9a20164dcc47 167 wr_cmd16(0x2900);
vipinranka 12:9a20164dcc47 168 }
vipinranka 12:9a20164dcc47 169 wr_cmd16((s_page & 0x07)<<8 | (scroll_speed[speed & 0x07]));
vipinranka 12:9a20164dcc47 170 wr_cmd16((e_page & 0x07)<<8 | (v_off & 0x3F) );
vipinranka 12:9a20164dcc47 171 wr_cmd8(0x2F);
vipinranka 12:9a20164dcc47 172
vipinranka 12:9a20164dcc47 173 }
vipinranka 12:9a20164dcc47 174
vipinranka 12:9a20164dcc47 175 void SSD1306::end_scroll(){
vipinranka 12:9a20164dcc47 176 wr_cmd8(0x2E);
vipinranka 12:9a20164dcc47 177 }