fixed library.

Dependents:   Sharp_Memory_LCD_Test hello_GT20L16J1Y_FONT_mlcd

Fork of sharp_mlcd by Masato YAMANISHI

Revision:
2:c36cdd3ad7ba
Parent:
1:f8ba3b236d12
Child:
3:d2aed1df064c
--- a/sharp_mlcd.cpp	Sun May 11 14:03:39 2014 +0000
+++ b/sharp_mlcd.cpp	Fri Sep 12 18:04:58 2014 +0000
@@ -33,10 +33,14 @@
 #include "Small_7.h"
 
 sharp_mlcd::sharp_mlcd(const char* name)
-  : _spi(D11,NC,D13),_EXTCOM(D9),_DISP(D8),_CS(D10), GraphicsDisplay(name) // for nucleo L152RE or other
+  : GraphicsDisplay(name), _spi(D11, NC, D13), _EXTCOM(D9), _DISP(D8), _CS(D10)  // for nucleo L152RE or other
 {
-  draw_mode = NORMAL;
-  char_x = 0;
+  lcd_reset();
+}
+
+sharp_mlcd::sharp_mlcd(PinName mosi, PinName sclk, PinName scs, PinName extcomin, PinName disp, const char* name)
+  : GraphicsDisplay(name), _spi(mosi, NC, sclk), _EXTCOM(extcomin), _DISP(disp), _CS(scs)
+{
   lcd_reset();
 }
 
@@ -72,6 +76,8 @@
   wait_us(2);
   _CS = 0;
 
+  setmode(NORMAL);
+
   // clear and update LCD
   cls();
   // memset(buffer,0xff,BUFFER_SIZE);  // clear display buffer
@@ -93,16 +99,16 @@
 void sharp_mlcd::pixel(int x, int y, int color)
 {
   // first check parameter
-  if(x > WIDTH || y > HEIGHT || x < 0 || y < 0) return;
+  if(x >= width() || y >= height() || x < 0 || y < 0) return;
 
   if(draw_mode == NORMAL) {
     if(color != reverse)
-      buffer[x/8 + (y*WIDTH/8)] &= ~(1 << (7-(x%8)));  // set pixel
+      buffer[x/8 + (y*width()/8)] &= ~(1 << (7-(x%8)));  // set pixel
     else
-      buffer[x/8 + (y*WIDTH/8)] |= (1 << (7-(x%8)));   // erase pixel
+      buffer[x/8 + (y*width()/8)] |= (1 << (7-(x%8)));   // erase pixel
   } else { // XOR mode
     if(color != reverse)
-      buffer[x/8 + (y*WIDTH/8)] ^= (1 << (7-(x%8)));   // xor pixel
+      buffer[x/8 + (y*width()/8)] ^= (1 << (7-(x%8)));   // xor pixel
   }
 }
 
@@ -122,22 +128,23 @@
   return u;
 }
 
