Create Library
MCC0G42005A6W.cpp
- Committer:
- qynx
- Date:
- 2021-04-13
- Revision:
- 1:3ea320ddd830
- Parent:
- 0:bf6598759869
File content as of revision 1:3ea320ddd830:
#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 ); i2c.frequency(50000); } LCD_COG::LCD_COG( I2C &i2c_, const char *init_message ) : i2c_p( NULL ), i2c( i2c_ ), charsInLine( MaxCharsInALine ) { init( init_message ); i2c.frequency(50000); } 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);// // 30e-6 0.00003 30ns ? } 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 ); // 2e-3 0.002 2ms 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 ) ); }