Basic library for SHARP LCD LS027B4DH01/LS027B7DH01

Dependents:   AkiSpiLcd_demo AkiSpiLcd_demo2 LCDRAM AkiSpiLcd_example

Revision:
30:d5c18e268866
Parent:
18:e3f59b23dd3a
Child:
31:7c7faf88edcc
--- a/AkiSpiLcd.cpp	Fri Oct 14 01:53:52 2016 +0900
+++ b/AkiSpiLcd.cpp	Wed Oct 19 22:26:33 2016 +0900
@@ -1,344 +1,321 @@
 /** this is for SHARP LCD LS027B4DH01
-* by Kazuki Yamamoto, or _K4ZUKI_
+* (c) Kazuki Yamamoto, or _K4ZUKI_
 */
 
+#include "AkiSpiLcd.h"
 #include "mbed.h"
-#include "AkiSpiLcd.h"
-//#include "Ser23K256.h"
+// #include "Ser23K256.h"
 extern const uint8_t lcd_line[];
 
-AkiSpiLcd::AkiSpiLcd(PinName mosi, PinName miso, PinName sck, PinName csl, PinName csr)
-    :_spi(mosi, miso, sck), _csl(csl), _csr(csr)
-{
-    _csl = 0;
-    _csr = 1;
-    _spi.format(8,0);
-    _spi.frequency(10000000);
-    _comflag = _modeflag = _clearflag = 0;
+AkiSpiLcd::AkiSpiLcd(PinName mosi, PinName miso, PinName sck, PinName csl,
+                     PinName csr)
+    : _spi(mosi, miso, sck), _csl(csl), _csr(csr) {
+  _csl = 0;
+  _csr = 1;
+  _spi.format(8, 0);
+  _spi.frequency(10000000);
+  _comflag = _modeflag = _clearflag = 0;
+}
+
+void AkiSpiLcd::cls() {
+  _modeflag = 0;
+  _clearflag = 1;
+
+  _csl = 1;
+  wait_us(5);
+
+  _spi.write((_modeflag << 7) | (_comflag << 6) | (_clearflag << 5));
+  _spi.write(0x00);
+
+  wait_us(5);
+  _csl = 0;
+
+  cominvert();
 }
 
-void AkiSpiLcd::cls()
-{
-    _modeflag = 0;
-    _clearflag = 1;
+void AkiSpiLcd::cls_ram(int screen) {
+  screen &= 1;
+  if (screen == SCREEN0) {
+    _cls_ram(SCREEN0_BASE);
+  } else {
+    _cls_ram(SCREEN1_BASE);
+  }
+}
+
+void AkiSpiLcd::directUpdateSingle(int line, uint8_t *data) {
+  _modeflag = 1;
+  _clearflag = 0;
+
+  _csl = 1;
+  wait_us(1);
+
+  if (line == 0)
+    line = 1;
 
+  _spi.write((_modeflag << 7) | (_comflag << 6) | (_clearflag << 5));
+  _spi.write((uint8_t)lcd_line[line]);
+
+  for (int i = 0; i < 50; i++) {
+    _spi.write(*(data + i));
+  }
+  _spi.write(0x00);
+  _spi.write(0x00);
+
+  wait_us(5);
+  _csl = 0;
+
+  cominvert();
+}
+
+void AkiSpiLcd::directUpdateMulti(int line, int length, uint8_t *data) {
+  _modeflag = 1;
+  _clearflag = 0;
+
+  if (line == 0)
+    line = 1;
+
+  if (length > 0) {
     _csl = 1;
     wait_us(5);
-
-    _spi.write( (_modeflag << 7) | (_comflag << 6) | (_clearflag << 5) );
-    _spi.write(0x00);
-
-    wait_us(5);
-    _csl = 0;
-
-    cominvert();
-}
-
-void AkiSpiLcd::cls_ram( int screen )
-{
-    screen &=1;
-    if(screen == SCREEN0) {
-        _cls_ram( SCREEN0_BASE );
-    } else {
-        _cls_ram( SCREEN1_BASE );
-    }
-}
-
-
-void AkiSpiLcd::directUpdateSingle(int line, uint8_t* data)
-{
-    _modeflag = 1;
-    _clearflag = 0;
-
-    _csl = 1;
-    wait_us(1);
-
-    if(line == 0)line = 1;
-
-    _spi.write( (_modeflag << 7) | (_comflag << 6) | (_clearflag << 5) );
-    _spi.write((uint8_t)lcd_line[line]);
-
-    for(int i = 0; i < 50; i++) {
-        _spi.write( *(data + i) );
+    for (int j = 1; j <= length; j++) {
+      _spi.write((_modeflag << 7) | (_comflag << 6) | (_clearflag << 5));
+      _spi.write((uint8_t)lcd_line[line]);
+      for (int i = 0; i < 50; i++) {
+        _spi.write(*(data + (50 * j + i))); // hogepic[50*j+i]
+      }
+      line += 1;
     }
     _spi.write(0x00);
     _spi.write(0x00);
-
     wait_us(5);
     _csl = 0;
-
-    cominvert();
+  }
+  cominvert();
 }
 
-void AkiSpiLcd::directUpdateMulti(int line, int length, uint8_t* data)
-{
-    _modeflag = 1;
-    _clearflag = 0;
+void AkiSpiLcd::cominvert() {
+  _modeflag = 0;
+  _clearflag = 0;
 
-    if(line == 0)line = 1;
+  _csl = 1;
 
-    if(length > 0) {
-        _csl = 1;
-        wait_us(5);
-        for (int j = 1; j <= length; j++) {
-            _spi.write( (_modeflag << 7) | (_comflag << 6) | (_clearflag << 5) );
-            _spi.write((uint8_t)lcd_line[line]);
-            for(int i = 0; i < 50; i++) {
-                _spi.write( *(data+(50 * j + i)) );//hogepic[50*j+i]
-            }
-            line += 1;
-        }
-        _spi.write(0x00);
-        _spi.write(0x00);
-        wait_us(5);
-        _csl = 0;
-    }
-    cominvert();
-}
-
-void AkiSpiLcd::cominvert()
-{
-    _modeflag = 0;
-    _clearflag = 0;
-
-    _csl = 1;
-
-    _spi.write( (_modeflag << 7) | (_comflag << 6) | (_clearflag << 5) );
-    _spi.write(0x00);
-//    wait_us(5);
-    _csl = 0;
-    if(_comflag == 0) {
-        _comflag = 1;
-    } else {
-        _comflag = 0;
-    }
+  _spi.write((_modeflag << 7) | (_comflag << 6) | (_clearflag << 5));
+  _spi.write(0x00);
+  //    wait_us(5);
+  _csl = 0;
+  if (_comflag == 0) {
+    _comflag = 1;
+  } else {
+    _comflag = 0;
+  }
 }
 
 /** Reads single line (16 + 400 bits = 52 bytes) from a screen
 */
-void AkiSpiLcd::ramReadSingleLine(int line, uint8_t* buffer, int screen)
-{
-    screen &= 1;
-    if(screen == SCREEN0) {
-        screen = SCREEN0_BASE;
-    } else {
-        screen = SCREEN1_BASE;
-    }
+void AkiSpiLcd::ramReadSingleLine(int line, uint8_t *buffer, int screen) {
+  screen &= 1;
+  if (screen == SCREEN0) {
+    screen = SCREEN0_BASE;
+  } else {
+    screen = SCREEN1_BASE;
+  }
 
-    line *= RAMLINE_LENGTH;
-    int address = screen + line;
-    ram_read(address, buffer, RAMLINE_LENGTH);
+  line *= RAMLINE_LENGTH;
+  int address = screen + line;
+  ram_read(address, buffer, RAMLINE_LENGTH);
 }
 
 /** Reads multi lines( (16 + 400) x N bits = 52 x N bytes) from a screen
 */
-void AkiSpiLcd::ramReadMultiLine(int line, int length, uint8_t* buffer, int screen)
-{
-    screen &= 1;
-    if(screen == SCREEN0) {
-        screen = SCREEN0_BASE;
-    } else {
-        screen = SCREEN1_BASE;
-    }
-    line *= RAMLINE_LENGTH;
-    int address = screen + line;
-    ram_read(address, buffer, RAMLINE_LENGTH*length);
+void AkiSpiLcd::ramReadMultiLine(int line, int length, uint8_t *buffer,
+                                 int screen) {
+  screen &= 1;
+  if (screen == SCREEN0) {
+    screen = SCREEN0_BASE;
+  } else {
+    screen = SCREEN1_BASE;
+  }
+  line *= RAMLINE_LENGTH;
+  int address = screen + line;
+  ram_read(address, buffer, RAMLINE_LENGTH * length);
 }
 
 /** Writes single line (400 bits = 50 bytes) into a screen
 */
-void AkiSpiLcd::ramWriteSingleLine(int line, uint8_t* data, int screen)
-{
-    screen &= 1;
-    if(screen == SCREEN0) {
-        screen = SCREEN0_BASE;
-    } else {
-        screen = SCREEN1_BASE;
-    }
-    line--;
-    line *= RAMLINE_LENGTH;
-    int address = screen + line;
-    ram_write(address, data, 50);
+void AkiSpiLcd::ramWriteSingleLine(int line, uint8_t *data, int screen) {
+  screen &= 1;
+  if (screen == SCREEN0) {
+    screen = SCREEN0_BASE;
+  } else {
+    screen = SCREEN1_BASE;
+  }
+  line--;
+  line *= RAMLINE_LENGTH;
+  int address = screen + line;
+  ram_write(address, data, 50);
 }
 
 /** Writes multi lines(400 x N bits = 50 x N bytes) into a screen
 */
-void AkiSpiLcd::ramWriteMultiLine(int line, int length, uint8_t* data, int screen)
-{
-    _modeflag = 1;
-    _clearflag = 0;
-    screen &= 1;
-    if(screen == SCREEN0) {
-        screen = SCREEN0_BASE;
-    } else {
-        screen = SCREEN1_BASE;
-    }
-//    line--;
-//    line*=RAMLINE_LENGTH;
+void AkiSpiLcd::ramWriteMultiLine(int line, int length, uint8_t *data,
+                                  int screen) {
+  _modeflag = 1;
+  _clearflag = 0;
+  screen &= 1;
+  if (screen == SCREEN0) {
+    screen = SCREEN0_BASE;
+  } else {
+    screen = SCREEN1_BASE;
+  }
+  //    line--;
+  //    line*=RAMLINE_LENGTH;
 
-    int address = screen + line * RAMLINE_LENGTH;
-    _ram_writeStatus(SEQUENTIAL_MODE);
-    _ram_prepareCommand(WRITE, address);
-    for(int i = 0; i < length; i++) {
-        _spi.write( (_modeflag << 7) | (_comflag << 6) | (_clearflag << 5) );
-        _spi.write( (uint8_t)lcd_line[line] );
-        for(int j = 0; j < LINE_LENGTH; j++) {
-            _spi.write(*data);
-            data++;
-        }
-        line++;
+  int address = screen + line * RAMLINE_LENGTH;
+  _ram_writeStatus(SEQUENTIAL_MODE);
+  _ram_prepareCommand(WRITE, address);
+  for (int i = 0; i < length; i++) {
+    _spi.write((_modeflag << 7) | (_comflag << 6) | (_clearflag << 5));
+    _spi.write((uint8_t)lcd_line[line]);
+    for (int j = 0; j < LINE_LENGTH; j++) {
+      _spi.write(*data);
+      data++;
     }
-    _ram_deselect();
-    _ram_writeStatus(BYTE_MODE);
-//    ram_write(address,data,50*length);
+    line++;
+  }
+  _ram_deselect();
+  _ram_writeStatus(BYTE_MODE);
+  //    ram_write(address,data,50*length);
 }
 
 /** copies whole data in screen into LCD
 */
-void AkiSpiLcd::ram2lcd(int startline, int length, int screen)
-{
-    _modeflag = 1;
-    _clearflag = 0;
-    screen &= 1;
-    if(screen == SCREEN0) {
-        screen = SCREEN0_BASE;
-    } else {
-        screen = SCREEN1_BASE;
-    }
-    if(startline == 0)startline = 1;
+void AkiSpiLcd::ram2lcd(int startline, int length, int screen) {
+  _modeflag = 1;
+  _clearflag = 0;
+  screen &= 1;
+  if (screen == SCREEN0) {
+    screen = SCREEN0_BASE;
+  } else {
+    screen = SCREEN1_BASE;
+  }
+  if (startline == 0)
+    startline = 1;
 
-    if(length > 0) {
+  if (length > 0) {
 
-        int address = screen + startline * RAMLINE_LENGTH;
-//    uint8_t dummy[RAMLINE_LENGTH+2];
-        int dummy = 0;
+    int address = screen + startline * RAMLINE_LENGTH;
+    //    uint8_t dummy[RAMLINE_LENGTH+2];
+    int dummy = 0;
 
-        _ram_writeStatus(SEQUENTIAL_MODE);
-        _ram_prepareCommand(READ, address);
-        _spi.format(16, 0);
-        _csl = 1;
-//wait_us(5);
+    _ram_writeStatus(SEQUENTIAL_MODE);
+    _ram_prepareCommand(READ, address);
+    _spi.format(16, 0);
+    _csl = 1;
+    // wait_us(5);
 
-        for(int j = 0; j <= length; j++) {
-//        _csl=1;
-            for(int k = 0; k < RAMLINE_LENGTH; k+=4) {
-                dummy = _spi.write(0x55de);
-//                dummy = _spi.write(0xde);
-                dummy = _spi.write(0xadaa);
-//            dummy = _spi.write(0xbe);
-//            dummy = _spi.write(0xaf);
-//                dummy = _spi.write(0xaa);
-            }
-//        _csl = 0;
-        }
+    for (int j = 0; j <= length; j++) {
+      //        _csl=1;
+      for (int k = 0; k < RAMLINE_LENGTH; k += 4) {
+        dummy = _spi.write(0x55de);
+        //                dummy = _spi.write(0xde);
+        dummy = _spi.write(0xadaa);
+        //            dummy = _spi.write(0xbe);
+        //            dummy = _spi.write(0xaf);
+        //                dummy = _spi.write(0xaa);
+      }
+      //        _csl = 0;
     }
-    _spi.write(0xdead);
-//wait_us(5);
-    _csl = 0;
-//    _spi.write(0xde);
-//    _spi.write(0xad);
-    _ram_deselect();
-    _spi.format(8, 0);
-    cominvert();
+  }
+  _spi.write(0xdead);
+  // wait_us(5);
+  _csl = 0;
+  //    _spi.write(0xde);
+  //    _spi.write(0xad);
+  _ram_deselect();
+  _spi.format(8, 0);
+  cominvert();
 }
 
 /** copies whole data in screen into LCD
 */
-void AkiSpiLcd::ram2lcd(int screen)
-{
-    uint8_t lineBuffer[RAMLINE_LENGTH];
-    for (int y = 0; y < 240; y++) {
-        ram_read(y * RAMLINE_LENGTH + 2, lineBuffer, RAMLINE_LENGTH);
-        directUpdateSingle(y + 1, lineBuffer);
-    }
+void AkiSpiLcd::ram2lcd(int screen) {
+  uint8_t lineBuffer[RAMLINE_LENGTH];
+  for (int y = 0; y < 240; y++) {
+    ram_read(y * RAMLINE_LENGTH + 2, lineBuffer, RAMLINE_LENGTH);
+    directUpdateSingle(y + 1, lineBuffer);
+  }
 }
-uint8_t AkiSpiLcd::ram_read(int address)
-{
-    _ram_prepareCommand(READ, address);
-    int result = _spi.write(0);
-    _ram_deselect();
-    return (uint8_t) result;
+uint8_t AkiSpiLcd::ram_read(int address) {
+  _ram_prepareCommand(READ, address);
+  int result = _spi.write(0);
+  _ram_deselect();
+  return (uint8_t)result;
 }
 
-void AkiSpiLcd::ram_read(int address, uint8_t * buffer, int count)
-{
-    _ram_writeStatus(SEQUENTIAL_MODE);
-    _ram_prepareCommand(READ, address);
-    for (int i = 0; i < count; i++) {
-        buffer[i] = _spi.write(0x00);
-
-    }
-    _ram_deselect();
-    _ram_writeStatus(BYTE_MODE);
+void AkiSpiLcd::ram_read(int address, uint8_t *buffer, int count) {
+  _ram_writeStatus(SEQUENTIAL_MODE);
+  _ram_prepareCommand(READ, address);
+  for (int i = 0; i < count; i++) {
+    buffer[i] = _spi.write(0x00);
+  }
+  _ram_deselect();
+  _ram_writeStatus(BYTE_MODE);
 }
 
-void AkiSpiLcd::ram_write(int address, uint8_t byte)
-{
-    _ram_prepareCommand(WRITE, address);
-    _spi.write(byte);
-    _ram_deselect();
+void AkiSpiLcd::ram_write(int address, uint8_t byte) {
+  _ram_prepareCommand(WRITE, address);
+  _spi.write(byte);
+  _ram_deselect();
 }
 
-void AkiSpiLcd::ram_write(int address, uint8_t * buffer, int count)
-{
-    _ram_writeStatus(SEQUENTIAL_MODE);
-    _ram_prepareCommand(WRITE, address);
-    for (int i = 0; i < count; i++) {
-        _spi.write(buffer[i]);
-    }
-    _ram_deselect();
-    _ram_writeStatus(BYTE_MODE);
+void AkiSpiLcd::ram_write(int address, uint8_t *buffer, int count) {
+  _ram_writeStatus(SEQUENTIAL_MODE);
+  _ram_prepareCommand(WRITE, address);
+  for (int i = 0; i < count; i++) {
+    _spi.write(buffer[i]);
+  }
+  _ram_deselect();
+  _ram_writeStatus(BYTE_MODE);
 }
 
-uint8_t AkiSpiLcd::ram_readStatus()
-{
-    _ram_select();
-    _spi.write(READ_STATUS);
-    uint8_t result = (uint8_t) _spi.write(0);
-    _ram_deselect();
-    return result;
+uint8_t AkiSpiLcd::ram_readStatus() {
+  _ram_select();
+  _spi.write(READ_STATUS);
+  uint8_t result = (uint8_t)_spi.write(0);
+  _ram_deselect();
+  return result;
 }
 
-void AkiSpiLcd::_ram_writeStatus(uint8_t status)
-{
-    _ram_select();
-    _spi.write(WRITE_STATUS);
-    _spi.write(status);
-    _ram_deselect();
-}
-
-void AkiSpiLcd::_ram_prepareCommand(uint8_t command, int address)
-{
-    _ram_select();
-    _spi.write(command);
-    _spi.write(address >> 8);
-    _spi.write(address & 0xFF);
+void AkiSpiLcd::_ram_writeStatus(uint8_t status) {
+  _ram_select();
+  _spi.write(WRITE_STATUS);
+  _spi.write(status);
+  _ram_deselect();
 }
 
-void AkiSpiLcd::_ram_select()
-{
-    _csr = 0;
-}
-
-void AkiSpiLcd::_ram_deselect()
-{
-    _csr = 1;
+void AkiSpiLcd::_ram_prepareCommand(uint8_t command, int address) {
+  _ram_select();
+  _spi.write(command);
+  _spi.write(address >> 8);
+  _spi.write(address & 0xFF);
 }
 
-void AkiSpiLcd::_cls_ram( int address )
-{
-    _modeflag = 1;
-    _clearflag = 0;
-    _ram_writeStatus(SEQUENTIAL_MODE);
-    _ram_prepareCommand(WRITE, address);
-    for (int i = 1; i <= (240); i++) {
-        _spi.write( (_modeflag << 7) | (_comflag << 6) | (_clearflag << 5) );
-        _spi.write( (uint8_t)lcd_line[i] );
-        for(int j = 0; j < 50; j++) {
-            _spi.write(0x00);
-        }
+void AkiSpiLcd::_ram_select() { _csr = 0; }
+
+void AkiSpiLcd::_ram_deselect() { _csr = 1; }
 
+void AkiSpiLcd::_cls_ram(int address) {
+  _modeflag = 1;
+  _clearflag = 0;
+  _ram_writeStatus(SEQUENTIAL_MODE);
+  _ram_prepareCommand(WRITE, address);
+  for (int i = 1; i <= (240); i++) {
+    _spi.write((_modeflag << 7) | (_comflag << 6) | (_clearflag << 5));
+    _spi.write((uint8_t)lcd_line[i]);
+    for (int j = 0; j < 50; j++) {
+      _spi.write(0x00);
     }
-    _ram_deselect();
-    _ram_writeStatus(BYTE_MODE);
+  }
+  _ram_deselect();
+  _ram_writeStatus(BYTE_MODE);
 }