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:   Brew

Files at this revision

API Documentation at this revision

Comitter:
Geremia
Date:
Fri Feb 13 15:25:10 2015 +0000
Parent:
0:75ec1b3cde17
Child:
2:713844a55c4e
Commit message:
Added SPI_16, LCD done

Changed in this revision

Display/LCD.cpp Show annotated file Show diff for this revision Revisions of this file
Display/LCD.h Show annotated file Show diff for this revision Revisions of this file
Inits/IST3020.cpp Show annotated file Show diff for this revision Revisions of this file
Inits/IST3020.h Show annotated file Show diff for this revision Revisions of this file
Inits/UC1608.cpp Show annotated file Show diff for this revision Revisions of this file
Inits/UC1608.h Show annotated file Show diff for this revision Revisions of this file
Protocols/PAR8.cpp Show annotated file Show diff for this revision Revisions of this file
Protocols/PAR8.h Show annotated file Show diff for this revision Revisions of this file
Protocols/Protocols.h Show annotated file Show diff for this revision Revisions of this file
Protocols/SPI16.cpp Show annotated file Show diff for this revision Revisions of this file
Protocols/SPI16.h Show annotated file Show diff for this revision Revisions of this file
Protocols/SPI8.cpp Show annotated file Show diff for this revision Revisions of this file
Protocols/SPI8.h Show annotated file Show diff for this revision Revisions of this file
--- a/Display/LCD.cpp	Thu Feb 12 22:22:47 2015 +0000
+++ b/Display/LCD.cpp	Fri Feb 13 15:25:10 2015 +0000
@@ -4,7 +4,8 @@
 //#define LCDPAGES        (LCDSIZE_Y>>3) // 8raws per page
 //#define IC_PAGES        (IC_Y_COMS>>3) // max pages in IC ddram, 8raws per page
 #define SWAP(a, b)  { a ^= b; b ^= a; a ^= b; }
-#define USEFRAMEBUFFER
+//#define USEFRAMEBUFFER
+#define NOPCMD 0xE300
 //#define FRAMEBUFSIZE    (LCDSIZE_X*LCDPAGES)
 Protocols* proto;
 
@@ -16,46 +17,72 @@
   //  buffer = new unsigned char [LCDSIZE_X*LCDPAGES];
   //  PAR8 par8proto(port, CS, reset, DC, WR, RD);
     if(displayproto==PAR_8) proto = new PAR8(port, CS, reset, DC, WR, RD);
+    useNOP=false;
     buffer = (unsigned char*) malloc (LCDSIZE_X*LCDPAGES);
+    buffer16 = (unsigned short*)buffer;
     draw_mode = NORMAL;
     set_orientation(1);
   //  cls();
   //  locate(0,0);
 }
-LCD::LCD(proto_t displayproto,PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC, const int lcdsize_x, const int lcdsize_y, const int ic_x_segs, const int ic_y_coms, const char *name)
+LCD::LCD(proto_t displayproto, int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC, const int lcdsize_x, const int lcdsize_y, const int ic_x_segs, const int ic_y_coms, const char *name)
     : GraphicsDisplay(name), LCDSIZE_X(lcdsize_x), LCDSIZE_Y(lcdsize_y), LCDPAGES(lcdsize_y>>3), IC_X_SEGS(ic_x_segs), IC_Y_COMS(ic_y_coms), IC_PAGES(ic_y_coms>>3)
 {
  //   LCDPAGES = LCDSIZE_Y>>3;
  //   IC_PAGES = IC_Y_COMS>>3;
   //  buffer = new unsigned char [LCDSIZE_X*LCDPAGES];
   //  PAR8 par8proto(port, CS, reset, DC, WR, RD);
-    if(displayproto==SPI_8) proto = new SPI8(mosi, miso, sclk, CS, reset, DC);
+    if(displayproto==SPI_8)
+    {
+        proto = new SPI8(Hz, mosi, miso, sclk, CS, reset, DC);
+        useNOP=false;
+    }
+    else if(displayproto==SPI_16)
+    {
+        proto = new SPI16(Hz, mosi, miso, sclk, CS, reset, DC);
+        useNOP=true;
+    }
     buffer = (unsigned char*) malloc (LCDSIZE_X*LCDPAGES);
+    buffer16 = (unsigned short*)buffer;
     draw_mode = NORMAL;
   //  cls();
     set_orientation(1);
   //  locate(0,0);
+
 }
 LCD::~LCD()
 {
     free(buffer);
 }
 
-void LCD::wr_cmd(unsigned char cmd)
+void LCD::wr_cmd8(unsigned char cmd)
     {
-        proto->wr_cmd(cmd);
+        if(useNOP) proto->wr_cmd16(NOPCMD|cmd);
+        else proto->wr_cmd8(cmd);
     }
-void LCD::wr_data8(unsigned char data8)
+void LCD::wr_data8(unsigned char data)
     {
-        proto->wr_data8(data8);
+        proto->wr_data8(data);
+    }
+void LCD::wr_data8(unsigned char data, unsigned int count)
+    {
+        proto->wr_data8(data, count);
     }
-void LCD::wr_data8(unsigned char data8, unsigned int count)
+void LCD::wr_data8buf(unsigned char* data, unsigned int lenght)
     {
-        proto->wr_data8(data8, count);
+        proto->wr_data8buf(data, lenght);
+    }
+void LCD::wr_cmd16(unsigned short cmd)
+    {
+        proto->wr_cmd16(cmd);
     }
