scrolling example code for SHARP LCD LS027B4DH01/LS027B7DH01, using AkiSpiLcd library

Dependencies:   AkiSpiLcd mbed

This is very basic library example to access a graphic LCD LS027B4DH01 or LS027B7DH01

Import libraryAkiSpiLcd

Basic library for SHARP LCD LS027B4DH01/LS027B7DH01

  • schematic example1: /media/uploads/k4zuki/akispilcd_v2.1m.sch.png
  • schematic example2: /media/uploads/k4zuki/2.7inchshield.sch.png
  • example1 photo: /media/uploads/k4zuki/2014-09-17_20.22.26.jpg /media/uploads/k4zuki/2014-09-17_20.22.48.jpg
  • example2 photo: /media/uploads/k4zuki/2014-04-29_13.17.57.jpg
  • example2 movie (mpeg4 movie):

AkiSpiLcd.cpp

Committer:
k4zuki
Date:
2014-05-06
Revision:
3:8dbf3336dc66
Parent:
2:3554ec6df722

File content as of revision 3:8dbf3336dc66:

/*
this is for SHARP LCD LS027B4DH01
by Kazuki Yamamoto, or _K4ZUKI_
*/
#include "AkiSpiLcd.h"

AkiSpiLcd::AkiSpiLcd(PinName mosi,PinName sck, PinName cs, PinName disp)
    :_spi(mosi,NC,sck), _cs(cs), _disp(disp)
{
    _cs=0;
    _spi.format(8,0);
    _spi.frequency(2000000);
    comflag = modeflag = clearflag = 0;
    _disp=1;
}

void AkiSpiLcd::cls()
{
    modeflag=0;
    clearflag=1;

    _cs=1;
    wait_us(5);

    _spi.write( (modeflag << 7) | (comflag << 6) | (clearflag << 5) );
    _spi.write(0x00);

    wait_us(5);
    _cs=0;

    if(comflag == 0) {
        comflag = 1;
    } else {
        comflag = 0;
    }
}

void AkiSpiLcd::updateSingle(int line, uint8_t* data)
{
    modeflag=1;
    clearflag=0;

    _cs=1;
    wait_us(5);

    _spi.write( (modeflag << 7) | (comflag << 6) | (clearflag << 5) );
    _spi.write(
        ( ( (line+1) & 0x01 ) << 7 )|
        ( ( (line+1) & 0x02 ) << 5 )|
        ( ( (line+1) & 0x04 ) << 3 )|
        ( ( (line+1) & 0x08 ) << 1 )|
        ( ( (line+1) & 0x10 ) >> 1 )|
        ( ( (line+1) & 0x20 ) >> 3 )|
        ( ( (line+1) & 0x40 ) >> 5 )|
        ( ( (line+1) & 0x80 ) >> 7 )
    );

    for(int i=0; i<50; i++) {
        _spi.write( *(data+i) );
    }
    _spi.write(0x00);
    _spi.write(0x00);

    wait_us(5);
    _cs=0;

    if(comflag == 0) {
        comflag = 1;
    } else {
        comflag = 0;
    }
}

void AkiSpiLcd::updateMulti(int line, int length, uint8_t* data)
{
    modeflag=1;
    clearflag=0;

    if(length>0) {
        _cs=1;
        wait_us(5);
        for (int j=0; j<length; j++) {
            _spi.write( (modeflag << 7) | (comflag << 6) | (clearflag << 5) );
            _spi.write(
                ( ( (line+1) & 0x01 ) << 7 )|
                ( ( (line+1) & 0x02 ) << 5 )|
                ( ( (line+1) & 0x04 ) << 3 )|
                ( ( (line+1) & 0x08 ) << 1 )|
                ( ( (line+1) & 0x10 ) >> 1 )|
                ( ( (line+1) & 0x20 ) >> 3 )|
                ( ( (line+1) & 0x40 ) >> 5 )|
                ( ( (line+1) & 0x80 ) >> 7 )
            );

            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);
        _cs=0;
    }
    if(comflag == 0) {
        comflag = 1;
    } else {
        comflag = 0;
    }
}

void AkiSpiLcd::cominvert()
{
    modeflag=0;
    clearflag=0;

    _cs=1;

    _spi.write( (modeflag << 7) | (comflag << 6) | (clearflag << 5) );
    _spi.write(0x00);
    wait_us(5);
    _cs=0;
    if(comflag == 0) {
        comflag = 1;
    } else {
        comflag = 0;
    }
}