light text library for 5110 nokia lcd * easy to modify * proportional font, bold / inverse modes * easy to add / change fonts * fixed rows for fast update

Library finished! :-) If you use 5110 and need fast menus - try this library. No overhead - small and robust, optimized for this display type only, fast update. Nice looking font. Power management. Displays from 5110 and 3110 are cheap as dirt :-)

Revision:
1:cce4622d70f6
Parent:
0:0a6619901f2e
Child:
2:65df20ffef51
--- a/medvdv5110.cpp	Sat Jul 14 17:52:11 2012 +0000
+++ b/medvdv5110.cpp	Tue Sep 25 16:03:34 2012 +0000
@@ -1,123 +1,127 @@
 //
 // 5110 LCD Driver
-// (c) 2012 medvdv.com  
+// (c) 2012 medvdv.com
 // Alexander Medvedev
 //
 
 #include "mbed.h"
 #include "medvdv5110.h"
 
-const char lcd_font8p_widths[] = { 
-    2, 1, 3, 5, 5, 5, 5, 1, 2, 2, 5, 5, 4, 
-    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 6, 5, 6, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 3, 
+const char lcd_font8p_widths[] = {
+    2, 1, 3, 5, 5, 5, 5, 1, 2, 2, 5, 5, 4,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 6, 5, 6, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 3,
     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    1, 3, 4, 1, 5, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 4, 4, 4, 2, 4, 5, 4 };
+    1, 3, 4, 1, 5, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 4, 4, 4, 2, 4, 5, 4
+};
 
 const char* lcd_font8p[] = {
-(const char[]){ 0x00, 0x00 },
-(const char[]){ 0x2F },                      
-(const char[]){ 0x03, 0x00, 0x03 },            
-(const char[]){ 0x14, 0x3E, 0x14, 0x3E, 0x14 },
-(const char[]){ 0x24, 0x6A, 0x3E, 0x2B, 0x12 },
-(const char[]){ 0x22, 0x10, 0x08, 0x04, 0x22 },
-(const char[]){ 0x14, 0x2A, 0x2A, 0x14, 0x20 },
-(const char[]){ 0x03 },                        
-(const char[]){ 0x1E, 0x21 },                  
-(const char[]){ 0x21, 0x1E },                  
-(const char[]){ 0x14, 0x08, 0x3E, 0x08, 0x14 }, 
-(const char[]){ 0x08, 0x08, 0x3E, 0x08, 0x08 },
-(const char[]){ 0x00, 0x80, 0x70, 0x30 },      
-(const char[]){ 0x08, 0x08, 0x08, 0x08, 0x08 }, 
-(const char[]){ 0x00, 0x00, 0x30, 0x30, 0x00 },
-(const char[]){ 0x20, 0x10, 0x08, 0x04, 0x02 },
-(const char[]){ 0x1E, 0x31, 0x2D, 0x23, 0x1E },
-(const char[]){ 0x00, 0x00, 0x02, 0x3F, 0x00 }, 
-(const char[]){ 0x22, 0x31, 0x29, 0x25, 0x22 },
-(const char[]){ 0x12, 0x21, 0x25, 0x25, 0x1A }, 
-(const char[]){ 0x18, 0x14, 0x12, 0x3F, 0x10 }, 
-(const char[]){ 0x17, 0x25, 0x25, 0x25, 0x19 },
-(const char[]){ 0x1E, 0x25, 0x25, 0x25, 0x18 },
-(const char[]){ 0x01, 0x01, 0x39, 0x05, 0x03 },
-(const char[]){ 0x1A, 0x25, 0x25, 0x25, 0x1A }, 
-(const char[]){ 0x06, 0x29, 0x29, 0x29, 0x1E },
-(const char[]){ 0x00, 0x00, 0x36, 0x36 },
-(const char[]){ 0x00, 0x80, 0x76, 0x36 }, 
-(const char[]){ 0x08, 0x08, 0x14, 0x14, 0x22, 0x22 },
-(const char[]){ 0x14, 0x14, 0x14, 0x14, 0x14 },
-(const char[]){ 0x22, 0x22, 0x14, 0x14, 0x08, 0x08 },
-(const char[]){ 0x02, 0x01, 0x29, 0x05, 0x02 },
-(const char[]){ 0x3E, 0x41, 0x5D, 0x55, 0x5E, 0x20 },
-(const char[]){ 0x3E, 0x09, 0x09, 0x09, 0x3E },
-(const char[]){ 0x3F, 0x25, 0x25, 0x25, 0x1A }, 
-(const char[]){ 0x1E, 0x21, 0x21, 0x21, 0x12 }, 
-(const char[]){ 0x3F, 0x21, 0x21, 0x22, 0x1C },  
-(const char[]){ 0x3F, 0x25, 0x25, 0x25, 0x21 }, 
-(const char[]){ 0x3F, 0x05, 0x05, 0x05, 0x01 },  
-(const char[]){ 0x1E, 0x21, 0x21, 0x29, 0x1A },  
-(const char[]){ 0x3F, 0x04, 0x04, 0x04, 0x3F },  
-(const char[]){ 0x21, 0x3F, 0x21 },            
-(const char[]){ 0x18, 0x20, 0x21, 0x1F, 0x01 }, 
-(const char[]){ 0x3F, 0x04, 0x04, 0x0A, 0x31 }, 
-(const char[]){ 0x3F, 0x20, 0x20, 0x20, 0x20 }, 
-(const char[]){ 0x3F, 0x02, 0x04, 0x02, 0x3F }, 
-(const char[]){ 0x3F, 0x02, 0x04, 0x08, 0x3F },  
-(const char[]){ 0x1E, 0x21, 0x21, 0x21, 0x1E },  
-(const char[]){ 0x3F, 0x09, 0x09, 0x09, 0x06 },  
-(const char[]){ 0x1E, 0x21, 0x29, 0x31, 0x3E }, 
-(const char[]){ 0x3F, 0x09, 0x09, 0x19, 0x26 }, 
-(const char[]){ 0x12, 0x25, 0x25, 0x25, 0x1A }, 
-(const char[]){ 0x01, 0x01, 0x3F, 0x01, 0x01 }, 
-(const char[]){ 0x1F, 0x20, 0x20, 0x20, 0x1F },  
-(const char[]){ 0x03, 0x0C, 0x30, 0x0C, 0x03 },  
-(const char[]){ 0x1F, 0x20, 0x18, 0x20, 0x1F }, 
-(const char[]){ 0x21, 0x12, 0x0C, 0x12, 0x21 },  
-(const char[]){ 0x03, 0x04, 0x38, 0x04, 0x03 },  
-(const char[]){ 0x31, 0x29, 0x25, 0x23, 0x21 },  
-(const char[]){ 0x00, 0x3F, 0x21, 0x21 },  
-(const char[]){ 0x02, 0x04, 0x08, 0x10, 0x20 },  
-(const char[]){ 0x00, 0x00, 0x21, 0x21, 0x3F },  
-(const char[]){ 0x04, 0x02, 0x01, 0x02, 0x04 },  
-(const char[]){ 0x20, 0x20, 0x20, 0x20, 0x20 },
-(const char[]){ 0x00, 0x01, 0x03, 0x04 },
-(const char[]){ 0x10, 0x2A, 0x2A, 0x3C }, 
-(const char[]){ 0x3F, 0x24, 0x22, 0x1C },  
-(const char[]){ 0x1C, 0x22, 0x22, 0x14 },  
-(const char[]){ 0x1C, 0x22, 0x24, 0x3F },  
-(const char[]){ 0x1C, 0x2A, 0x2A, 0x2C },   
-(const char[]){ 0x3E, 0x09, 0x01, 0x02 },   
-(const char[]){ 0x0C, 0x52, 0x4A, 0x3C },   
-(const char[]){ 0x3F, 0x04, 0x02, 0x3C },  
-(const char[]){ 0x3D }, 
-(const char[]){ 0x40, 0x40, 0x3D },  
-(const char[]){ 0x3F, 0x08, 0x0C, 0x32 },  
-(const char[]){ 0x3F }, 
-(const char[]){ 0x3C, 0x02, 0x3C, 0x02, 0x3C }, 
-(const char[]){ 0x3C, 0x02, 0x02, 0x3C },  
-(const char[]){ 0x1C, 0x22, 0x22, 0x1C },  
-(const char[]){ 0x7E, 0x22, 0x22, 0x1C },  
-(const char[]){ 0x1C, 0x22, 0x22, 0x7E },  
-(const char[]){ 0x02, 0x3C, 0x02, 0x02 }, 
-(const char[]){ 0x24, 0x2A, 0x2A, 0x12 }, 
-(const char[]){ 0x02, 0x1F, 0x22, 0x22 },  
-(const char[]){ 0x1E, 0x20, 0x20, 0x3E },  
-(const char[]){ 0x06, 0x18, 0x20, 0x3C, 0x02 },  
-(const char[]){ 0x1E, 0x20, 0x1C, 0x20, 0x1E },  
-(const char[]){ 0x22, 0x14, 0x08, 0x14, 0x22 },  
-(const char[]){ 0x0E, 0x50, 0x50, 0x3E },  
-(const char[]){ 0x22, 0x32, 0x2A, 0x26 },  
-(const char[]){ 0x00, 0x08, 0x36, 0x41 },   
-(const char[]){ 0x00, 0x7F },  
-(const char[]){ 0x00, 0x41, 0x36, 0x08 }, 
-(const char[]){ 0x08, 0x04, 0x08, 0x10, 0x08 },
-(const char[]){ 0x2A, 0x55, 0x2A, 0x55 } };
+    (const char[]){ 0x00, 0x00 },
+    (const char[]){ 0x2F },
+    (const char[]){ 0x03, 0x00, 0x03 },
+    (const char[]){ 0x14, 0x3E, 0x14, 0x3E, 0x14 },
+    (const char[]){ 0x24, 0x6A, 0x3E, 0x2B, 0x12 },
+    (const char[]){ 0x22, 0x10, 0x08, 0x04, 0x22 },
+    (const char[]){ 0x14, 0x2A, 0x2A, 0x14, 0x20 },
+    (const char[]){ 0x03 },
+    (const char[]){ 0x1E, 0x21 },
+    (const char[]){ 0x21, 0x1E },
+    (const char[]){ 0x14, 0x08, 0x3E, 0x08, 0x14 },
+    (const char[]){ 0x08, 0x08, 0x3E, 0x08, 0x08 },
+    (const char[]){ 0x00, 0x80, 0x70, 0x30 },
+    (const char[]){ 0x08, 0x08, 0x08, 0x08, 0x08 },
+    (const char[]){ 0x00, 0x00, 0x30, 0x30, 0x00 },
+    (const char[]){ 0x20, 0x10, 0x08, 0x04, 0x02 },
+    (const char[]){ 0x1E, 0x31, 0x2D, 0x23, 0x1E },
+    (const char[]){ 0x00, 0x00, 0x02, 0x3F, 0x00 },
+    (const char[]){ 0x22, 0x31, 0x29, 0x25, 0x22 },
+    (const char[]){ 0x12, 0x21, 0x25, 0x25, 0x1A },
+    (const char[]){ 0x18, 0x14, 0x12, 0x3F, 0x10 },
+    (const char[]){ 0x17, 0x25, 0x25, 0x25, 0x19 },
+    (const char[]){ 0x1E, 0x25, 0x25, 0x25, 0x18 },
+    (const char[]){ 0x01, 0x01, 0x39, 0x05, 0x03 },
+    (const char[]){ 0x1A, 0x25, 0x25, 0x25, 0x1A },
+    (const char[]){ 0x06, 0x29, 0x29, 0x29, 0x1E },
+    (const char[]){ 0x00, 0x00, 0x36, 0x36 },
+    (const char[]){ 0x00, 0x80, 0x76, 0x36 },
+    (const char[]){ 0x08, 0x08, 0x14, 0x14, 0x22, 0x22 },
+    (const char[]){ 0x14, 0x14, 0x14, 0x14, 0x14 },
+    (const char[]){ 0x22, 0x22, 0x14, 0x14, 0x08, 0x08 },
+    (const char[]){ 0x02, 0x01, 0x29, 0x05, 0x02 },
+    (const char[]){ 0x3E, 0x41, 0x5D, 0x55, 0x5E, 0x20 },
+    (const char[]){ 0x3E, 0x09, 0x09, 0x09, 0x3E },
+    (const char[]){ 0x3F, 0x25, 0x25, 0x25, 0x1A },
+    (const char[]){ 0x1E, 0x21, 0x21, 0x21, 0x12 },
+    (const char[]){ 0x3F, 0x21, 0x21, 0x22, 0x1C },
+    (const char[]){ 0x3F, 0x25, 0x25, 0x25, 0x21 },
+    (const char[]){ 0x3F, 0x05, 0x05, 0x05, 0x01 },
+    (const char[]){ 0x1E, 0x21, 0x21, 0x29, 0x1A },
+    (const char[]){ 0x3F, 0x04, 0x04, 0x04, 0x3F },
+    (const char[]){ 0x21, 0x3F, 0x21 },
+    (const char[]){ 0x18, 0x20, 0x21, 0x1F, 0x01 },
+    (const char[]){ 0x3F, 0x04, 0x04, 0x0A, 0x31 },
+    (const char[]){ 0x3F, 0x20, 0x20, 0x20, 0x20 },
+    (const char[]){ 0x3F, 0x02, 0x04, 0x02, 0x3F },
+    (const char[]){ 0x3F, 0x02, 0x04, 0x08, 0x3F },
+    (const char[]){ 0x1E, 0x21, 0x21, 0x21, 0x1E },
+    (const char[]){ 0x3F, 0x09, 0x09, 0x09, 0x06 },
+    (const char[]){ 0x1E, 0x21, 0x29, 0x31, 0x3E },
+    (const char[]){ 0x3F, 0x09, 0x09, 0x19, 0x26 },
+    (const char[]){ 0x12, 0x25, 0x25, 0x25, 0x1A },
+    (const char[]){ 0x01, 0x01, 0x3F, 0x01, 0x01 },
+    (const char[]){ 0x1F, 0x20, 0x20, 0x20, 0x1F },
+    (const char[]){ 0x03, 0x0C, 0x30, 0x0C, 0x03 },
+    (const char[]){ 0x1F, 0x20, 0x18, 0x20, 0x1F },
+    (const char[]){ 0x21, 0x12, 0x0C, 0x12, 0x21 },
+    (const char[]){ 0x03, 0x04, 0x38, 0x04, 0x03 },
+    (const char[]){ 0x31, 0x29, 0x25, 0x23, 0x21 },
+    (const char[]){ 0x00, 0x3F, 0x21, 0x21 },
+    (const char[]){ 0x02, 0x04, 0x08, 0x10, 0x20 },
+    (const char[]){ 0x00, 0x00, 0x21, 0x21, 0x3F },
+    (const char[]){ 0x04, 0x02, 0x01, 0x02, 0x04 },
+    (const char[]){ 0x20, 0x20, 0x20, 0x20, 0x20 },
+    (const char[]){ 0x00, 0x01, 0x03, 0x04 },
+    (const char[]){ 0x10, 0x2A, 0x2A, 0x3C },
+    (const char[]){ 0x3F, 0x24, 0x22, 0x1C },
+    (const char[]){ 0x1C, 0x22, 0x22, 0x14 },
+    (const char[]){ 0x1C, 0x22, 0x24, 0x3F },
+    (const char[]){ 0x1C, 0x2A, 0x2A, 0x2C },
+    (const char[]){ 0x3E, 0x09, 0x01, 0x02 },
+    (const char[]){ 0x0C, 0x52, 0x4A, 0x3C },
+    (const char[]){ 0x3F, 0x04, 0x02, 0x3C },
+    (const char[]){ 0x3D },
+    (const char[]){ 0x40, 0x40, 0x3D },
+    (const char[]){ 0x3F, 0x08, 0x0C, 0x32 },
+    (const char[]){ 0x3F },
+    (const char[]){ 0x3C, 0x02, 0x3C, 0x02, 0x3C },
+    (const char[]){ 0x3C, 0x02, 0x02, 0x3C },
+    (const char[]){ 0x1C, 0x22, 0x22, 0x1C },
+    (const char[]){ 0x7E, 0x22, 0x22, 0x1C },
+    (const char[]){ 0x1C, 0x22, 0x22, 0x7E },
+    (const char[]){ 0x02, 0x3C, 0x02, 0x02 },
+    (const char[]){ 0x24, 0x2A, 0x2A, 0x12 },
+    (const char[]){ 0x02, 0x1F, 0x22, 0x22 },
+    (const char[]){ 0x1E, 0x20, 0x20, 0x3E },
+    (const char[]){ 0x06, 0x18, 0x20, 0x3C, 0x02 },
+    (const char[]){ 0x1E, 0x20, 0x1C, 0x20, 0x1E },
+    (const char[]){ 0x22, 0x14, 0x08, 0x14, 0x22 },
+    (const char[]){ 0x0E, 0x50, 0x50, 0x3E },
+    (const char[]){ 0x22, 0x32, 0x2A, 0x26 },
+    (const char[]){ 0x00, 0x08, 0x36, 0x41 },
+    (const char[]){ 0x00, 0x7F },
+    (const char[]){ 0x00, 0x41, 0x36, 0x08 },
+    (const char[]){ 0x08, 0x04, 0x08, 0x10, 0x08 },
+    (const char[]) {
+        0x2A, 0x55, 0x2A, 0x55
+    }
+};
 
