no

Dependencies:   DS1820 TextLCD mbed

Fork of TextLCD_HelloWorld2 by Wim Huiskamp

Committer:
wupinxian
Date:
Sun Mar 19 16:03:12 2017 +0000
Revision:
5:7ed4428bc142
no

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wupinxian 5:7ed4428bc142 1 // Project: Nokia5110 - Controlling a NK5110 display from an NXP LPC1768
wupinxian 5:7ed4428bc142 2 // File: NOKIA_5110.cpp
wupinxian 5:7ed4428bc142 3 // Author: Chris Yan
wupinxian 5:7ed4428bc142 4 // Created: January, 2012
wupinxian 5:7ed4428bc142 5 // Revised: January, 2014
wupinxian 5:7ed4428bc142 6 // Desc: Supporting code for the NokiaLcd class
wupinxian 5:7ed4428bc142 7
wupinxian 5:7ed4428bc142 8 #include "NOKIA_5110.h"
wupinxian 5:7ed4428bc142 9 #include "mbed.h"
wupinxian 5:7ed4428bc142 10
wupinxian 5:7ed4428bc142 11 NokiaLcd::NokiaLcd(LcdPins pinout)
wupinxian 5:7ed4428bc142 12 {
wupinxian 5:7ed4428bc142 13 // SPI
wupinxian 5:7ed4428bc142 14 LcdSpi = new SPI(pinout.mosi, pinout.miso, pinout.sclk);
wupinxian 5:7ed4428bc142 15 LcdSpi->format(LCD_SPI_BITS, LCD_SPI_MODE);
wupinxian 5:7ed4428bc142 16 LcdSpi->frequency(LCD_FREQ);
wupinxian 5:7ed4428bc142 17
wupinxian 5:7ed4428bc142 18 // Control Pins
wupinxian 5:7ed4428bc142 19 Pins = new DigitalOut*[3];
wupinxian 5:7ed4428bc142 20 Pins[PIN_RST] = new DigitalOut(pinout.rst);
wupinxian 5:7ed4428bc142 21 Pins[PIN_SCE] = new DigitalOut(pinout.sce);
wupinxian 5:7ed4428bc142 22 Pins[PIN_DC] = new DigitalOut(pinout.dc);
wupinxian 5:7ed4428bc142 23
wupinxian 5:7ed4428bc142 24 // Initial Command Instructions, note the initial command mode
wupinxian 5:7ed4428bc142 25 FunctionSet.V = CMD_FS_HORIZONTAL_MODE;
wupinxian 5:7ed4428bc142 26 FunctionSet.H = CMD_FS_EXTENDED_MODE;
wupinxian 5:7ed4428bc142 27 FunctionSet.PD = CMD_FS_ACTIVE_MODE;
wupinxian 5:7ed4428bc142 28 FunctionChar = CreateFunctionChar();
wupinxian 5:7ed4428bc142 29
wupinxian 5:7ed4428bc142 30 TempControlChar = CMD_TC_TEMP_2;
wupinxian 5:7ed4428bc142 31 DispControlChar = CMD_DC_NORMAL_MODE;
wupinxian 5:7ed4428bc142 32 BiasChar = CMD_BI_MUX_48;
wupinxian 5:7ed4428bc142 33 VopChar = CMD_VOP_7V38;
wupinxian 5:7ed4428bc142 34 }
wupinxian 5:7ed4428bc142 35
wupinxian 5:7ed4428bc142 36 void NokiaLcd::ShutdownLcd()
wupinxian 5:7ed4428bc142 37 {
wupinxian 5:7ed4428bc142 38 FunctionSet.PD = CMD_FS_POWER_DOWN_MODE;
wupinxian 5:7ed4428bc142 39
wupinxian 5:7ed4428bc142 40 ClearLcdMem();
wupinxian 5:7ed4428bc142 41 SendFunction( CMD_DC_CLEAR_DISPLAY );
wupinxian 5:7ed4428bc142 42 SendFunction( CreateFunctionChar() );
wupinxian 5:7ed4428bc142 43 }
wupinxian 5:7ed4428bc142 44
wupinxian 5:7ed4428bc142 45 void NokiaLcd::ClearLcdMem()
wupinxian 5:7ed4428bc142 46 {
wupinxian 5:7ed4428bc142 47 for(int tick = 0; tick <= 503; tick++)
wupinxian 5:7ed4428bc142 48 LcdSpi->write(0x00);
wupinxian 5:7ed4428bc142 49 }
wupinxian 5:7ed4428bc142 50
wupinxian 5:7ed4428bc142 51 void NokiaLcd::TestLcd(char test_pattern)
wupinxian 5:7ed4428bc142 52 {
wupinxian 5:7ed4428bc142 53 for(int tick = 0; tick <= 503; tick++)
wupinxian 5:7ed4428bc142 54 LcdSpi->write(test_pattern); // Command gets sent
wupinxian 5:7ed4428bc142 55 }
wupinxian 5:7ed4428bc142 56
wupinxian 5:7ed4428bc142 57 void NokiaLcd::InitLcd()
wupinxian 5:7ed4428bc142 58 {
wupinxian 5:7ed4428bc142 59 ResetLcd();
wupinxian 5:7ed4428bc142 60 Pins[PIN_SCE]->write(0); // Chip Select goes low
wupinxian 5:7ed4428bc142 61
wupinxian 5:7ed4428bc142 62 // Redefine the FunctionChar in case it has changed
wupinxian 5:7ed4428bc142 63 FunctionSet.V = CMD_FS_HORIZONTAL_MODE;
wupinxian 5:7ed4428bc142 64 FunctionSet.H = CMD_FS_EXTENDED_MODE;
wupinxian 5:7ed4428bc142 65 FunctionSet.PD = CMD_FS_ACTIVE_MODE;
wupinxian 5:7ed4428bc142 66 SendFunction( CreateFunctionChar() ); // Extended CMD set
wupinxian 5:7ed4428bc142 67 SendFunction( VopChar ); // | Vop
wupinxian 5:7ed4428bc142 68 SendFunction( TempControlChar ); // | Temp
wupinxian 5:7ed4428bc142 69 SendFunction( BiasChar ); // | Bias
wupinxian 5:7ed4428bc142 70
wupinxian 5:7ed4428bc142 71 FunctionSet.H = CMD_FS_BASIC_MODE;
wupinxian 5:7ed4428bc142 72 SendFunction( CreateFunctionChar() ); // Basic CMD set
wupinxian 5:7ed4428bc142 73 SendFunction( DispControlChar ); // | Display Mode
wupinxian 5:7ed4428bc142 74
wupinxian 5:7ed4428bc142 75 ClearLcdMem();
wupinxian 5:7ed4428bc142 76 Pins[PIN_DC]->write(1); // Data/CMD goes back to Data mode
wupinxian 5:7ed4428bc142 77 }
wupinxian 5:7ed4428bc142 78
wupinxian 5:7ed4428bc142 79 void NokiaLcd::ResetLcd()
wupinxian 5:7ed4428bc142 80 {
wupinxian 5:7ed4428bc142 81 Pins[PIN_RST]->write(0); // Reset goes low
wupinxian 5:7ed4428bc142 82 Pins[PIN_RST]->write(1); // Reset goes high
wupinxian 5:7ed4428bc142 83 }
wupinxian 5:7ed4428bc142 84
wupinxian 5:7ed4428bc142 85 char NokiaLcd::CreateFunctionChar()
wupinxian 5:7ed4428bc142 86 {
wupinxian 5:7ed4428bc142 87 return ( 0x20 | FunctionSet.PD | FunctionSet.V | FunctionSet.H );
wupinxian 5:7ed4428bc142 88 }
wupinxian 5:7ed4428bc142 89
wupinxian 5:7ed4428bc142 90 void NokiaLcd::SendDrawData(char data)
wupinxian 5:7ed4428bc142 91 {
wupinxian 5:7ed4428bc142 92 LcdSpi->write(data); // Command gets sent
wupinxian 5:7ed4428bc142 93 }
wupinxian 5:7ed4428bc142 94
wupinxian 5:7ed4428bc142 95 void NokiaLcd::DrawChar(char character)
wupinxian 5:7ed4428bc142 96 {
wupinxian 5:7ed4428bc142 97 for( int i = 0; i < 6; i++)
wupinxian 5:7ed4428bc142 98 SendDrawData( FONT_6x6[ ((character - 32)*6) + i] );
wupinxian 5:7ed4428bc142 99 }
wupinxian 5:7ed4428bc142 100
wupinxian 5:7ed4428bc142 101 void NokiaLcd::DrawString(char* s)
wupinxian 5:7ed4428bc142 102 {
wupinxian 5:7ed4428bc142 103 char len = strlen(s);
wupinxian 5:7ed4428bc142 104 for( int idx = 0; idx < len; idx++ )
wupinxian 5:7ed4428bc142 105 {
wupinxian 5:7ed4428bc142 106 for( int i = 0; i < 6; i++)
wupinxian 5:7ed4428bc142 107 SendDrawData( FONT_6x6[ ((s[idx] - 32)*6) + i] );
wupinxian 5:7ed4428bc142 108 }
wupinxian 5:7ed4428bc142 109 }
wupinxian 5:7ed4428bc142 110
wupinxian 5:7ed4428bc142 111 void NokiaLcd::DrawFrameChar(char character)
wupinxian 5:7ed4428bc142 112 {
wupinxian 5:7ed4428bc142 113 for( int i = 0; i < 6; i++)
wupinxian 5:7ed4428bc142 114 SendDrawData((( FONT_6x6[ ((character - 32)*6) + i] ) << 1 ) | 0x81);
wupinxian 5:7ed4428bc142 115 }
wupinxian 5:7ed4428bc142 116
wupinxian 5:7ed4428bc142 117 void NokiaLcd::DrawNegFrameChar(char character)
wupinxian 5:7ed4428bc142 118 {
wupinxian 5:7ed4428bc142 119 for( int i = 0; i < 6; i++)
wupinxian 5:7ed4428bc142 120 SendDrawData(~(( FONT_6x6[ ((character - 32)*6) + i] ) << 1 ) | 0x81);
wupinxian 5:7ed4428bc142 121 }
wupinxian 5:7ed4428bc142 122
wupinxian 5:7ed4428bc142 123 char* NokiaLcd::NumToStr(int num)
wupinxian 5:7ed4428bc142 124 {
wupinxian 5:7ed4428bc142 125 if(num <= 0)
wupinxian 5:7ed4428bc142 126 return "0";
wupinxian 5:7ed4428bc142 127
wupinxian 5:7ed4428bc142 128 double length = 0;
wupinxian 5:7ed4428bc142 129 int tlen = 0;
wupinxian 5:7ed4428bc142 130 int temp = 1;
wupinxian 5:7ed4428bc142 131 char c;
wupinxian 5:7ed4428bc142 132
wupinxian 5:7ed4428bc142 133 // Get number of digits
wupinxian 5:7ed4428bc142 134 while( temp <= num )
wupinxian 5:7ed4428bc142 135 {
wupinxian 5:7ed4428bc142 136 temp *= 10;
wupinxian 5:7ed4428bc142 137 length++;
wupinxian 5:7ed4428bc142 138 }
wupinxian 5:7ed4428bc142 139 tlen = length;
wupinxian 5:7ed4428bc142 140 char* numString = new char[tlen+1];
wupinxian 5:7ed4428bc142 141
wupinxian 5:7ed4428bc142 142 // Convert each place in number to a stand-alone representative number
wupinxian 5:7ed4428bc142 143 temp = 0;
wupinxian 5:7ed4428bc142 144 for(int idx = pow(10, length); idx>1; idx = (idx/10))
wupinxian 5:7ed4428bc142 145 {
wupinxian 5:7ed4428bc142 146 c = (char)( ((num % idx)-(num % (idx/10)))/(idx/10) + 48);
wupinxian 5:7ed4428bc142 147 numString[temp] = c;
wupinxian 5:7ed4428bc142 148 temp++;
wupinxian 5:7ed4428bc142 149 }
wupinxian 5:7ed4428bc142 150 numString[temp] = '\0';
wupinxian 5:7ed4428bc142 151 return numString;
wupinxian 5:7ed4428bc142 152 }
wupinxian 5:7ed4428bc142 153
wupinxian 5:7ed4428bc142 154 void NokiaLcd::SetXY(char x, char y)
wupinxian 5:7ed4428bc142 155 {
wupinxian 5:7ed4428bc142 156 if( (x > 83) || (y > 5) )
wupinxian 5:7ed4428bc142 157 return;
wupinxian 5:7ed4428bc142 158
wupinxian 5:7ed4428bc142 159 SendFunction( x | 0x80 );
wupinxian 5:7ed4428bc142 160 SendFunction( y | 0x40 );
wupinxian 5:7ed4428bc142 161 }
wupinxian 5:7ed4428bc142 162
wupinxian 5:7ed4428bc142 163 void NokiaLcd::SendFunction(char cmd) //TODO:Detection of what H should be
wupinxian 5:7ed4428bc142 164 {
wupinxian 5:7ed4428bc142 165 Pins[PIN_DC]->write(0); // Data/CMD goes low
wupinxian 5:7ed4428bc142 166 LcdSpi->write(cmd); // Command gets sent
wupinxian 5:7ed4428bc142 167 Pins[PIN_DC]->write(1); // Data/CMD goes back to Data mode
wupinxian 5:7ed4428bc142 168 }
wupinxian 5:7ed4428bc142 169
wupinxian 5:7ed4428bc142 170 NokiaLcd::~NokiaLcd()
wupinxian 5:7ed4428bc142 171 {
wupinxian 5:7ed4428bc142 172 ShutdownLcd();
wupinxian 5:7ed4428bc142 173 }