-void LCD::wr_data8buf(unsigned char* data8, unsigned int lenght)
+void LCD::wr_data16(unsigned short data, unsigned int count)
     {
-        proto->wr_data8buf(data8, lenght);
+        proto->wr_data16(data, count);
+    }
+void LCD::wr_data16buf(unsigned short* data, unsigned int lenght)
+    {
+        proto->wr_data16buf(data, lenght);
     }
 void LCD::hw_reset()
     {
@@ -113,34 +140,34 @@
     switch (mode)
     {
         case(NONE):
-            wr_cmd(0xA0);
-            wr_cmd(0xC8); // this is in real Y mirror command, but seems most displays have COMs wired inverted, so assume this is the default no-y-mirror
+         //   wr_cmd8(0xA0);
+            wr_cmd16(0xA0C8); // this is in real Y mirror command, but seems most displays have COMs wired inverted, so assume this is the default no-y-mirror
             break;
         case(X):
-            wr_cmd(0xA1);
-            wr_cmd(0xC8);
+        //    wr_cmd8(0xA1);
+            wr_cmd16(0xA1C8);
             break;
         case(Y):
-            wr_cmd(0xA0);
-            wr_cmd(0xC0);
+        //    wr_cmd8(0xA0);
+            wr_cmd16(0xA0C0);
             break;
         case(XY):
-            wr_cmd(0xA1);
-            wr_cmd(0xC0);
+        //    wr_cmd8(0xA1);
+            wr_cmd16(0xA1C0);
             break;
     }
 }
 void LCD::invert(unsigned char o)
 {
-    if(o == 0) wr_cmd(0xA6);
-    else wr_cmd(0xA7);
+    if(o == 0) wr_cmd8(0xA6);
+    else wr_cmd8(0xA7);
 }
 
 void LCD::set_contrast(int o)
 {
     contrast = o;
-    wr_cmd(0x81);      //  set volume
-    wr_cmd(o & 0x3F);
+ //   wr_cmd8(0x81);      //  set volume
+    wr_cmd16(0x8100|(o&0x3F));
 }
 void LCD::set_auto_up(bool up)
 {
@@ -184,8 +211,8 @@
 
 //    if(draw_mode == NORMAL)
 //    {
-        if(color == 0) buffer[x + ((y>>3) * LCDSIZE_X)] &= ~(1 << (y&7));  // erase pixel
-        else buffer[x + ((y>>3) * LCDSIZE_X)] |= (1 << (y&7));   // set pixel
+        if(color == 0) buffer[(x + ((y>>3)*LCDSIZE_X))^1] &= ~(1 << (y&7));  // erase pixel
+        else buffer[(x + ((y>>3)*LCDSIZE_X))^1] |= (1 << (y&7));   // set pixel
 //    }
 //    else
 //    { // XOR mode
@@ -195,23 +222,27 @@
 void LCD::copy_to_lcd(void)
 {
     unsigned short i=0;
+    unsigned short setcolcmd = 0x0010 | ((col_offset&0xF)<<8) | (col_offset>>4);
     for(int page=0; page<LCDPAGES; page++)
     {
-        wr_cmd((unsigned char)col_offset&0xF);              // set column low nibble
-        wr_cmd(0x10|(col_offset>>4));      // set column hi  nibble
-        wr_cmd(0xB0|(page+page_offset));      // set page
-        wr_data8buf(buffer+i, LCDSIZE_X);   // send whole page pixels
-        i+=LCDSIZE_X;
+      //  wr_cmd8(col_offset&0xF);              // set column low nibble
+      //  wr_cmd8(0x10|(col_offset>>4));      // set column hi  nibble
+        wr_cmd16(setcolcmd);
+        wr_cmd8(0xB0|(page+page_offset));      // set page
+        wr_data16buf(buffer16+i, LCDSIZE_X>>1);   // send whole page pixels
+        i+=LCDSIZE_X>>1;
     }
 }
 void LCD::cls(void)
 {
     memset(buffer,0x00,LCDSIZE_X*LCDPAGES);  // clear display buffer
+    unsigned short setcolcmd = 0x0010 | ((col_offset&0xF)<<8) | (col_offset>>4);
     for(int page=0; page<LCDPAGES; page++)
     {
-        wr_cmd((unsigned char)col_offset&0xF);              // set column low nibble
-        wr_cmd(0x10|(col_offset>>4));      // set column hi  nibble
-        wr_cmd(0xB0|(page+page_offset));      // set page
-        wr_data8(0, LCDSIZE_X);   // send whole page pixels =0
+     //   wr_cmd8((unsigned char)col_offset&0xF);              // set column low nibble
+     //   wr_cmd8(0x10|(col_offset>>4));      // set column hi  nibble
+        wr_cmd16(setcolcmd);
+        wr_cmd8(0xB0|(page+page_offset));      // set page
+        wr_data16(0, LCDSIZE_X>>1);   // send whole page pixels =0
     }
 }
\ No newline at end of file
--- a/Display/LCD.h	Thu Feb 12 22:22:47 2015 +0000
+++ b/Display/LCD.h	Fri Feb 13 15:25:10 2015 +0000
@@ -5,11 +5,14 @@
 #include "GraphicsDisplay.h"
 #include "PAR8.h"
 #include "SPI8.h"
+#include "SPI16.h"
 #include "Protocols.h"
 
 #define Black           1
 #define White           0
 
+
+
 /** Draw mode
   * NORMAl
   * XOR set pixel by xor the screen
@@ -35,7 +38,7 @@
     /** Create a monochrome LCD SPI interface
     * @param name The name used by the parent class to access the interface
     */
-    LCD(proto_t displayproto,PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC, const int lcdsize_x, const int lcdsize_y, const int ic_x_segs, const int ic_y_coms, const char* name);
+    LCD(proto_t displayproto, int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC, const int lcdsize_x, const int lcdsize_y, const int ic_x_segs, const int ic_y_coms, const char* name);
     
     /** Destructor
     * will free framebuffer
@@ -147,31 +150,65 @@
 ////// functions needed by parent class ///////////////////////////////////////
 ////// -------------------------------- ///////////////////////////////////////
 
-    /** Send command byte to display
-    * @param cmd is the command
-    */
-    void wr_cmd(unsigned char cmd);
+    /** Send 8bit command to display controller 
+    *
+    * @param cmd: byte to send  
+    * @note if protocol is SPI16, it will insert NOP cmd before, so if cmd is a 2byte cmd, the second cmd will be broken. Use wr_cmd16 for 2bytes cmds
+    */   
+    void wr_cmd8(unsigned char cmd);
     
-    /** Send data byte to display
-    * @param data8 is the byte
-    */
-    void wr_data8(unsigned char data8);
+    /** Send 8bit data to display controller 
+    *
+    * @param data: byte to send   
+    *
+    */   
+    void wr_data8(unsigned char data);
     
-    /** Send same data byte to display controller multiple times
+    /** Send same 8bit data to display controller multiple times
     *
-    * @param data8: byte to send
+    * @param data: byte to send
     * @param count: how many
     *
     */   
-    virtual void wr_data8(unsigned char data8, unsigned int count);
+    void wr_data8(unsigned char data, unsigned int count);
     
     /** Send array of data bytes to display controller
     *
-    * @param data8: unsigned char data array
+    * @param data: unsigned char data array
     * @param lenght: lenght of array
     *
     */   
-    virtual void wr_data8buf(unsigned char* data8, unsigned int lenght);
+    void wr_data8buf(unsigned char* data, unsigned int lenght);
+    
+    /** Send 16bit command to display controller 
+    *
+    * @param cmd: halfword to send  
+    *
+    */   
+    void wr_cmd16(unsigned short cmd);
+    
+    /** Send 16bit data to display controller 
+    *
+    * @param data: halfword to send   
+    *
+    */   
+    //void wr_data16(unsigned short data);
+    
+    /** Send same 16bit data to display controller multiple times
+    *
+    * @param data: halfword to send
+    * @param count: how many
+    *
+    */   
+    void wr_data16(unsigned short data, unsigned int count);
+    
+    /** Send array of data shorts to display controller
+    *
+    * @param data: unsigned short data array
+    * @param lenght: lenght (in shorts)
+    *
+    */   
+    void wr_data16buf(unsigned short* data, unsigned int lenght);
     
     /** HW reset sequence (without display init commands)   
     */
@@ -184,6 +221,7 @@
 
 
     unsigned char *buffer;
+    unsigned short *buffer16;
     const int LCDSIZE_X;
     const int LCDSIZE_Y;
     const int LCDPAGES;
@@ -202,7 +240,7 @@
     int win_y1;
     int win_y2;
     int orientation;
-  //  bool portrait;
+    bool useNOP;
 };
 
 #endif