-void sharp_mlcd::copy_to_lcd(void)
+void sharp_mlcd::copy_to_lcd(int start)
 {
-  const int start = 0;
   int x, y;
   unsigned char *p = (unsigned char*)buffer; // image;
     
   _CS = 1;
   wait_us(4); // min 3us
   //
-  for (y = 0; y < HEIGHT; y++) {
+  for (y = 0; y < height(); y++) {
     _spi.write(0x80); // update mode (multi line)
-    _spi.write(bit_reverse((y + 1 + start) % HEIGHT)); // set gate line address
-    for (x = 0; x < (WIDTH / 8); x++) {
+    _spi.write(bit_reverse((y + start) % height() + 1)); // set gate line address
+    for (x = 0; x < (width() / 8); x++) {
       _spi.write(*p++); // (((y / 8) + x + mode) % 2)? 0xff: 0);
     }
   }
+  _spi.write(0x00); // dummy (16ck)
+  _spi.write(0x00);
   //
   wait_us(2); // min 1us
   _CS = 0;
@@ -145,7 +152,7 @@
 
 void sharp_mlcd::cls(void)
 {
-  memset(buffer, reverse? 0x00: 0xff, BUFFER_SIZE);  // clear display buffer
+  memset(buffer, reverse ? 0x00 : 0xff, BUFFER_SIZE);  // clear display buffer
   copy_to_lcd();
 }
 
@@ -301,7 +308,7 @@
 
   draw_x5 = draw_x7 = x0 - r;
   draw_y5 = draw_y7 = y0;
-  if (draw_x5>=0) {
+  if (draw_x5 >= 0) {
     pixel(draw_x5, draw_y5, color);     /* 180 degree */
   }
 
@@ -338,7 +345,7 @@
     draw_y6--;
     draw_y7--;
 
-    if ( (draw_x0 <= width()) && (draw_y0>=0) ) {
+    if ( (draw_x0 <= width()) && (draw_y0 >= 0) ) {
       pixel(draw_x0, draw_y0, color);
     }
 
@@ -350,7 +357,7 @@
       pixel(draw_x2, draw_y2, color);
     }
 
-    if ( (draw_x3 >=0 ) && (draw_y3 <= height()) ) {
+    if ( (draw_x3 >= 0 ) && (draw_y3 <= height()) ) {
       pixel(draw_x3, draw_y3, color);
     }
 
@@ -361,7 +368,7 @@
     if ( (draw_x5 >= 0) && (draw_y5 >= 0) ) {
       pixel(draw_x5, draw_y5, color);
     }
-    if ( (draw_x6 <=width()) && (draw_y6 <= height()) ) {
+    if ( (draw_x6 <= width()) && (draw_y6 <= height()) ) {
       pixel(draw_x6, draw_y6, color);
     }
     if ( (draw_x7 >= 0) && (draw_y7 <= height()) ) {
@@ -414,7 +421,7 @@
   if (value == '\n') {    // new line
     char_x = 0;
     char_y = char_y + font[2];
-    if (char_y >= height() - font[2]) {
+    if (char_y > height() - font[2]) {
       char_y = 0;
     }
   } else {
@@ -438,20 +445,27 @@
   vert = font[2];                      // get vert size of font
   bpl = font[3];                       // bytes per line
 
-  if (char_x + hor > width()) {
-    char_x = 0;
-    char_y = char_y + vert;
-    if (char_y >= height() - font[2]) {
+  zeichen = &font[((c -32) * offset) + 4]; // start of char bitmap
+  w = zeichen[0];                          // width of actual char
+
+  if (char_x > width() - w) {
+    char_x = w;
+    char_y += vert;
+    if (char_y > height() - vert) {
       char_y = 0;
     }
+
+    x = 0;
+    y = char_y;
+
+  } else {
+    char_x += w;
   }
 
-  zeichen = &font[((c -32) * offset) + 4]; // start of char bitmap
-  w = zeichen[0];                          // width of actual char
   // construct the char into the buffer
   for (j=0; j<vert; j++) {  //  vert line
     for (i=0; i<hor; i++) {   //  horz line
-      z =  zeichen[bpl * i + ((j & 0xF8) >> 3)+1];
+      z =  zeichen[bpl * i + ((j & 0xFFF8) >> 3)+1];
       b = 1 << (j & 0x07);
       if (( z & b ) == 0x00) {
         pixel(x+i,y+j,0);
@@ -461,8 +475,6 @@
 
     }
   }
-
-  char_x += w;
 }
 
 void sharp_mlcd::set_font(unsigned char* f)
@@ -472,8 +484,11 @@
 
 void sharp_mlcd::set_auto_up(unsigned int up)
 {
-  if(up ) auto_up = 1;
-  else auto_up = 0;
+  if (up) {
+    auto_up = 1;
+  } else {
+    auto_up = 0;
+  }
 }
 
 unsigned int sharp_mlcd::get_auto_up(void)
@@ -488,9 +503,9 @@
 
   for(v=0; v < bm.ySize; v++) {   // lines
     for(h=0; h < bm.xSize; h++) { // pixel
-      if(h + x > WIDTH-1) break;
-      if(v + y > HEIGHT-1) break;
-      d = bm.data[bm.Byte_in_Line * v + ((h & 0xF8) >> 3)];
+      if(h + x >= width()) break;
+      if(v + y >= height()) break;
+      d = bm.data[bm.Byte_in_Line * v + ((h & 0xFFF8) >> 3)];
       b = 0x80 >> (h & 0x07);
       if((d & b) == 0) {
         pixel(x+h,y+v,!color);