A basic LCD output test which uses the NXP LPC1768\'s SPI interface to display pixels, characters, and numbers on the Nokia 5110 or Nokia 3310 LCD.

Dependencies:   mbed NOKIA_5110

Quick and versatile LCD screen control. Works as a great alternative to serial consoles!

---------

/media/uploads/Fuzball/debug_gui_1.jpg

Inverted-color text function makes easy menus and borders

/media/uploads/Fuzball/oscil_1.jpg

Uses a simple SetXY(char, char) function to draw data-plots or patterns

- Wiring -

/media/uploads/Fuzball/debug_gui_2.jpg

LCD's connections from left to right:

1) +3.3v (V_lcd) - mbed's VOUT

2) GND - mbed's GND

3) SCE (chip select) - mbed's p8

4) RST (reset) - mbed's p9

5) DC (data/command) - mbed's p10

6) MOSI - mbed's p11

7) SCLK (serial clock) - mbed's p13

8) +3.3v (V_backlight) - mbed's VOUT

The code for this setup would be...

LcdPins myPins;

myPins.sce = p8;

myPins.rst = p9;

myPins.dc = p10;

myPins.mosi = p11;

myPins.miso = NC;

myPins.sclk = p13;

or more easily...

LcdPins myPins = { p11, NC, p13, p10, p8, p9 };

Init the NokiaLcd class using the above struct...

NokiaLcd myLcd( myPins );

then start the LCD using...

myLcd.InitLcd();

Simple text output is achieved with either of these functions:

void DrawString(char* str);

void DrawChar(char character);

------

Better documentation, pre/post conditions, and extended draw functions are coming soon :)

Files at this revision

API Documentation at this revision

Comitter:
Fuzball
Date:
Fri Jan 10 22:22:17 2014 +0000
Parent:
2:e448efb1fa68
Child:
4:403f1aa3a78b
Commit message:
Cleaned up the code a little, added more draw commands, and threw in some functions for drawing strings

Changed in this revision

NOKIA_5110.cpp Show annotated file Show diff for this revision Revisions of this file
NOKIA_5110.h Show annotated file Show diff for this revision Revisions of this file
--- a/NOKIA_5110.cpp	Fri Jan 10 19:57:40 2014 +0000
+++ b/NOKIA_5110.cpp	Fri Jan 10 22:22:17 2014 +0000
@@ -2,7 +2,7 @@
 // File: NOKIA_5110.cpp
 // Author: Chris Yan
 // Created: January, 2012
-// Revised: 
+// Revised: January, 2014
 //  Desc: Supporting code for the NokiaLcd class
 
 #include "NOKIA_5110.h"
@@ -44,29 +44,20 @@
 
 void NokiaLcd::ClearLcdMem()
 {
-    Pins[PIN_SCE]->write(0);    // Chip Select goes low
-    Pins[PIN_DC]->write(1);     // Data/CMD goes high
-    
     for(int tick = 0; tick <= 503; tick++)
         LcdSpi->write(0x00);
-        
-    Pins[PIN_SCE]->write(1);    // Chip Select goes high
 }
 
 void NokiaLcd::TestLcd(char test_pattern)
 {
-    Pins[PIN_SCE]->write(0);    // Chip Select goes low
-    Pins[PIN_DC]->write(1);     // Data/CMD goes high
-    
     for(int tick = 0; tick <= 503; tick++)
         LcdSpi->write(test_pattern);         // Command gets sent
-    
-    Pins[PIN_SCE]->write(1);    // Chip Select goes high
 }
 
 void NokiaLcd::InitLcd()
 {
     ResetLcd();
+    Pins[PIN_SCE]->write(0);     // Chip Select goes low
     
     // Redefine the FunctionChar in case it has changed
     FunctionSet.V   = CMD_FS_HORIZONTAL_MODE;
@@ -82,6 +73,7 @@
     SendFunction( DispControlChar );        // | Display Mode
     
     ClearLcdMem();
+    Pins[PIN_DC]->write(1);     // Data/CMD goes back to Data mode
 }
 
 void NokiaLcd::ResetLcd()
@@ -97,12 +89,7 @@
 
 void NokiaLcd::SendDrawData(char data)
 {
-    Pins[PIN_SCE]->write(0);    // Chip Select goes low
-    Pins[PIN_DC]->write(1);     // Data/CMD goes high
-    
     LcdSpi->write(data);         // Command gets sent
-    
-    Pins[PIN_SCE]->write(1);    // Chip Select goes high
 }
 
 void NokiaLcd::DrawChar(char character)
@@ -111,15 +98,73 @@
         SendDrawData( FONT_6x6[ ((character - 32)*6) + i] );
 }
 
