Dependencies:   mbed

Information

This code is old.

Version 2.0 is available.
Latest version has improved usability.
Please find following page.

Information

このコードは古いバージョンです

バージョン2.0 が公開されています.
新しいバージョンでは使い勝手が改善されています.
以下のページを御覧ください.

Files at this revision

API Documentation at this revision

Comitter:
okano
Date:
Sat Jan 23 13:45:18 2010 +0000
Commit message:

Changed in this revision

I2cBusDevice.h Show annotated file Show diff for this revision Revisions of this file
TextLCD_SB1602E.h Show annotated file Show diff for this revision Revisions of this file
TextLCD_SB1602E_test.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /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, &reg_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
--- /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
+
+
+
+
+
+
+
+
--- /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 );
+        }
+    }
+}
--- /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