Create Library
Diff: MCC0G42005A6W.cpp
- Revision:
- 0:bf6598759869
- Child:
- 1:3ea320ddd830
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MCC0G42005A6W.cpp Mon Dec 07 20:58:00 2020 +0000 @@ -0,0 +1,226 @@ +#include "mbed.h" +#include <stdarg.h> +#include "MCC0G42005A6W.h" + +// Note on I2C pull up resistors These should not be too low otherwise the display will +// not pull the SDA line low enough to register an ACK. Suggest 10K. +// based on Text LCD module "SB1602E" class library @author Tedd OKANO, Masato YAMANISHI & Toyomasa Watarai + + +LCD_COG::LCD_COG( PinName I2C_sda, PinName I2C_scl, const char *init_message ) : i2c_p( new I2C( I2C_sda, I2C_scl ) ), i2c( *i2c_p ), charsInLine( MaxCharsInALine ) +{ + init( init_message ); + +} + +LCD_COG::LCD_COG( I2C &i2c_, const char *init_message ) : i2c_p( NULL ), i2c( i2c_ ), charsInLine( MaxCharsInALine ) +{ + init( init_message ); +} + +LCD_COG::~LCD_COG() +{ + if ( NULL != i2c_p ) + delete i2c_p; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LCD_COG::init( const char *init_message ) +{ + + const char init_seq0[] = { + + 0x3A, // 8-Bit data length extension Bit RE=1; REV=0 send_command(0x3a); // 8bit, 4line, IS=0, RE=1 + // 0x09, // 4 line display //?????? + TOPVIEW, // Bottom view view bottom view(0x06), top view (0x05) BOTTOMVIEW + 0x1E, // Bias setting BS1=1 send_command(0x1e); // set BS1 (1/6 bias) + 0x39, // 8-Bit data length extension Bit RE=0; IS=1 send_command(0x39); // 8bit, 4line, IS=1 , RE=0 + 0x1c, // BS0=1 -> Bias=1/6 send_command(0x1c); // set BS0 (1/6 bias) + osc + 0x6d, // 0110 Set DON and amp ratio send_command(0x6d); // Set DON and amp ratio + 0x5d, // 0101 Set ION, BON, contrast bits 4&5 send_command(0x5d); // Set ION, BON, contrast bits 4&5 + 0x79, // Set contrast (DB3-DB0=C3-C0) send_command(0x79); // Set contrast lower 4bits + 0x38, // 8-Bit data length extension Bit RE=0; IS=0 + Comm_DisplayOnOff, + Comm_ClearDisplay, + Comm_EntryModeSet, + }; + + // i2c_addr = SLAVEADRESS; + + wait( 0.04 ); // 40ms interval after hardware reset + + for ( unsigned int i = 0; i < sizeof( init_seq0 ); i++ ) { + lcd_command( init_seq0[ i ] ); + wait(30e-6);// wait(30e-6); + } + + set_CGRAM( 7, '\x1F' ); + + curs[0] = 0; + curs[1] = 0; + curs[2] = 0; + curs[3] = 0; + + if ( init_message ) { + //i2c.frequency(100000); + puts( 0, init_message ); + curs[0] = 0; +// puts( 1, "Dit is de 2e regel 2" ); curs[1] = 0; +// puts( 2, "Dit is de 3e regel 3" ); curs[2] = 0; +// puts( 3, "Dit is de 4e regel 4" ); curs[3] = 0; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LCD_COG::printf( const char line, const char *format, ... ) +{ + char s[ 32 ]; + va_list args; + + va_start( args, format ); + vsnprintf( s, 32, format, args ); + va_end( args ); + + puts( line, s ); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void LCD_COG::printf( char x, unsigned char y, const char *format, ... ) +{ + char s[ 32 ]; + va_list args; + + va_start( args, format ); + vsnprintf( s, 32, format, args ); + va_end( args ); + + curs[ y ] = x; + puts( y, s ); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LCD_COG::putc( unsigned char line, char c ) +{ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + if ( (c == '\n') || (c == '\r') ) { + clear_rest_of_line( line ); + curs[ line ] = 0; + return; + } + + putcxy( c, curs[line]++, line ); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LCD_COG::puts( char line, const char *s ) +{ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + while ( char c = *s++ ) + putc( line, c ); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LCD_COG::putcxy( char c, unsigned char x, unsigned char y ) +{ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + const char Comm_SetDDRAMAddress = LCD_HOME_L1; + const char DDRAMAddress_Ofst[] = { LINE1, LINE2, LINE3, LINE4 }; + + if ( (x >= charsInLine) || (y >= LINES) ) + return; + + lcd_command( (Comm_SetDDRAMAddress | DDRAMAddress_Ofst[y]) + x ); + lcd_data( c ); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LCD_COG::clear( void ) +{ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + lcd_command( Comm_ClearDisplay ); + wait( 2e-3 ); + curs[ 0 ] = 0; + curs[ 1 ] = 0; + curs[ 2 ] = 0; + curs[ 3 ] = 0; +} +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LCD_COG::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 LCD_COG::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 LCD_COG::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 LCD_COG::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 LCD_COG::clear_rest_of_line( unsigned char line ) +{ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + for ( int i = curs[ line ]; i < charsInLine; i++ ) + putcxy( ' ', i, line ); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +int LCD_COG::lcd_write( char first, char second ) +{ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + char cmd[2]; + + cmd[ 0 ] = first; + cmd[ 1 ] = second; + + return ( i2c.write( SLAVEADRESS, cmd, 2 ) ); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +int LCD_COG::lcd_command( char command ) +{ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + return ( lcd_write( COMMAND, command ) ); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +int LCD_COG::lcd_data( char data ) +{ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + return ( lcd_write( DATA, data ) ); +} +