+void NokiaLcd::DrawString(char* s)
+{
+    char len = strlen(s);
+    for( int idx = 0; idx < len; idx++ )
+    {
+        for( int i = 0; i < 6; i++)
+            SendDrawData( FONT_6x6[ ((s[idx] - 32)*6) + i] );
+    }
+}
+
+void NokiaLcd::DrawFrameChar(char character)
+{
+    for( int i = 0; i < 6; i++)
+        SendDrawData((( FONT_6x6[ ((character - 32)*6) + i]  ) << 1 ) | 0x81);
+}
+
+void NokiaLcd::DrawNegFrameChar(char character)
+{
+    for( int i = 0; i < 6; i++)
+        SendDrawData(~(( FONT_6x6[ ((character - 32)*6) + i]  ) << 1 ) | 0x81);
+}
+
+char* NokiaLcd::NumToStr(int num)
+{
+    if(num <= 0)
+        return "0";
+
+    double length = 0;
+    int tlen = 0;
+    int temp = 1;
+    char c;
+    
+    // Get number of digits
+    while( temp <= num )
+    {
+        temp *= 10;
+        length++;
+    }
+    tlen = length;
+    char* numString = new char[tlen+1];
+    
+    // Convert each place in number to a stand-alone representative number
+    temp = 0;
+    for(int idx = pow(10, length); idx>1; idx = (idx/10))
+    {
+        c = (char)( ((num % idx)-(num % (idx/10)))/(idx/10) + 48);
+        numString[temp] = c;
+        temp++;
+    }
+    numString[temp] = '\0';
+    return numString;
+}
+
+void NokiaLcd::SetXY(char x, char y)
+{
+    if( (x > 83) || (y > 5) )
+        return;
+
+    SendFunction( x | 0x80 );
+    SendFunction( y | 0x40 );
+}
+
 void NokiaLcd::SendFunction(char cmd) //TODO:Detection of what H should be
 {
-    Pins[PIN_SCE]->write(0);    // Chip Select goes low
     Pins[PIN_DC]->write(0);     // Data/CMD goes low
-    
     LcdSpi->write(cmd);         // Command gets sent
-    
     Pins[PIN_DC]->write(1);     // Data/CMD goes back to Data mode
-    Pins[PIN_SCE]->write(1);    // Chip Select goes high
 }
 
 NokiaLcd::~NokiaLcd()
--- a/NOKIA_5110.h	Fri Jan 10 19:57:40 2014 +0000
+++ b/NOKIA_5110.h	Fri Jan 10 22:22:17 2014 +0000
@@ -2,7 +2,7 @@
 // File: NOKIA_5110.h
 // Author: Chris Yan
 // Created: January, 2012
-// Revised: 
+// Revised: January, 2014
 //  Desc: Commands, fonts, and class for using a
 //      Nokia 5110 LCD via the Phillips 8554 LCD driver.
 // 
@@ -36,6 +36,11 @@
 
 // Command Instructions
 //       H = 0
+#ifndef __NOKIA_5110_H__
+#define __NOKIA_5110_H__
+
+// Command Instructions
+//       H = 0
 #define CMD_DC_CLEAR_DISPLAY   0x08
 #define CMD_DC_NORMAL_MODE     0x0C
 #define CMD_DC_FILL_DISPLAY    0x09
@@ -58,9 +63,11 @@
 #define CMD_VOP_7V38           0xC8
 
 // LCD Characteristics
-#define LCD_FREQ 4000000
+#define LCD_FREQ 2000000
 #define LCD_SPI_MODE 0x01
 #define LCD_SPI_BITS 0x08
+#define LCD_X_MAX 84
+#define LCD_Y_MAX 48
 
 #define PIN_RST  0x00
 #define PIN_SCE  0x01
@@ -102,11 +109,17 @@
         void ClearLcdMem();
         void ShutdownLcd();
         void SendFunction(char cmd);
-
         void TestLcd(char test_pattern);
+        void SendDrawData(char data);
+        
+    public:
+        void DrawString(char* str);
         void DrawChar(char character);
-        void SendDrawData(char data);
-
+        void SetXY(char x, char y);
+        void DrawFrameChar(char character);
+        void DrawNegFrameChar(char character);
+        char* NumToStr(int num);
+        
     private:
         char CreateFunctionChar();
         void ResetLcd();
@@ -217,7 +230,9 @@
  0x2C, 0x30, 0x1C, 0x00, 0x00, 0x00, // y   90
  0x24, 0x34, 0x2C, 0x24, 0x00, 0x00, // z
  0x00, 0x00, 0x08, 0x3E, 0x22, 0x00, // {
- 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, // |
+ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, // |
  0x22, 0x3E, 0x08, 0x00, 0x00, 0x00, // }
  0x10, 0x08, 0x18, 0x10, 0x08, 0x00, // ~   95
 };
+
+#endif