NUCLEO-F070R-DS1820
Fork of NUCLEO-F401RE-DS1820andThermistorNTC10K by
NOKIA_5110.cpp@6:7f43285de85b, 2016-10-21 (annotated)
- Committer:
- anywill
- Date:
- Fri Oct 21 09:09:11 2016 +0000
- Revision:
- 6:7f43285de85b
nucleo 5110;
Who changed what in which revision?
User | Revision | Line number | New 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 | } |