Accel
Dependencies: mbed PowerControl SDFileSystem
Fork of HeptaAccel by
Diff: hepta_sat/HeptaLcd.h
- Revision:
- 0:d721efd58e4e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hepta_sat/HeptaLcd.h Fri Dec 09 03:40:15 2016 +0000 @@ -0,0 +1,242 @@ +#ifndef MBED_HeptaLcd +#define MBED_HeptaLcd + +#include <stdarg.h> +#include "mbed.h" +#include "I2cBusDevice.h" + +// SB1602E IIC address + +const char SB1602E_addr = 0x7C; + +// SB1602E initialization command sequence + +#ifdef INIT_VALUE_DATASHEET_ORIGINAL + +const char Comm_FunctionSet_Normal = 0x38; +const char Comm_FunctionSet_Extended = 0x39; +const char Comm_InternalOscFrequency = 0x14; +const char Comm_ContrastSet = 0x78; +const char Comm_PwrIconContrast = 0x5E; +const char Comm_FollowerCtrl = 0x6A; +const char Comm_DisplayOnOff = 0x0C; +const char Comm_ClearDisplay = 0x01; +const char Comm_EntryModeSet = 0x06; + +#else + +const char Comm_FunctionSet_Normal = 0x38; +const char Comm_FunctionSet_Extended = 0x39; +const char Comm_InternalOscFrequency = 0x14; +const char Comm_ContrastSet = 0x70; +const char Comm_PwrIconContrast = 0x5C; +const char Comm_FollowerCtrl = 0x60; +const char Comm_DisplayOnOff = 0x0C; +const char Comm_ClearDisplay = 0x01; +const char Comm_EntryModeSet = 0x04; +const char Comm_ReturnHome = 0x02; + +#endif + +// SB1602E general commands + +const char Comm_SetDDRAMAddress = 0x80; +const char DDRAMAddress_Ofst[] = { 0x00, 0x40 }; + +const char Comm_SetCGRAM = 0x40; + +// SB1602E setting values + +const char default_Contrast = 0x35; + +const char COMMAND = 0x00; +const char DATA = 0x40; + +const char MaxCharsInALine = 0x10; // buffer deoth for one line (no scroll function used) + +const char init_seq0_length = 7; +const char init_seq0[ init_seq0_length ] += { + Comm_FunctionSet_Normal, + Comm_ReturnHome, // This may be required to reset the scroll function + Comm_FunctionSet_Extended, + Comm_InternalOscFrequency, + Comm_ContrastSet | ( default_Contrast & 0xF), + Comm_PwrIconContrast | ((default_Contrast >> 4) & 0x3), + Comm_FollowerCtrl | 0x0A, + +}; +// required 30us interval + +const char init_seq1_length = 3; +const char init_seq1[ init_seq1_length ] += { + Comm_DisplayOnOff, + Comm_ClearDisplay, + Comm_EntryModeSet, +}; +// required 30us, 2ms interval + + +class HeptaLcd : I2cBusDevice { +public: + I2C lcd; + int addr; + explicit HeptaLcd(PinName sda, PinName scl, char dev_address = SB1602E_addr, char *init_massage = " " ) : lcd(sda,scl),addr(dev_address),I2cBusDevice(&lcd, dev_address ) { + wait( 0.04 ); // interval after hardware reset + + for ( int i = 0; i < init_seq0_length; i++ ) { + lcd_command( init_seq0[ i ] ); + wait( 30e-6 ); + } + + wait( 0.2 ); + + for ( int i = 0; i < init_seq1_length; i++ ) { + lcd_command( init_seq1[ i ] ); + wait( 2e-3 ); + } + + if ( init_massage ) + puts( 0, init_massage ); + + set_CGRAM( 7, '\x1F' ); + + curs[ 0 ] = 0; + curs[ 1 ] = 0; + } + + + ~HeptaLcd() { + } + + void clear( void ) { + lcd_command( Comm_ClearDisplay ); + wait( 2e-3 ); + curs[ 0 ] = 0; + curs[ 1 ] = 0; + } + + void initilize(){ + char *init_massage = " "; + for ( int i = 0; i < init_seq0_length; i++ ) { + lcd_command( init_seq0[ i ] ); + wait( 30e-6 ); + } + + wait( 0.2 ); + + for ( int i = 0; i < init_seq1_length; i++ ) { + lcd_command( init_seq1[ i ] ); + wait( 2e-3 ); + } + + if ( init_massage ) + puts( 0, init_massage ); + + set_CGRAM( 7, '\x1F' ); + + curs[ 0 ] = 0; + curs[ 1 ] = 0; + } + void put_custom_char( char c_code, const char *cg, char x, char y ) { + for ( int i = 0; i < 5; i++ ) { + set_CGRAM( c_code, cg ); + putcxy( c_code, x, y ); + } + } + + void contrast( char contrast ) { + lcd_command( Comm_FunctionSet_Extended ); + lcd_command( Comm_ContrastSet | (contrast & 0x0f) ); + lcd_command( Comm_PwrIconContrast | ((contrast>>4) & 0x03) ); + lcd_command( Comm_FunctionSet_Normal ); + } + + void set_CGRAM( char char_code, const char* cg ) { + for ( int i = 0; i < 8; i++ ) { + lcd_command( (Comm_SetCGRAM | (char_code << 3) | i) ); + lcd_data( *cg++ ); + } + } + + void set_CGRAM( char char_code, char v ) { + char c[ 8 ]; + + for ( int i = 0; i < 8; i++ ) + c[ i ] = v; + + set_CGRAM( char_code, c ); + } + + void putcxy( char c, char x, char y ) { + if ( (x >= MaxCharsInALine) || (y >= 2) ) + return; + + lcd_command( (Comm_SetDDRAMAddress | DDRAMAddress_Ofst[ y ]) + x ); + lcd_data( c ); + } + + void putc( char line, char c ) { + if ( (c == '\n') || (c == '\r') ) { + clear_lest_of_line( line ); + curs[ line ] = 0; + return; + } + + putcxy( c, curs[ line ]++, line ); + } + + void puts( char line, char *s ) { + while ( char c = *s++ ) + putc( line, c ); + } + + void printf( char line, char *format, ... ) { + char s[ 32 ]; + va_list args; + + va_start( args, format ); + vsnprintf( s, 32, format, args ); + va_end( args ); + + puts( line, s ); + } + +private: + char curs[2]; + + void clear_lest_of_line( char line ) { + for ( int i = curs[ line ]; i < MaxCharsInALine; i++ ) + putcxy( ' ', i, line ); + } + + int lcd_write( char first, char second ) { + char cmd[2]; + + cmd[ 0 ] = first; + cmd[ 1 ] = second; + + return ( write( cmd, 2 ) ); + + } + + int lcd_command( char command ) { + return ( lcd_write( COMMAND, command ) ); + } + + int lcd_data( char data ) { + return ( lcd_write( DATA, data ) ); + } +} +; + +#endif + + + + + + + +