\ No newline at end of file
--- a/Inits/IST3020.cpp	Thu Feb 12 22:22:47 2015 +0000
+++ b/Inits/IST3020.cpp	Fri Feb 13 15:25:10 2015 +0000
@@ -18,8 +18,8 @@
     BusEnable(true);
     init();  
 }
-IST3020::IST3020(proto_t displayproto, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC, const char *name)
-    : LCD(displayproto, mosi, miso, sclk, CS, reset, DC, LCDSIZE_X, LCDSIZE_Y, IC_X_SEGS, IC_Y_COMS, name)
+IST3020::IST3020(proto_t displayproto, int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC, const char *name)
+    : LCD(displayproto, Hz, mosi, miso, sclk, CS, reset, DC, LCDSIZE_X, LCDSIZE_Y, IC_X_SEGS, IC_Y_COMS, name)
 {
     hw_reset();
     init();  
@@ -29,35 +29,35 @@
 {
     /* Start Initial Sequence ----------------------------------------------------*/
     
-    wr_cmd(0xE2);   //  sw reset
+    wr_cmd8(0xE2);   //  sw reset
     wait_ms(10);
     
-    wr_cmd(0xAE);   //  display off
-    wr_cmd(0xAB);   //  built-in OSC on
-    wr_cmd(0xA2);   //  bias voltage (1/9)
-  //  wr_cmd(0xA3);   //  bias voltage (1/7)
+    wr_cmd8(0xAE);   //  display off
+    wr_cmd8(0xAB);   //  built-in OSC on
+    wr_cmd8(0xA2);   //  bias voltage (1/9)
+  //  wr_cmd8(0xA3);   //  bias voltage (1/7)
 
-    wr_cmd(0xA0);   // ADC select seg0-seg223
-    //wr_cmd(0xA1);   // ADC select seg223-seg0
-    wr_cmd(0xC8);   // SHL select com63-com0
-    //wr_cmd(0xC0);   // SHL select com0-com63
+    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_cmd(0x2C);   //  Internal Voltage Converter ON
+    wr_cmd8(0x2C);   //  Internal Voltage Converter ON
     wait_ms(10);
-    wr_cmd(0x2E);   //  Internal Voltage Regulator ON
+    wr_cmd8(0x2E);   //  Internal Voltage Regulator ON
     wait_ms(10);
-    wr_cmd(0x2F);   //  Internal Voltage Follower ON
+    wr_cmd8(0x2F);   //  Internal Voltage Follower ON
     wait_ms(10);
-    wr_cmd(0x20);   //  Regulor_Resistor_Select resistor ratio 20-27 20=4.5(default) 27=8.0, 0.5 steps
+    wr_cmd8(0x20);   //  Regulor_Resistor_Select resistor ratio 20-27 20=4.5(default) 27=8.0, 0.5 steps
     set_contrast(48);
-    //wr_cmd(0x81);   //  set contrast (reference voltage register set)
-    //wr_cmd(0x20);   //  contrast 00-3F default 20
+    //wr_cmd8(0x81);   //  set contrast (reference voltage register set)
+    //wr_cmd8(0x20);   //  contrast 00-3F default 20
     
-    wr_cmd(0xA4);   //  LCD display ram (EntireDisplayOn disable)
-    //wr_cmd(0x70);   //  External Capacitors Discharge function enable (should be enabled by default)
-    //wr_cmd(0x77);   //  External Capacitors Discharge function disable
-    wr_cmd(0x40);   // start line = 0
-    wr_cmd(0xA6);     // display normal (1 = illuminated)
-    wr_cmd(0xAF);     // display ON 
+    wr_cmd8(0xA4);   //  LCD display ram (EntireDisplayOn disable)
+    //wr_cmd8(0x70);   //  External Capacitors Discharge function enable (should be enabled by default)
+    //wr_cmd8(0x77);   //  External Capacitors Discharge function disable
+    wr_cmd8(0x40);   // start line = 0
+    wr_cmd8(0xA6);     // display normal (1 = illuminated)
+    wr_cmd8(0xAF);     // display ON 
 
 }
\ No newline at end of file
--- a/Inits/IST3020.h	Thu Feb 12 22:22:47 2015 +0000
+++ b/Inits/IST3020.h	Fri Feb 13 15:25:10 2015 +0000
@@ -14,8 +14,8 @@
  
  public:
 
-    /** Create a PAR_8 display interface
-    * @param displayproto PAR_8 or PAR_16
+    /** Create a PAR display interface
+    * @param displayproto only supports PAR_8
     * @param port GPIO port name to use
     * @param CS pin connected to CS of display
     * @param reset pin connected to RESET of display
@@ -26,8 +26,9 @@
     */ 
     IST3020(proto_t displayproto, PortName port, PinName CS, PinName reset, PinName DC, PinName WR, PinName RD, const char* name);
   
-    /** Create an SPI_8 display interface
-    * @param displayproto SPI_8 or SPI_16
+    /** Create an SPI display interface
+    * @param displayproto only supports SPI_8
+    * @param Hz SPI speed in Hz
     * @param mosi SPI pin
     * @param miso SPI pin
     * @param sclk SPI pin
@@ -36,7 +37,7 @@
     * @param DC pin connected to data/command of display
     * @param name The name used by the parent class to access the interface
     */ 
-    IST3020(proto_t displayproto, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC, const char* name);
+    IST3020(proto_t displayproto, int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC, const char* name);
   
 
   
--- a/Inits/UC1608.cpp	Thu Feb 12 22:22:47 2015 +0000
+++ b/Inits/UC1608.cpp	Fri Feb 13 15:25:10 2015 +0000
@@ -21,8 +21,8 @@
     set_orientation(1);
     locate(0,0);
 }