-// Internals 
+// Internals
 
 void lcd5110::write(char data, bool cmd)
 {
     sce -> write(0);
     dc -> write(cmd ? 0:1);
-    spi -> write(data); 
+    spi -> write(data);
     sce -> write(1);
 }
 
@@ -126,19 +130,19 @@
 lcd5110::lcd5110(PinName mosi, PinName sclk, PinName dc, PinName sce, PinName rst)
 {
     spi = new SPI(mosi, NC, sclk);
-    
+
     spi -> format(8, 1);
     spi -> frequency(4000000);
-    
+
     this -> rst = new DigitalOut(rst);
     this -> sce = new DigitalOut(sce);
     this -> dc  = new DigitalOut(dc);
-    
+
     font.first_code = 32;
     font.glyphs_total = 128 - 32;
     font.widths = lcd_font8p_widths;
     font.glyphs = lcd_font8p;
-    
+
     invert = false;
     bold = false;
 }
@@ -165,8 +169,8 @@
     write(0x20, true);
     write(0x0C, true);
     XY();
-}  
-     
+}
+
 void lcd5110::Contrast(char contrast)
 {
     this -> contrast = contrast;
@@ -178,7 +182,7 @@
 void lcd5110::Init()
 {
     contrast = DEFAULT_CONTRAST;
-    Reset();    
+    Reset();
 }
 
 void lcd5110::PowerOff()
@@ -198,19 +202,20 @@
     if (x>83) x=83;
     if (y<0)  y=0;
     if (y>5)  y=5;
-    
-    X = x; 
+
+    X = x;
     Y = y;
-    
+
     write( 0x80 | (x & 0x3f), true);
     write( 0x40 | (y & 0x3f), true);
 }
