Use with a Nucleo F401RE and a Sharp Optical Dust Sensor GP2Y1010AU0F to measure dust with a Nokia 5110 display to show result.

Dependencies:   mbed

Committer:
kirchnet
Date:
Sat Jun 14 02:25:52 2014 +0000
Revision:
0:99fdd85b4929
Use with a Nucleo F401RE and a Sharp Optical Dust Sensor GP2Y1010AU0F to measure dust with a Nokia 5110 display to show results.

Who changed what in which revision?

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