
Information
This code is old.
Version 2.0 is available.
Latest version has improved usability.
Please find following page.
- Demo program with same functions of TextLCD_SB1602E.
- Component page.
- Library page
Information
このコードは古いバージョンです
バージョン2.0 が公開されています.
新しいバージョンでは使い勝手が改善されています.
以下のページを御覧ください.
- 新ライブラリ対応のデモ・プログラム(機能はこれまでのものと同じです)
- コンポーネント・ページ
Revision 0:694061176edf, committed 2010-01-23
- Comitter:
- okano
- Date:
- Sat Jan 23 13:45:18 2010 +0000
- Commit message:
Changed in this revision
diff -r 000000000000 -r 694061176edf I2cBusDevice.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/I2cBusDevice.h Sat Jan 23 13:45:18 2010 +0000 @@ -0,0 +1,58 @@ +/* + * I2C device base class + * + * A base class for all I2C devices. + * This manages the device address and transfers + * + * Copyright (c) 2010 Tedd OKANO + * Released under the MIT License: http://mbed.org/license/mit + * + * revision 1.0 15-Jan-2010 a. 1st release + * revision 1.1 23-Jan-2010 a. The word "MBED_I2cBusDevice" is used instead of _I2cBusDevice_ to avoid symbol conflict + * b. copyright notice added + */ + +#ifndef MBED_I2cBusDevice +#define MBED_I2cBusDevice + +#include "mbed.h" + +class I2cBusDevice { +public: + + I2cBusDevice( I2C *i2c, char dev_address ) { + bus = i2c; + device = dev_address; + } + + ~I2cBusDevice() { + } + + int write( char *data, int length ) { + return ( bus->write( device, data, length) ); + } + + int read( char *data, int length ) { + return ( bus->read( device, data, length) ); + } + + int read( char reg_ptr, char *data, int length ) { + if ( bus->write( device, ®_ptr, 1 ) ) + return ( 1 ); + + if ( bus->read( device, data, length ) ) + return ( 1 ); + + return ( 0 ); + } + +protected: + I2C *bus; + char device; + +private: + static char i2c_error; +} +; + +#endif
diff -r 000000000000 -r 694061176edf TextLCD_SB1602E.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TextLCD_SB1602E.h Sat Jan 23 13:45:18 2010 +0000 @@ -0,0 +1,239 @@ +/* + * LCD module "SB1602E" library + * + * SB1602E is an I2C based low voltage text LCD panel (based Sitronix ST7032 chip) + * The module by StrawberryLinux + * http://strawberry-linux.com/catalog/items?code=27002 (Online shop page (Japanese)) + * http://strawberry-linux.com/pub/ST7032i.pdf (datasheet of the chip) + * + * This is a library to operate this module easy. + * + * Copyright (c) 2010 Tedd OKANO + * Released under the MIT License: http://mbed.org/license/mit + * + * revision 1.0 22-Jan-2010 a. 1st release + * revision 1.1 23-Jan-2010 a. class name has been changed from lcd_SB1602E to TextLCD_SB1602E + * b. printf() added + * c. copyright notice added + */ + +#ifndef MBED_TextLCD_SB1602E +#define MBED_TextLCD_SB1602E + +#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 TextLCD_SB1602E : I2cBusDevice { +public: + + explicit TextLCD_SB1602E( I2C *i2c, char dev_address = SB1602E_addr, char *init_massage = NULL ) : I2cBusDevice( i2c, 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; + } + + + ~TextLCD_SB1602E() { + } + + void clear( void ) { + lcd_command( Comm_ClearDisplay ); + wait( 2e-3 ); + 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 + + + + + + + +
diff -r 000000000000 -r 694061176edf TextLCD_SB1602E_test.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TextLCD_SB1602E_test.cpp Sat Jan 23 13:45:18 2010 +0000 @@ -0,0 +1,253 @@ +/* + * LCD module "SB1602E" test application + * + * SB1602E is an I2C based low voltage text LCD panel (based Sitronix ST7032 chip) + * The module by StrawberryLinux + * http://strawberry-linux.com/catalog/items?code=27002 (Online shop page (Japanese)) + * http://strawberry-linux.com/pub/ST7032i.pdf (datasheet of the chip) + * + * Copyright (c) 2010 Tedd OKANO + * Released under the MIT License: http://mbed.org/license/mit + * + * revision 1.0 22-Jan-2010 a. 1st release + * revision 1.1 23-Jan-2010 a. class and app name has been changed from lcd_SB1602E to TextLCD_SB1602E + * b. printf() test added + * c. copyright notice added + */ + +#include "mbed.h" +#include "TextLCD_SB1602E.h" + +#define TEST_LOOP 1 +#define DEFAULT_TIME_INTERVAL 1.0 +#define DEFAULT_TIME_INTERVAL_PUTx 0.2 + +#define CONTRAST_ADJUST_TEST +#define PRINTF_TEST +#define CGRAM_FUNCTION_TEST +#define PUTS_TEST_WITH_ESCAPE +#define PUTS_TEST_WITHOUT_ESCAPE +#define PUTC_TEST + + +I2C i2c( p9, p10 ); // sda, scl +Serial pc( USBTX, USBRX ); // tx, rx +TextLCD_SB1602E lcd( &i2c ); + +static char cg[8][8] = {// I hope I can improve this bitmap sometime in future (^^; + { 0x1E, 0x1F, 0x1F, 0x1D, 0x1C, 0x1C, 0x1C, 0x1C }, + { 0x01, 0x02, 0x13, 0x1B, 0x1F, 0x1F, 0x0F, 0x15 }, + { 0x19, 0x1D, 0x1F, 0x0F, 0x1F, 0x0F, 0x1D, 0x18 }, + { 0x1F, 0x1D, 0x16, 0x1E, 0x17, 0x1F, 0x1A, 0x1C }, + { 0x1E, 0x1F, 0x07, 0x07, 0x1F, 0x1E, 0x00, 0x00 }, + { 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55 }, + { 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, +}; + +void lcd_test( void ); +void set_lines_fixed_value( char line, char value ); +void block_pattaern( char direction, char polarity ); + + +int main() { + lcd.puts( 0, "TextLCD_SB1602E \r" ); + + for ( int i = 10; i > 0; i-- ) { + lcd.printf( 1, " count down: %2d\r", i ); + wait( 1.0 ); + } + + do { + lcd_test(); + } while ( TEST_LOOP ); +} + +void lcd_test( void ) { + char s[ 18 ]; + int i; + + pc.printf( "LCD test runing\n" ); + lcd.contrast( default_Contrast ); + +#ifdef CONTRAST_ADJUST_TEST + pc.printf( " CONTRAST_ADJUST_TEST\n" ); + lcd.clear(); + lcd.puts( 1, "\x07\x07\x07\x07\x07 contrast()\r" ); + wait( DEFAULT_TIME_INTERVAL ); + + lcd.puts( 0, "ABCDEFGHIJKLMNOP\r" ); + + for ( int t = 0; t < 2; t++ ) { + for ( i = 0; i <= 0x3F; i++ ) { + + lcd.printf( 1, " cntrst = 0x%02X\r", i ); + lcd.contrast( i ); + wait ( 0.02 ); + } + + for ( i = 0x3E; i > 0 ; i-- ) { + sprintf( s, " cntrst = 0x%02X\r", i ); + lcd.puts( 1, s ); + lcd.contrast( i ); + wait ( 0.02 ); + } + + } + + lcd.contrast( default_Contrast ); + +#endif +#ifdef PRINTF_TEST + + pc.printf( " PRINTF_TEST\n" ); + lcd.clear(); + lcd.puts( 1, "\x07\x07\x07\x07\x07\x07\x07 printf()\r" ); + wait( DEFAULT_TIME_INTERVAL ); + + lcd.printf( 0, "%%6.4f, %%c, %%X\"\r" ); + for ( i = -37; i < 37; i++ ) { + lcd.printf( 1, "%6.4f, %c, %x\r", (float)i / 37.0, 'a' + i, i + 37 ); + wait ( 0.1 ); + } + +#endif +#ifdef CGRAM_FUNCTION_TEST + pc.printf( " CGRAM_FUNCTION_TEST\n" ); + lcd.clear(); + lcd.puts( 1, "\x07\x07\x07\x07 set_CGRAM()\r" ); + wait( DEFAULT_TIME_INTERVAL ); + + for ( i = 0; i < 8; i++ ) + lcd.put_custom_char( i, cg[ i ], i, 0 ); + + for ( i = 0; i < 8; i++ ) + lcd.put_custom_char( i, cg[ i ], i + 8, 0 ); + + for ( i = 0; i < 8; i++ ) + lcd.put_custom_char( i, cg[ i ], i, 1 ); + + for ( i = 0; i < 8; i++ ) + lcd.put_custom_char( i, cg[ i ], i + 8, 1 ); + + wait( DEFAULT_TIME_INTERVAL ); + lcd.clear(); + lcd.set_CGRAM( 7, '\x1F' ); + + lcd.set_CGRAM( 0, '\0' ); + lcd.set_CGRAM( 1, '\0' ); + lcd.set_CGRAM( 0, '\0' ); + lcd.set_CGRAM( 1, '\0' ); + set_lines_fixed_value( 0, 1 ); + set_lines_fixed_value( 1, 0 ); + + block_pattaern( 0, 0 ); + block_pattaern( 0, 1 ); + block_pattaern( 1, 0 ); + block_pattaern( 1, 1 ); + + +#endif +#ifdef PUTS_TEST_WITH_ESCAPE + pc.printf( " PUTS_TEST_WITH_ESCAPE\n" ); + lcd.clear(); + lcd.puts( 1, "\x07\x07\x07 puts(\"..\\r\")\r" ); + wait( DEFAULT_TIME_INTERVAL ); + + lcd.puts( 0, "\rWelcome to mbed!\r" ); + lcd.puts( 1, "\rwww.mbed.com\r" ); + wait( DEFAULT_TIME_INTERVAL ); + lcd.puts( 0, " This is a\r" ); + lcd.puts( 1, " LCD test\r" ); + wait( DEFAULT_TIME_INTERVAL ); + lcd.puts( 0, " 22-Jan-2010\r" ); + lcd.puts( 1, " Hello world!\r" ); + wait( DEFAULT_TIME_INTERVAL ); + +#endif +#ifdef PUTS_TEST_WITHOUT_ESCAPE + pc.printf( " PUTS_TEST_WITHOUT_ESCAPE\n" ); + lcd.clear(); + lcd.puts( 0, "\r" ); + lcd.puts( 1, "\x07\x07\x07\x07\x07 puts(\"..\")\r" ); + wait( DEFAULT_TIME_INTERVAL ); + + lcd.puts( 0, "0" ); + lcd.puts( 1, "ABC" ); + wait( DEFAULT_TIME_INTERVAL_PUTx ); + lcd.puts( 0, "1" ); + lcd.puts( 1, "DEF" ); + wait( DEFAULT_TIME_INTERVAL_PUTx ); + lcd.puts( 0, "2" ); + lcd.puts( 1, "GHI" ); + wait( DEFAULT_TIME_INTERVAL_PUTx ); + lcd.puts( 0, "3" ); + lcd.puts( 1, "JKL" ); + wait( DEFAULT_TIME_INTERVAL_PUTx ); + lcd.puts( 0, "4" ); + lcd.puts( 1, "MNO" ); + wait( DEFAULT_TIME_INTERVAL_PUTx ); + lcd.puts( 0, "5" ); + lcd.puts( 1, "PQR" ); + wait( DEFAULT_TIME_INTERVAL_PUTx ); + lcd.puts( 0, "6" ); + wait( DEFAULT_TIME_INTERVAL_PUTx ); + lcd.puts( 0, "7" ); + wait( DEFAULT_TIME_INTERVAL_PUTx ); + lcd.puts( 0, "8" ); + wait( DEFAULT_TIME_INTERVAL_PUTx ); + lcd.puts( 0, "9" ); + wait( DEFAULT_TIME_INTERVAL_PUTx ); + lcd.puts( 0, "A" ); + wait( DEFAULT_TIME_INTERVAL_PUTx ); + lcd.puts( 0, "B" ); + wait( DEFAULT_TIME_INTERVAL_PUTx ); + lcd.puts( 0, "C" ); + wait( DEFAULT_TIME_INTERVAL_PUTx ); + lcd.puts( 0, "D" ); + wait( DEFAULT_TIME_INTERVAL_PUTx ); + lcd.puts( 0, "E" ); + wait( DEFAULT_TIME_INTERVAL_PUTx ); + lcd.puts( 0, "F" ); + wait( DEFAULT_TIME_INTERVAL_PUTx ); + +#endif +#ifdef PUTC_TEST + pc.printf( " PUTC_TEST\n" ); + lcd.clear(); + lcd.puts( 1, "\x07\x07\x07\x07\x07\x07\x07\x07\x07 putc()\r" ); + wait( DEFAULT_TIME_INTERVAL ); + + for ( i = 0; i < 16; i++ ) { + lcd.putc( 0, '0' + i ); + lcd.putc( 1, 'A' + i ); + wait( DEFAULT_TIME_INTERVAL_PUTx ); + } +#endif +} + +void set_lines_fixed_value( char line, char value ) { + for ( int i = 0; i < 16; i++ ) + lcd.putc( line, value ); + + lcd.puts( line, "\r" ); +} + + +void block_pattaern( char direction, char polarity ) { + char c[ 8 ]; + + for ( int x = 0; x < 2; x++ ) { + for ( int i = 0; i < 8; i++ ) { + for ( int j = 0; j < 8; j++ ) { + if ( j <= i ) + c[ (direction ? j : 7 - j) ] = (polarity ? 0x00: ~0x00 ); + else + c[ (direction ? j : 7 - j) ] = (polarity ? ~0x00 : 0x00 ); + } + + lcd.set_CGRAM( (x ? (direction ? 0 : 1) : (direction ? 1 : 0)), c ); + wait( 0.05 ); + } + } +}
diff -r 000000000000 -r 694061176edf mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Sat Jan 23 13:45:18 2010 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/49a220cc26e0