NUCLEO-F070R-DS1820

Dependencies:   mbed

Fork of NUCLEO-F401RE-DS1820andThermistorNTC10K by Enrico Marinoni

Committer:
anywill
Date:
Fri Oct 21 09:09:11 2016 +0000
Revision:
6:7f43285de85b
nucleo 5110;

Who changed what in which revision?

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