A small and easy-to-use library for the Nokia 5110, 3310, and LCD-10168 / PCD8544 LCD controller. Draw support includes strings, patterns, and pixel-by-pixel methods.
Dependents: TextLCD_NOKIA_5110 Nokia5110_KL25Z Nokia5110_test_nucleo LPC1114_5110_PIR ... more
Diff: NOKIA_5110.cpp
- Revision:
- 0:9cfce382e741
- Child:
- 1:5ec993784d65
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/NOKIA_5110.cpp Mon Jan 13 23:09:26 2014 +0000 @@ -0,0 +1,173 @@ +// Project: Nokia5110 - Controlling a NK5110 display from an NXP LPC1768 +// File: NOKIA_5110.cpp +// Author: Chris Yan +// Created: January, 2012 +// Revised: January, 2014 +// Desc: Supporting code for the NokiaLcd class + +#include "NOKIA_5110.h" +#include "mbed.h" + +NokiaLcd::NokiaLcd(LcdPins pinout) +{ + // SPI + LcdSpi = new SPI(pinout.mosi, pinout.miso, pinout.sclk); + LcdSpi->format(LCD_SPI_BITS, LCD_SPI_MODE); + LcdSpi->frequency(LCD_FREQ); + + // Control Pins + Pins = new DigitalOut*[3]; + Pins[PIN_RST] = new DigitalOut(pinout.rst); + Pins[PIN_SCE] = new DigitalOut(pinout.sce); + Pins[PIN_DC] = new DigitalOut(pinout.dc); + + // Initial Command Instructions, note the initial command mode + FunctionSet.V = CMD_FS_HORIZONTAL_MODE; + FunctionSet.H = CMD_FS_EXTENDED_MODE; + FunctionSet.PD = CMD_FS_ACTIVE_MODE; + FunctionChar = CreateFunctionChar(); + + TempControlChar = CMD_TC_TEMP_2; + DispControlChar = CMD_DC_NORMAL_MODE; + BiasChar = CMD_BI_MUX_48; + VopChar = CMD_VOP_7V38; +} + +void NokiaLcd::ShutdownLcd() +{ + FunctionSet.PD = CMD_FS_POWER_DOWN_MODE; + + ClearLcdMem(); + SendFunction( CMD_DC_CLEAR_DISPLAY ); + SendFunction( CreateFunctionChar() ); +} + +void NokiaLcd::ClearLcdMem() +{ + for(int tick = 0; tick <= 503; tick++) + LcdSpi->write(0x00); +} + +void NokiaLcd::TestLcd(char test_pattern) +{ + for(int tick = 0; tick <= 503; tick++) + LcdSpi->write(test_pattern); // Command gets sent +} + +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; + FunctionSet.H = CMD_FS_EXTENDED_MODE; + FunctionSet.PD = CMD_FS_ACTIVE_MODE; + SendFunction( CreateFunctionChar() ); // Extended CMD set + SendFunction( VopChar ); // | Vop + SendFunction( TempControlChar ); // | Temp + SendFunction( BiasChar ); // | Bias + + FunctionSet.H = CMD_FS_BASIC_MODE; + SendFunction( CreateFunctionChar() ); // Basic CMD set + SendFunction( DispControlChar ); // | Display Mode + + ClearLcdMem(); + Pins[PIN_DC]->write(1); // Data/CMD goes back to Data mode +} + +void NokiaLcd::ResetLcd() +{ + Pins[PIN_RST]->write(0); // Reset goes low + Pins[PIN_RST]->write(1); // Reset goes high +} + +char NokiaLcd::CreateFunctionChar() +{ + return ( 0x20 | FunctionSet.PD | FunctionSet.V | FunctionSet.H ); +} + +void NokiaLcd::SendDrawData(char data) +{ + LcdSpi->write(data); // Command gets sent +} + +void NokiaLcd::DrawChar(char character) +{ + for( int i = 0; i < 6; i++) + 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_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 +} + +NokiaLcd::~NokiaLcd() +{ + ShutdownLcd(); +}