-UC1608::UC1608(proto_t displayproto, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC, const char *name)
-    : LCD(displayproto, mosi, miso, sclk, CS, reset, DC, LCDSIZE_X, LCDSIZE_Y, IC_X_SEGS, IC_Y_COMS, name)
+UC1608::UC1608(proto_t displayproto, int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC, const char *name)
+    : LCD(displayproto, Hz, mosi, miso, sclk, CS, reset, DC, LCDSIZE_X, LCDSIZE_Y, IC_X_SEGS, IC_Y_COMS, name)
 {
     hw_reset();
     BusEnable(true);
@@ -36,30 +36,30 @@
 {
     /* Start Initial Sequence ----------------------------------------------------*/
     
-  //  wr_cmd(0xE2);   //  sw reset
+  //  wr_cmd8(0xE2);   //  sw reset
     wait_ms(15);
     
-    wr_cmd(0x27);   // Multiplex rate :128   set temperature consenpation 0%
-    wr_cmd(0xEA);   //set bias:1/12bias
+    wr_cmd8(0x27);   // Multiplex rate :128   set temperature consenpation 0%
+    wr_cmd8(0xEA);   //set bias:1/12bias
 
-    wr_cmd(0xC4);   // set mirror MX=1,MY=0 (controller->display SEGs wiring inverted)
-   // wr_cmd(0xA0);   // ADC select seg0-seg223
-    //wr_cmd(0xA1);   // ADC select seg223-seg0
-   // wr_cmd(0xC8);   // SHL select com63-com0
-    //wr_cmd(0xC0);   // SHL select com0-com63
+    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_cmd(0x2F);   //  //Power Control:internal, LCD capacitance 60nf-90nf
+    wr_cmd8(0x2F);   //  //Power Control:internal, LCD capacitance 60nf-90nf
     wait_ms(10);
     
-   // wr_cmd(0x81);//Set Gain and Potentiometer
-  //  wr_cmd(0x40|46);//Set Gain and Potentiometer  xx xxxxxx
+   // wr_cmd8(0x81);//Set Gain and Potentiometer
+  //  wr_cmd8(0x40|46);//Set Gain and Potentiometer  xx xxxxxx
     set_contrast(46);
     
-    wr_cmd(0x88);   //disable colum/page address wraparound
-    wr_cmd(0xA4);   //  LCD display ram (EntireDisplayOn disable)
-    wr_cmd(0x40);   // start line = 0
-    wr_cmd(0xA6);     // display normal (1 = illuminated)
-    wr_cmd(0xAF);     // display ON 
+    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 
 
 }
 ////////////////////////////////////////////////////////////////////
@@ -70,24 +70,25 @@
     switch (mode)
     {
         case(NONE):
-            wr_cmd(0xC4); // this is in real X mirror command, but my display have SEGs wired inverted, so assume this is the default no-x-mirror
+            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_cmd(0xC0);
+            wr_cmd8(0xC0);
             break;
         case(Y):
-            wr_cmd(0xCC);
+            wr_cmd8(0xCC);
             break;
         case(XY):
-            wr_cmd(0xC8);
+            wr_cmd8(0xC8);
             break;
     }
 }
 void UC1608::set_contrast(int o)
 {
     contrast = o;
-    wr_cmd(0x81);      //  set volume
-    wr_cmd(0x40|(o&0x3F));
+  //  wr_cmd8(0x81);      //  set volume
+  //  wr_cmd8(0x40|(o&0x3F));
+    wr_cmd16(0x8140|(o&0x3F));
 }
 void UC1608::BusEnable(bool enable)
 {
--- a/Inits/UC1608.h	Thu Feb 12 22:22:47 2015 +0000
+++ b/Inits/UC1608.h	Fri Feb 13 15:25:10 2015 +0000
@@ -14,8 +14,8 @@
  
  public:
 
-    /** Create a PAR_8 display interface
-    * @param displayproto PAR_8 or PAR_16
+    /** Create a PAR display interface
+    * @param displayproto only supports PAR_8
     * @param port GPIO port name to use
     * @param CS pin connected to CS of display
     * @param reset pin connected to RESET of display
@@ -26,8 +26,9 @@
     */ 
     UC1608(proto_t displayproto, PortName port, PinName CS, PinName reset, PinName DC, PinName WR, PinName RD, const char* name);
   
-    /** Create an SPI_8 display interface
-    * @param displayproto SPI_8 or SPI_16
+    /** Create an SPI display interface
+    * @param displayproto only supports SPI_8
+    * @param Hz SPI speed in Hz
     * @param mosi SPI pin
     * @param miso SPI pin
     * @param sclk SPI pin
@@ -36,7 +37,7 @@
     * @param DC pin connected to data/command of display
     * @param name The name used by the parent class to access the interface
     */ 
-    UC1608(proto_t displayproto, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC, const char* name);
+    UC1608(proto_t displayproto, int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC, const char* name);
   
     /** set the contrast of the screen
       * @note here overrided because of not standard command
--- a/Protocols/PAR8.cpp	Thu Feb 12 22:22:47 2015 +0000
+++ b/Protocols/PAR8.cpp	Fri Feb 13 15:25:10 2015 +0000
@@ -27,7 +27,7 @@
  //   debug("out 0x%.8X  in 0x%.8X\r\n", outreg, inreg);
 }
 #endif
-void PAR8::wr_cmd(unsigned char cmd)
+void PAR8::wr_cmd8(unsigned char cmd)
 {   
 #ifdef USE_CS
     _CS = 0;
@@ -40,26 +40,26 @@
     _CS = 1;
 #endif
 }
-void PAR8::wr_data8(unsigned char data8)
+void PAR8::wr_data8(unsigned char data)
 {
 #ifdef USE_CS
     _CS = 0;
 #endif
     _DC = 1; // 1=data
     _WR=0;
-    _port.write(data8);    // write 8bit
+    _port.write(data);    // write 8bit
     _WR=1;
 #ifdef USE_CS
     _CS = 1;
 #endif
 }
-void PAR8::wr_data8(unsigned char data8, unsigned int count)
+void PAR8::wr_data8(unsigned char data, unsigned int count)
 {
 #ifdef USE_CS
     _CS = 0;
 #endif
     _DC = 1; // 1=data
-    _port.write(data8);    // write 8bit
+    _port.write(data);    // write 8bit
     while(count)
     {
         _WR=0;
@@ -71,7 +71,7 @@
     _CS = 1;
 #endif
 }
-void PAR8::wr_data8buf(unsigned char* data8, unsigned int lenght)
+void PAR8::wr_data8buf(unsigned char* data, unsigned int lenght)
 {
 #ifdef USE_CS
     _CS = 0;
@@ -80,7 +80,7 @@
     while(lenght)
     {
         _WR=0;
-        _port.write(*data8++);    // write 8bit
+        _port.write(*data++);    // write 8bit
         _WR=1;
         lenght--;
     }
@@ -88,6 +88,93 @@
     _CS = 1;
 #endif
 }
+void PAR8::wr_cmd16(unsigned short cmd)
+{   
+#ifdef USE_CS
+    _CS = 0;
+#endif    
+    _DC = 0; // 0=cmd
+    _WR=0;
+    _port.write(cmd>>8);      // write 8bit
+    _WR=1;
+    _WR=0;
+    _port.write(cmd&0xFF);      // write 8bit
+    _WR=1;
+#ifdef USE_CS
+    _CS = 1;
+#endif
+}
+void PAR8::wr_data16(unsigned short data)
+{
+#ifdef USE_CS
+    _CS = 0;
+#endif
+    _DC = 1; // 1=data
+    _WR=0;
+    _port.write(data>>8);    // write 8bit
+    _WR=1;
+    _WR=0;
+    _port.write(data&0xFF);    // write 8bit
+    _WR=1;
+#ifdef USE_CS
+    _CS = 1;
+#endif
+}
+void PAR8::wr_data16(unsigned short data, unsigned int count)
+{
+#ifdef USE_CS
+    _CS = 0;
+#endif
+    _DC = 1; // 1=data
+    if((data>>8)==(data&0xFF))
+    {
+        count<<=1;
+        _port.write(data);    // write 8bit
+        while(count)
+        {
+            _WR=0;
+            _WR=1;
+            count--;
+        }
+    }
+    else
+    {
+        while(count)
+        {
+            _WR=0;
+            _port.write(data>>8);    // write 8bit
+            _WR=1;
+            _WR=0;
+            _port.write(data&0xFF);    // write 8bit
+            _WR=1;
+            count--;
+        }
+    }
+#ifdef USE_CS
+    _CS = 1;
+#endif
+}
+void PAR8::wr_data16buf(unsigned short* data, unsigned int lenght)
+{
+#ifdef USE_CS
+    _CS = 0;
+#endif
+    _DC = 1; // 1=data
+    while(lenght)
+    {
+        _WR=0;
+        _port.write((*data)>>8);    // write 8bit
+        _WR=1;
+        _WR=0;
+        _port.write((*data)&0xFF);    // write 8bit
+        _WR=1;
+        data++;
+        lenght--;
+    }
+#ifdef USE_CS
+    _CS = 1;
+#endif
+}
 void PAR8::hw_reset()
 {
     wait_ms(15);
--- a/Protocols/PAR8.h	Thu Feb 12 22:22:47 2015 +0000
+++ b/Protocols/PAR8.h	Fri Feb 13 15:25:10 2015 +0000
@@ -22,35 +22,65 @@
 
 protected:
   
-    /** Send command byte to display controller 
+    /** Send 8bit command to display controller 
     *
     * @param cmd: byte to send  
     *
     */   
-    virtual void wr_cmd(unsigned char cmd);
+    virtual void wr_cmd8(unsigned char cmd);
     
-    /** Send data byte to display controller 
+    /** Send 8bit data to display controller 
     *
-    * @param data8: byte to send   
+    * @param data: byte to send   
     *
     */   
-    virtual void wr_data8(unsigned char data8);
+    virtual void wr_data8(unsigned char data);
     
-    /** Send same data byte to display controller multiple times
+    /** Send same 8bit data to display controller multiple times
     *
-    * @param data8: byte to send
+    * @param data: byte to send
     * @param count: how many
     *
     */   
-    virtual void wr_data8(unsigned char data8, unsigned int count);
+    virtual void wr_data8(unsigned char data, unsigned int count);
     
     /** Send array of data bytes to display controller
     *
-    * @param data8: unsigned char data array
+    * @param data: unsigned char data array
     * @param lenght: lenght of array
     *
     */   
-    virtual void wr_data8buf(unsigned char* data8, unsigned int lenght);
+    virtual void wr_data8buf(unsigned char* data, unsigned int lenght);
+    
+    /** Send 16bit command to display controller 
+    *
+    * @param cmd: halfword to send  
+    *
+    */   
+    virtual void wr_cmd16(unsigned short cmd);
+    
+    /** Send 16bit data to display controller 
+    *
+    * @param data: halfword to send   
+    *
+    */   
+    virtual void wr_data16(unsigned short data);
+    
+    /** Send same 16bit data to display controller multiple times
+    *
+    * @param data: halfword to send
+    * @param count: how many
+    *
+    */   
+    virtual void wr_data16(unsigned short data, unsigned int count);
+    
+    /** Send array of data shorts to display controller
+    *
+    * @param data: unsigned short data array
+    * @param lenght: lenght (in shorts)
+    *
+    */   
+    virtual void wr_data16buf(unsigned short* data, unsigned int lenght);
     
     /** HW reset sequence (without display init commands)   
     */
--- a/Protocols/Protocols.h	Thu Feb 12 22:22:47 2015 +0000
+++ b/Protocols/Protocols.h	Fri Feb 13 15:25:10 2015 +0000
@@ -21,35 +21,65 @@
 {
  public:
     
-    /** Send command byte to display controller 
+    /** Send 8bit command to display controller 
     *
     * @param cmd: byte to send  
     *
     */   
-    virtual void wr_cmd(unsigned char cmd) = 0;
+    virtual void wr_cmd8(unsigned char cmd) = 0;
     
-    /** Send data byte to display controller 
+    /** Send 8bit data to display controller 
     *
-    * @param data8: byte to send   
+    * @param data: byte to send   
     *
     */   
-    virtual void wr_data8(unsigned char data8) = 0;
+    virtual void wr_data8(unsigned char data) = 0;
     
-    /** Send same data byte to display controller multiple times
+    /** Send same 8bit data to display controller multiple times
     *
-    * @param data8: byte to send
+    * @param data: byte to send
     * @param count: how many
     *
     */   
-    virtual void wr_data8(unsigned char data8, unsigned int count) = 0;
+    virtual void wr_data8(unsigned char data, unsigned int count) = 0;
     
     /** Send array of data bytes to display controller
     *
-    * @param data8: unsigned char data array
-    * @param lenght: lenght of array
+    * @param data: unsigned char data array
+    * @param lenght: lenght
+    *
+    */   
+    virtual void wr_data8buf(unsigned char* data, unsigned int lenght) = 0;
+    
+    /** Send 16bit command to display controller 
+    *
+    * @param cmd: halfword to send  
+    *
+    */   
+    virtual void wr_cmd16(unsigned short cmd) = 0;
+    
+    /** Send 16bit data to display controller 
+    *
+    * @param data: halfword to send   
     *
     */   
-    virtual void wr_data8buf(unsigned char* data8, unsigned int lenght) = 0;
+    virtual void wr_data16(unsigned short data) = 0;
+    
+    /** Send same 16bit data to display controller multiple times
+    *
+    * @param data: halfword to send
+    * @param count: how many
+    *
+    */   
+    virtual void wr_data16(unsigned short data, unsigned int count) = 0;
+    
+    /** Send array of data shorts to display controller
+    *
+    * @param data: unsigned short data array
+    * @param lenght: lenght (in shorts)
+    *
+    */   
+    virtual void wr_data16buf(unsigned short* data, unsigned int lenght) = 0;
     
     /** HW reset sequence (without display init commands)   
     */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Protocols/SPI16.cpp	Fri Feb 13 15:25:10 2015 +0000
@@ -0,0 +1,147 @@
+#include "SPI16.h"
+//#define USE_CS
+
+SPI16::SPI16(int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC)
+    : _CS(CS), _spi(mosi, miso, sclk), _reset(reset), _DC(DC)
+{
+    _reset = 1;
+    _DC=1;
+    _CS=1;
+    _spi.format(16,0);                  // 8 bit spi mode 0
+ //   _spi.frequency(12000000);          // 10 Mhz SPI clock, 12mhz for F411
+    _spi.frequency(Hz);
+    hw_reset();    
+}
+
+void SPI16::wr_cmd8(unsigned char cmd)
+{   
+#ifdef USE_CS
+    _CS = 0;
+#endif
+    _spi.format(8,0); // it takes time, better use wr_cmd16 with NOP cmd
+    _DC.write(0); // 0=cmd
+    _spi.write(cmd);      // write 8bit
+    _spi.format(16,0);
+#ifdef USE_CS
+    _CS = 1;
+#endif
+}
+void SPI16::wr_data8(unsigned char data)
+{
+#ifdef USE_CS
+    _CS = 0;
+#endif
+    _spi.format(8,0); // it takes time, check prev cmd parameter, in case use wr_data16 with repeated byte
+    _DC.write(1); // 1=data
+    _spi.write(data);    // write 8bit
+    _spi.format(16,0);
+#ifdef USE_CS
+    _CS = 1;
+#endif
+}
+void SPI16::wr_data8(unsigned char data, unsigned int count)
+{
+#ifdef USE_CS
+    _CS = 0;
+#endif
+    _spi.format(8,0);
+    _DC.write(1); // 1=data
+    while(count)
+    {
+        _spi.write(data);    // write 8bit
+        count--;
+    }
+    _spi.format(16,0);
+#ifdef USE_CS
+    _CS = 1;
+#endif
+}
+void SPI16::wr_data8buf(unsigned char* data, unsigned int lenght)
+{
+#ifdef USE_CS
+    _CS = 0;
+#endif
+    _spi.format(8,0);
+    _DC.write(1); // 1=data
+    while(lenght)
+    {
+        _spi.write(*data++);    // write 8bit
+       // data++;
+        lenght--;
+    }
+    _spi.format(16,0);
+#ifdef USE_CS
+    _CS = 1;
+#endif
+}
+void SPI16::wr_cmd16(unsigned short cmd)
+{   
+#ifdef USE_CS
+    _CS = 0;
+#endif    
+    _DC.write(0); // 0=cmd
+    _spi.write(cmd);      // write 16bit
+#ifdef USE_CS
+    _CS = 1;
+#endif
+}
+void SPI16::wr_data16(unsigned short data)
+{
+#ifdef USE_CS
+    _CS = 0;
+#endif
+    _DC.write(1); // 1=data
+    _spi.write(data);    // write 16bit
+#ifdef USE_CS
+    _CS = 1;
+#endif
+}
+void SPI16::wr_data16(unsigned short data, unsigned int count)
+{
+#ifdef USE_CS
+    _CS = 0;
+#endif
+    _DC.write(1); // 1=data
+    while(count)
+    {
+        _spi.write(data);
+        count--;
+    }
+#ifdef USE_CS
+    _CS = 1;
+#endif
+}
+void SPI16::wr_data16buf(unsigned short* data, unsigned int lenght)
+{
+#ifdef USE_CS
+    _CS = 0;
+#endif
+    _DC.write(1); // 1=data
+    while(lenght)
+    {
+        _spi.write(*data);
+        data++;
+        lenght--;
+    }
+#ifdef USE_CS
+    _CS = 1;
+#endif
+}
+void SPI16::hw_reset()
+{
+    wait_ms(15);
+    _DC = 1;
+ //   _CS = 1;
+    _CS = 0;
+    _reset = 0;                        // display reset
+    wait_us(50);
+    _reset = 1;                       // end reset
+    wait_ms(15);
+#ifndef USE_CS
+    _CS=0;      // put CS low now and forever
+#endif
+}
+void SPI16::BusEnable(bool enable)
+{
+    _CS = enable ? 0:1;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Protocols/SPI16.h	Fri Feb 13 15:25:10 2015 +0000
@@ -0,0 +1,107 @@
+#ifndef SPI16_H
+#define SPI16_H
+
+#include "mbed.h"
+#include "Protocols.h"
+//#include "GraphicsDisplay.h"
+
+class SPI16 : public Protocols
+{
+ public:
+
+    /** Create an SPI 8bit display interface with 3 control pins
+    *
+    * @param SPI mosi
+    * @param SPI miso
+    * @param SPI sclk
+    * @param CS pin connected to CS of display
+    * @param reset pin connected to RESET of display
+    * @param DC pin connected to data/command of display
+    */ 
+    SPI16(int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC);
+ 
+protected:
+   
+    /** Send 8bit command to display controller 
+    *
+    * @note switches spi format 16->8->16, better use wr_cmd16 with NOP in front 
+    * @param cmd: byte to send  
+    *
+    */   
+    virtual void wr_cmd8(unsigned char cmd);
+    
+    /** Send 8bit data to display controller 
+    *
+    * @note switches spi format 16->8->16, better use wr_data16 with repeated byte (if does not hurt)
+    * @param data: byte to send   
+    *
+    */   
+    virtual void wr_data8(unsigned char data);
+    
+    /** Send same 8bit data to display controller multiple times
+    *
+    * @note switches spi format 16->8->16, better use wr_data16
+    * @param data: byte to send
+    * @param count: how many
+    *
+    */   
+    virtual void wr_data8(unsigned char data, unsigned int count);
+    
+    /** Send array of data bytes to display controller
+    *
+    * @note switches spi format 16->8->16, better use wr_data16
+    * @param data: unsigned char data array
+    * @param lenght: lenght of array
+    *
+    */   
+    virtual void wr_data8buf(unsigned char* data, unsigned int lenght);
+    
+    /** Send 16bit command to display controller 
+    *
+    * @param cmd: halfword to send  
+    *
+    */   
+    virtual void wr_cmd16(unsigned short cmd);
+    
+    /** Send 16bit data to display controller 
+    *
+    * @param data: halfword to send   
+    *
+    */   
+    virtual void wr_data16(unsigned short data);
+    
+    /** Send same 16bit data to display controller multiple times
+    *
+    * @param data: halfword to send
+    * @param count: how many
+    *
+    */   
+    virtual void wr_data16(unsigned short data, unsigned int count);
+    
+    /** Send array of data shorts to display controller
+    *
+    * @param data: unsigned short data array
+    * @param lenght: lenght (in shorts)
+    *
+    */   
+    virtual void wr_data16buf(unsigned short* data, unsigned int lenght);
+    
+    /** HW reset sequence (without display init commands)   
+    */
+    virtual void hw_reset();
+    
+    /** Set ChipSelect high or low
+    * @param enable 0/1   
+    */
+    virtual void BusEnable(bool enable);
+  
+    DigitalOut _CS;
+
+private:
+
+    SPI _spi;
+    DigitalOut _reset;
+    DigitalOut _DC;
+  
+};
+#endif
\ No newline at end of file
--- a/Protocols/SPI8.cpp	Thu Feb 12 22:22:47 2015 +0000
+++ b/Protocols/SPI8.cpp	Fri Feb 13 15:25:10 2015 +0000
@@ -2,7 +2,7 @@
 
 //#define USE_CS
 
-SPI8::SPI8(PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC)
+SPI8::SPI8(int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC)
     : _CS(CS), _spi(mosi, miso, sclk), _reset(reset), _DC(DC)
 {
     _reset = 1;
@@ -10,11 +10,11 @@
     _CS=1;
     _spi.format(8,0);                  // 8 bit spi mode 0
  //   _spi.frequency(12000000);          // 10 Mhz SPI clock, 12mhz for F411
-    _spi.frequency(10000000);
+    _spi.frequency(Hz);
     hw_reset();    
 }
 
-void SPI8::wr_cmd(unsigned char cmd)
+void SPI8::wr_cmd8(unsigned char cmd)
 {   
 #ifdef USE_CS
     _CS = 0;
@@ -25,18 +25,18 @@
     _CS = 1;
 #endif
 }
-void SPI8::wr_data8(unsigned char data8)
+void SPI8::wr_data8(unsigned char data)
 {
 #ifdef USE_CS
     _CS = 0;
 #endif
     _DC.write(1); // 1=data
-    _spi.write(data8);    // write 8bit
+    _spi.write(data);    // write 8bit
 #ifdef USE_CS
     _CS = 1;
 #endif
 }
-void SPI8::wr_data8(unsigned char data8, unsigned int count)
+void SPI8::wr_data8(unsigned char data, unsigned int count)
 {
 #ifdef USE_CS
     _CS = 0;
@@ -44,14 +44,14 @@
     _DC.write(1); // 1=data
     while(count)
     {
-        _spi.write(data8);    // write 8bit
+        _spi.write(data);    // write 8bit
         count--;
     }
 #ifdef USE_CS
     _CS = 1;
 #endif
 }
-void SPI8::wr_data8buf(unsigned char* data8, unsigned int lenght)
+void SPI8::wr_data8buf(unsigned char* data, unsigned int lenght)
 {
 #ifdef USE_CS
     _CS = 0;
@@ -59,8 +59,77 @@
     _DC.write(1); // 1=data
     while(lenght)
     {
-        _spi.write(*data8++);    // write 8bit
-       // data8++;
+        _spi.write(*data++);    // write 8bit
+       // data++;
+        lenght--;
+    }
+#ifdef USE_CS
+    _CS = 1;
+#endif
+}
+void SPI8::wr_cmd16(unsigned short cmd)
+{   
+#ifdef USE_CS
+    _CS = 0;
+#endif    
+    _DC.write(0); // 0=cmd
+    _spi.write(cmd>>8);      // write 8bit
+    _spi.write(cmd&0xFF);      // write 8bit
+#ifdef USE_CS
+    _CS = 1;
+#endif
+}
+void SPI8::wr_data16(unsigned short data)
+{
+#ifdef USE_CS
+    _CS = 0;
+#endif
+    _DC.write(1); // 1=data
+    _spi.write(data>>8);    // write 8bit
+    _spi.write(data&0xFF);    // write 8bit
+#ifdef USE_CS
+    _CS = 1;
+#endif
+}
+void SPI8::wr_data16(unsigned short data, unsigned int count)
+{
+#ifdef USE_CS
+    _CS = 0;
+#endif
+    _DC.write(1); // 1=data
+    if((data>>8)==(data&0xFF))
+    {
+        count<<=1;
+        while(count)
+        {
+            _spi.write(data);    // write 8bit
+            count--;
+        }
+    }
+    else
+    {
+        while(count)
+        {
+            _spi.write(data>>8);    // write 8bit
+            _spi.write(data&0xFF);    // write 8bit
+            count--;
+        }
+    }
+#ifdef USE_CS
+    _CS = 1;
+#endif
+}
+void SPI8::wr_data16buf(unsigned short* data, unsigned int lenght)
+{
+#ifdef USE_CS
+    _CS = 0;
+#endif
+    _DC.write(1); // 1=data
+    while(lenght)
+    {
+        _spi.write((*data)>>8);    // write 8bit
+        _spi.write((*data)&0xFF);    // write 8bit
+        data++;
         lenght--;
     }
 #ifdef USE_CS
--- a/Protocols/SPI8.h	Thu Feb 12 22:22:47 2015 +0000
+++ b/Protocols/SPI8.h	Fri Feb 13 15:25:10 2015 +0000
@@ -18,39 +18,69 @@
     * @param reset pin connected to RESET of display
     * @param DC pin connected to data/command of display
     */ 
-    SPI8(PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC);
+    SPI8(int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC);
  
 protected:
    
-    /** Send command byte to display controller 
+    /** Send 8bit command to display controller 
     *
     * @param cmd: byte to send  
     *
     */   
-    virtual void wr_cmd(unsigned char cmd);
+    virtual void wr_cmd8(unsigned char cmd);
     
-    /** Send data byte to display controller 
+    /** Send 8bit data to display controller 
     *
-    * @param data8: byte to send   
+    * @param data: byte to send   
     *
     */   
-    virtual void wr_data8(unsigned char data8);
+    virtual void wr_data8(unsigned char data);
     
-    /** Send same data byte to display controller multiple times
+    /** Send same 8bit data to display controller multiple times
     *
-    * @param data8: byte to send
+    * @param data: byte to send
     * @param count: how many
     *
     */   
-    virtual void wr_data8(unsigned char data8, unsigned int count);
+    virtual void wr_data8(unsigned char data, unsigned int count);
     
     /** Send array of data bytes to display controller
     *
-    * @param data8: unsigned char data array
+    * @param data: unsigned char data array
     * @param lenght: lenght of array
     *
     */   
-    virtual void wr_data8buf(unsigned char* data8, unsigned int lenght);
+    virtual void wr_data8buf(unsigned char* data, unsigned int lenght);
+    
+    /** Send 16bit command to display controller 
+    *
+    * @param cmd: halfword to send  
+    *
+    */   
+    virtual void wr_cmd16(unsigned short cmd);
+    
+    /** Send 16bit data to display controller 
+    *
+    * @param data: halfword to send   
+    *
+    */   
+    virtual void wr_data16(unsigned short data);
+    
+    /** Send same 16bit data to display controller multiple times
+    *
+    * @param data: halfword to send
+    * @param count: how many
+    *
+    */   
+    virtual void wr_data16(unsigned short data, unsigned int count);
+    
+    /** Send array of data shorts to display controller
+    *
+    * @param data: unsigned short data array
+    * @param lenght: lenght (in shorts)
+    *
+    */   
+    virtual void wr_data16buf(unsigned short* data, unsigned int lenght);
     
     /** HW reset sequence (without display init commands)   
     */