- 
+
 void lcd5110::Write(char byte)
-{ 
+{
     write(invert?(~byte):byte, false);
-    if (++X > 83) { 
-        X=0; if (++Y > 5) Y=0;
+    if (++X > 83) {
+        X=0;
+        if (++Y > 5) Y=0;
     }
 }
 
@@ -221,33 +226,39 @@
 
 void lcd5110::Write2(char* data, int size)
 {
-    for(int i=0; i<size; i++) { Write(data[i]); Write(data[i]); }
+    for(int i=0; i<size; i++) {
+        Write(data[i]);
+        Write(data[i]);
+    }
 }
-    
+
 void lcd5110::Write(char byte, int count)
 {
     for(int i=0; i<count; i++) Write(byte);
 }
-   
+
 void lcd5110::Character(char chr)
 {
     if( chr < font.first_code ) return;
     if( chr > font.first_code + font.glyphs_total - 1 ) return;
-    
+
     chr -= font.first_code;
-    
+
     int width = font.widths[chr];
-    
+
     if (bold) width*=2;
-    
+
     if ((X + width) > 83) {
         if (++Y > 5) Y = 0;
         XY(0,Y);
     }
-    
+
     if (bold) {
         Write2( (char*) font.glyphs[chr], (int) font.widths[chr] );
-        if (X != 0) { Write( 0 ); Write( 0 ); }
+        if (X != 0) {
+            Write( 0 );
+            Write( 0 );
+        }
     } else {
         Write( (char*) font.glyphs[chr], (int) font.widths[chr] );
         if (X != 0) Write( 0 );
@@ -258,10 +269,10 @@
 {
     if( chr < font.first_code ) return 0;
     if( chr > font.first_code + font.glyphs_total - 1 ) return 0;
-    
+
     chr -= font.first_code;
-    
-    if (bold) 
+
+    if (bold)
         return 2 * (font.widths[chr] + 1);
     else
         return font.widths[chr] + 1;
@@ -275,9 +286,9 @@
 int lcd5110::StringWidth(char* str)
 {
     int width = 0;
-    
+
     while(*str) width += CharacterWidth(*str++);
-    
+
     return width;
 }
 
@@ -286,16 +297,16 @@
     XY(0, Y);
     Write((char) 0, 84);
     XY(0, Y);
-    String(str);    
+    String(str);
 }
 
 lcd5110::~lcd5110()
 {
     delete spi;
-    
+
     delete rst;
     delete sce;
-    delete dc;    
+    delete dc;
 }