version 1.0
Dependencies: CMSIS_DSP_401 GPS MPU9150_DMP PID QuaternionMath Servo mbed
Fork of SolarOnFoils_MainModule_20150518 by
LCD_I2C.cpp@2:f6d058931b17, 2015-08-11 (annotated)
- Committer:
- Dannis_mbed
- Date:
- Tue Aug 11 08:38:55 2015 +0000
- Revision:
- 2:f6d058931b17
Test version mainmodule
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Dannis_mbed | 2:f6d058931b17 | 1 | ////////////////////////////////////////////////////////////////////////////////////// |
Dannis_mbed | 2:f6d058931b17 | 2 | // // |
Dannis_mbed | 2:f6d058931b17 | 3 | // File : LCD_I2C.cpp // |
Dannis_mbed | 2:f6d058931b17 | 4 | // Version : 1.0 // |
Dannis_mbed | 2:f6d058931b17 | 5 | // Date : 26 june 2015 // |
Dannis_mbed | 2:f6d058931b17 | 6 | // Author : Dany Brugman // |
Dannis_mbed | 2:f6d058931b17 | 7 | // Comment : Class to write data to a 2x16 LCD by I2C // |
Dannis_mbed | 2:f6d058931b17 | 8 | // using a MCP23017 port expander. // |
Dannis_mbed | 2:f6d058931b17 | 9 | // // |
Dannis_mbed | 2:f6d058931b17 | 10 | // Changelog : // |
Dannis_mbed | 2:f6d058931b17 | 11 | // Date: Name: Comment: // |
Dannis_mbed | 2:f6d058931b17 | 12 | // 25/03/2015 DNB First version // |
Dannis_mbed | 2:f6d058931b17 | 13 | // 26/06/2015 DNB Rebuild to class LCD_I2C // |
Dannis_mbed | 2:f6d058931b17 | 14 | // // |
Dannis_mbed | 2:f6d058931b17 | 15 | ////////////////////////////////////////////////////////////////////////////////////// |
Dannis_mbed | 2:f6d058931b17 | 16 | #include "menu.h" |
Dannis_mbed | 2:f6d058931b17 | 17 | #include "LCD_I2C.h" |
Dannis_mbed | 2:f6d058931b17 | 18 | |
Dannis_mbed | 2:f6d058931b17 | 19 | ////////////////////////////////////////////////////////////////////////////////////// |
Dannis_mbed | 2:f6d058931b17 | 20 | // constructor // |
Dannis_mbed | 2:f6d058931b17 | 21 | ////////////////////////////////////////////////////////////////////////////////////// |
Dannis_mbed | 2:f6d058931b17 | 22 | LCD_I2C::LCD_I2C(PinName data, PinName clk, char deviceID) : |
Dannis_mbed | 2:f6d058931b17 | 23 | i2c(data, clk), |
Dannis_mbed | 2:f6d058931b17 | 24 | deviceAdress(deviceID), |
Dannis_mbed | 2:f6d058931b17 | 25 | mcp23017(i2c, 0x40) |
Dannis_mbed | 2:f6d058931b17 | 26 | { |
Dannis_mbed | 2:f6d058931b17 | 27 | vLCD_init_I2C(); |
Dannis_mbed | 2:f6d058931b17 | 28 | }; |
Dannis_mbed | 2:f6d058931b17 | 29 | |
Dannis_mbed | 2:f6d058931b17 | 30 | LCD_I2C::~LCD_I2C() |
Dannis_mbed | 2:f6d058931b17 | 31 | { |
Dannis_mbed | 2:f6d058931b17 | 32 | }; |
Dannis_mbed | 2:f6d058931b17 | 33 | |
Dannis_mbed | 2:f6d058931b17 | 34 | |
Dannis_mbed | 2:f6d058931b17 | 35 | extern Menu mLCDMenu; |
Dannis_mbed | 2:f6d058931b17 | 36 | ////////////////////////////////////////////////////////////////////////////////////// |
Dannis_mbed | 2:f6d058931b17 | 37 | // delay function for LCD // |
Dannis_mbed | 2:f6d058931b17 | 38 | ////////////////////////////////////////////////////////////////////////////////////// |
Dannis_mbed | 2:f6d058931b17 | 39 | void LCD_I2C::vLCD_delay_I2C (unsigned int t_delay) |
Dannis_mbed | 2:f6d058931b17 | 40 | { |
Dannis_mbed | 2:f6d058931b17 | 41 | unsigned int i; |
Dannis_mbed | 2:f6d058931b17 | 42 | |
Dannis_mbed | 2:f6d058931b17 | 43 | for (i=0; i < t_delay; i++); |
Dannis_mbed | 2:f6d058931b17 | 44 | } |
Dannis_mbed | 2:f6d058931b17 | 45 | |
Dannis_mbed | 2:f6d058931b17 | 46 | ////////////////////////////////////////////////////////////////////////////////////// |
Dannis_mbed | 2:f6d058931b17 | 47 | // write commando to LCD // |
Dannis_mbed | 2:f6d058931b17 | 48 | ////////////////////////////////////////////////////////////////////////////////////// |
Dannis_mbed | 2:f6d058931b17 | 49 | void LCD_I2C::vLCD_cmd_I2C (unsigned char commando) |
Dannis_mbed | 2:f6d058931b17 | 50 | { |
Dannis_mbed | 2:f6d058931b17 | 51 | __disable_irq(); // Disable Interrupts |
Dannis_mbed | 2:f6d058931b17 | 52 | |
Dannis_mbed | 2:f6d058931b17 | 53 | // write commando to LCD |
Dannis_mbed | 2:f6d058931b17 | 54 | mcp23017.write(PORT_A, commando); |
Dannis_mbed | 2:f6d058931b17 | 55 | |
Dannis_mbed | 2:f6d058931b17 | 56 | // LCD_RS = 0 |
Dannis_mbed | 2:f6d058931b17 | 57 | buffer_GPIOB = buffer_GPIOB & 0xFD; // RS = 0 |
Dannis_mbed | 2:f6d058931b17 | 58 | // write to LCD |
Dannis_mbed | 2:f6d058931b17 | 59 | mcp23017.write(PORT_B, buffer_GPIOB); |
Dannis_mbed | 2:f6d058931b17 | 60 | |
Dannis_mbed | 2:f6d058931b17 | 61 | // LCD_EN = 1 |
Dannis_mbed | 2:f6d058931b17 | 62 | buffer_GPIOB = buffer_GPIOB | 0x01; // EN = 1 |
Dannis_mbed | 2:f6d058931b17 | 63 | // write to LCD |
Dannis_mbed | 2:f6d058931b17 | 64 | mcp23017.write(PORT_B, buffer_GPIOB); |
Dannis_mbed | 2:f6d058931b17 | 65 | |
Dannis_mbed | 2:f6d058931b17 | 66 | // LCD_EN = 0 |
Dannis_mbed | 2:f6d058931b17 | 67 | buffer_GPIOB = buffer_GPIOB & 0xFE; // EN = 0 |
Dannis_mbed | 2:f6d058931b17 | 68 | // write to LCD |
Dannis_mbed | 2:f6d058931b17 | 69 | mcp23017.write(PORT_B, buffer_GPIOB); |
Dannis_mbed | 2:f6d058931b17 | 70 | |
Dannis_mbed | 2:f6d058931b17 | 71 | __enable_irq(); // Enable Interrupts |
Dannis_mbed | 2:f6d058931b17 | 72 | } |
Dannis_mbed | 2:f6d058931b17 | 73 | |
Dannis_mbed | 2:f6d058931b17 | 74 | ////////////////////////////////////////////////////////////////////////////////////// |
Dannis_mbed | 2:f6d058931b17 | 75 | // write single char to LCD // |
Dannis_mbed | 2:f6d058931b17 | 76 | ////////////////////////////////////////////////////////////////////////////////////// |
Dannis_mbed | 2:f6d058931b17 | 77 | void LCD_I2C::vLCD_data_I2C (unsigned char data) |
Dannis_mbed | 2:f6d058931b17 | 78 | { |
Dannis_mbed | 2:f6d058931b17 | 79 | __disable_irq(); // Disable Interrupts |
Dannis_mbed | 2:f6d058931b17 | 80 | |
Dannis_mbed | 2:f6d058931b17 | 81 | // write data to LCD |
Dannis_mbed | 2:f6d058931b17 | 82 | mcp23017.write(PORT_A, data); |
Dannis_mbed | 2:f6d058931b17 | 83 | |
Dannis_mbed | 2:f6d058931b17 | 84 | // LCD_RS = 1 |
Dannis_mbed | 2:f6d058931b17 | 85 | buffer_GPIOB = buffer_GPIOB | 0x02; // RS = 1 |
Dannis_mbed | 2:f6d058931b17 | 86 | // write to LCD |
Dannis_mbed | 2:f6d058931b17 | 87 | mcp23017.write(PORT_B, buffer_GPIOB); |
Dannis_mbed | 2:f6d058931b17 | 88 | |
Dannis_mbed | 2:f6d058931b17 | 89 | // LCD_EN = 1 |
Dannis_mbed | 2:f6d058931b17 | 90 | buffer_GPIOB = buffer_GPIOB | 0x01; // EN = 1 |
Dannis_mbed | 2:f6d058931b17 | 91 | // write to LCD |
Dannis_mbed | 2:f6d058931b17 | 92 | mcp23017.write(PORT_B, buffer_GPIOB); |
Dannis_mbed | 2:f6d058931b17 | 93 | |
Dannis_mbed | 2:f6d058931b17 | 94 | // LCD_EN = 0 |
Dannis_mbed | 2:f6d058931b17 | 95 | buffer_GPIOB = buffer_GPIOB & 0xFE; // EN = 0 |
Dannis_mbed | 2:f6d058931b17 | 96 | // write to LCD |
Dannis_mbed | 2:f6d058931b17 | 97 | mcp23017.write(PORT_B, buffer_GPIOB); |
Dannis_mbed | 2:f6d058931b17 | 98 | |
Dannis_mbed | 2:f6d058931b17 | 99 | __enable_irq(); // Enable Interrupts |
Dannis_mbed | 2:f6d058931b17 | 100 | } |
Dannis_mbed | 2:f6d058931b17 | 101 | |
Dannis_mbed | 2:f6d058931b17 | 102 | ////////////////////////////////////////////////////////////////////////////////////// |
Dannis_mbed | 2:f6d058931b17 | 103 | // Initialize LCD // |
Dannis_mbed | 2:f6d058931b17 | 104 | ////////////////////////////////////////////////////////////////////////////////////// |
Dannis_mbed | 2:f6d058931b17 | 105 | void LCD_I2C::vLCD_init_I2C (void) |
Dannis_mbed | 2:f6d058931b17 | 106 | { |
Dannis_mbed | 2:f6d058931b17 | 107 | // init port expander |
Dannis_mbed | 2:f6d058931b17 | 108 | //Port A is databus - Output |
Dannis_mbed | 2:f6d058931b17 | 109 | mcp23017.direction(PORT_A, PORT_DIR_OUT); |
Dannis_mbed | 2:f6d058931b17 | 110 | //Port B is controlbus - Output |
Dannis_mbed | 2:f6d058931b17 | 111 | mcp23017.direction(PORT_B, PORT_DIR_OUT); |
Dannis_mbed | 2:f6d058931b17 | 112 | |
Dannis_mbed | 2:f6d058931b17 | 113 | vLCD_cmd_I2C (0x00); |
Dannis_mbed | 2:f6d058931b17 | 114 | // vLCD_delay_I2C (65535) |
Dannis_mbed | 2:f6d058931b17 | 115 | vLCD_delay_I2C (100); |
Dannis_mbed | 2:f6d058931b17 | 116 | |
Dannis_mbed | 2:f6d058931b17 | 117 | vLCD_cmd_I2C (0x38); |
Dannis_mbed | 2:f6d058931b17 | 118 | // vLCD_delay_I2C (65535) |
Dannis_mbed | 2:f6d058931b17 | 119 | vLCD_delay_I2C (100); |
Dannis_mbed | 2:f6d058931b17 | 120 | |
Dannis_mbed | 2:f6d058931b17 | 121 | vLCD_cmd_I2C (0x38); |
Dannis_mbed | 2:f6d058931b17 | 122 | //vLCD_delay_I2C (65535) |
Dannis_mbed | 2:f6d058931b17 | 123 | vLCD_delay_I2C (100); |
Dannis_mbed | 2:f6d058931b17 | 124 | |
Dannis_mbed | 2:f6d058931b17 | 125 | vLCD_cmd_I2C (0x38); |
Dannis_mbed | 2:f6d058931b17 | 126 | //vLCD_delay_I2C (65535) |
Dannis_mbed | 2:f6d058931b17 | 127 | vLCD_delay_I2C (100); |
Dannis_mbed | 2:f6d058931b17 | 128 | |
Dannis_mbed | 2:f6d058931b17 | 129 | // Display ON / OFF |
Dannis_mbed | 2:f6d058931b17 | 130 | vLCD_cmd_I2C (0x08); |
Dannis_mbed | 2:f6d058931b17 | 131 | |
Dannis_mbed | 2:f6d058931b17 | 132 | //vLCD_delay_I2C (65535) |
Dannis_mbed | 2:f6d058931b17 | 133 | vLCD_delay_I2C (100); |
Dannis_mbed | 2:f6d058931b17 | 134 | |
Dannis_mbed | 2:f6d058931b17 | 135 | // Clear Display |
Dannis_mbed | 2:f6d058931b17 | 136 | vLCD_cmd_I2C (0x01); |
Dannis_mbed | 2:f6d058931b17 | 137 | |
Dannis_mbed | 2:f6d058931b17 | 138 | //vLCD_delay_I2C (65535) |
Dannis_mbed | 2:f6d058931b17 | 139 | vLCD_delay_I2C (100); |
Dannis_mbed | 2:f6d058931b17 | 140 | |
Dannis_mbed | 2:f6d058931b17 | 141 | // Entry Mode Set |
Dannis_mbed | 2:f6d058931b17 | 142 | vLCD_cmd_I2C (0x06); |
Dannis_mbed | 2:f6d058931b17 | 143 | |
Dannis_mbed | 2:f6d058931b17 | 144 | //vLCD_delay_I2C (65535) |
Dannis_mbed | 2:f6d058931b17 | 145 | vLCD_delay_I2C (100); |
Dannis_mbed | 2:f6d058931b17 | 146 | |
Dannis_mbed | 2:f6d058931b17 | 147 | // Display ON / OFF |
Dannis_mbed | 2:f6d058931b17 | 148 | vLCD_cmd_I2C (0x0C); |
Dannis_mbed | 2:f6d058931b17 | 149 | |
Dannis_mbed | 2:f6d058931b17 | 150 | //vLCD_delay_I2C (65535) |
Dannis_mbed | 2:f6d058931b17 | 151 | vLCD_delay_I2C (100); |
Dannis_mbed | 2:f6d058931b17 | 152 | } |
Dannis_mbed | 2:f6d058931b17 | 153 | |
Dannis_mbed | 2:f6d058931b17 | 154 | ////////////////////////////////////////////////////////////////////////////////////// |
Dannis_mbed | 2:f6d058931b17 | 155 | // Write string to LCD // |
Dannis_mbed | 2:f6d058931b17 | 156 | ////////////////////////////////////////////////////////////////////////////////////// |
Dannis_mbed | 2:f6d058931b17 | 157 | void LCD_I2C::vLCD_print_I2C (unsigned char *string, unsigned char line) |
Dannis_mbed | 2:f6d058931b17 | 158 | { |
Dannis_mbed | 2:f6d058931b17 | 159 | unsigned int i; |
Dannis_mbed | 2:f6d058931b17 | 160 | |
Dannis_mbed | 2:f6d058931b17 | 161 | // select target line to write to |
Dannis_mbed | 2:f6d058931b17 | 162 | if (line == 1) |
Dannis_mbed | 2:f6d058931b17 | 163 | { |
Dannis_mbed | 2:f6d058931b17 | 164 | vLCD_cmd_I2C (0x80); |
Dannis_mbed | 2:f6d058931b17 | 165 | } |
Dannis_mbed | 2:f6d058931b17 | 166 | else if (line == 2) |
Dannis_mbed | 2:f6d058931b17 | 167 | { |
Dannis_mbed | 2:f6d058931b17 | 168 | vLCD_cmd_I2C (0xC0); |
Dannis_mbed | 2:f6d058931b17 | 169 | } |
Dannis_mbed | 2:f6d058931b17 | 170 | else |
Dannis_mbed | 2:f6d058931b17 | 171 | { |
Dannis_mbed | 2:f6d058931b17 | 172 | return; // End of function: Error in the past value of line |
Dannis_mbed | 2:f6d058931b17 | 173 | } |
Dannis_mbed | 2:f6d058931b17 | 174 | |
Dannis_mbed | 2:f6d058931b17 | 175 | // write data to selected line |
Dannis_mbed | 2:f6d058931b17 | 176 | for (i=0; i<16; i++) |
Dannis_mbed | 2:f6d058931b17 | 177 | { |
Dannis_mbed | 2:f6d058931b17 | 178 | if (string [i] != 0x00) |
Dannis_mbed | 2:f6d058931b17 | 179 | { |
Dannis_mbed | 2:f6d058931b17 | 180 | vLCD_data_I2C (string [i]); |
Dannis_mbed | 2:f6d058931b17 | 181 | } |
Dannis_mbed | 2:f6d058931b17 | 182 | else |
Dannis_mbed | 2:f6d058931b17 | 183 | vLCD_data_I2C (' '); |
Dannis_mbed | 2:f6d058931b17 | 184 | } |
Dannis_mbed | 2:f6d058931b17 | 185 | } |
Dannis_mbed | 2:f6d058931b17 | 186 | |
Dannis_mbed | 2:f6d058931b17 | 187 | ////////////////////////////////////////////////////////////////////////////////////// |
Dannis_mbed | 2:f6d058931b17 | 188 | // Write string to LCD // |
Dannis_mbed | 2:f6d058931b17 | 189 | ////////////////////////////////////////////////////////////////////////////////////// |
Dannis_mbed | 2:f6d058931b17 | 190 | void LCD_I2C::vLCD_printPos_I2C (unsigned char *string, unsigned char line, unsigned char character) |
Dannis_mbed | 2:f6d058931b17 | 191 | { |
Dannis_mbed | 2:f6d058931b17 | 192 | unsigned int i; |
Dannis_mbed | 2:f6d058931b17 | 193 | |
Dannis_mbed | 2:f6d058931b17 | 194 | // select target line and position to write to |
Dannis_mbed | 2:f6d058931b17 | 195 | if (line == 1) |
Dannis_mbed | 2:f6d058931b17 | 196 | { |
Dannis_mbed | 2:f6d058931b17 | 197 | vLCD_cmd_I2C (0x80+(character-1)); |
Dannis_mbed | 2:f6d058931b17 | 198 | } |
Dannis_mbed | 2:f6d058931b17 | 199 | |
Dannis_mbed | 2:f6d058931b17 | 200 | else if (line == 2) |
Dannis_mbed | 2:f6d058931b17 | 201 | { |
Dannis_mbed | 2:f6d058931b17 | 202 | vLCD_cmd_I2C (0xC0+(character-1)); |
Dannis_mbed | 2:f6d058931b17 | 203 | } |
Dannis_mbed | 2:f6d058931b17 | 204 | |
Dannis_mbed | 2:f6d058931b17 | 205 | else |
Dannis_mbed | 2:f6d058931b17 | 206 | { |
Dannis_mbed | 2:f6d058931b17 | 207 | return; // End of function: Error in the past value of line |
Dannis_mbed | 2:f6d058931b17 | 208 | } |
Dannis_mbed | 2:f6d058931b17 | 209 | |
Dannis_mbed | 2:f6d058931b17 | 210 | // write data to selected line and position |
Dannis_mbed | 2:f6d058931b17 | 211 | for (i=0; i<16; i++) |
Dannis_mbed | 2:f6d058931b17 | 212 | { |
Dannis_mbed | 2:f6d058931b17 | 213 | if (string [i] != 0x00) |
Dannis_mbed | 2:f6d058931b17 | 214 | { |
Dannis_mbed | 2:f6d058931b17 | 215 | vLCD_data_I2C (string [i]); |
Dannis_mbed | 2:f6d058931b17 | 216 | } |
Dannis_mbed | 2:f6d058931b17 | 217 | else |
Dannis_mbed | 2:f6d058931b17 | 218 | vLCD_data_I2C (' '); |
Dannis_mbed | 2:f6d058931b17 | 219 | } |
Dannis_mbed | 2:f6d058931b17 | 220 | } |
Dannis_mbed | 2:f6d058931b17 | 221 | |
Dannis_mbed | 2:f6d058931b17 | 222 | ////////////////////////////////////////////////////////////////////////////////////// |
Dannis_mbed | 2:f6d058931b17 | 223 | // Writing integer to LCD // |
Dannis_mbed | 2:f6d058931b17 | 224 | ////////////////////////////////////////////////////////////////////////////////////// |
Dannis_mbed | 2:f6d058931b17 | 225 | void LCD_I2C::vLCD_printInt_I2C (int value, unsigned char line, unsigned char character) |
Dannis_mbed | 2:f6d058931b17 | 226 | { |
Dannis_mbed | 2:f6d058931b17 | 227 | static char buffer[32]; |
Dannis_mbed | 2:f6d058931b17 | 228 | // convert int to char |
Dannis_mbed | 2:f6d058931b17 | 229 | sprintf(buffer, "%.2d", value); |
Dannis_mbed | 2:f6d058931b17 | 230 | // write converted int to LCD |
Dannis_mbed | 2:f6d058931b17 | 231 | vLCD_printPos_I2C((unsigned char*)buffer, line, character); |
Dannis_mbed | 2:f6d058931b17 | 232 | } |
Dannis_mbed | 2:f6d058931b17 | 233 | |
Dannis_mbed | 2:f6d058931b17 | 234 | ////////////////////////////////////////////////////////////////////////////////////// |
Dannis_mbed | 2:f6d058931b17 | 235 | // clear LCD [unsed] // |
Dannis_mbed | 2:f6d058931b17 | 236 | ////////////////////////////////////////////////////////////////////////////////////// |
Dannis_mbed | 2:f6d058931b17 | 237 | void LCD_I2C::vLCD_clear_I2C (void) |
Dannis_mbed | 2:f6d058931b17 | 238 | { |
Dannis_mbed | 2:f6d058931b17 | 239 | // Clear Display |
Dannis_mbed | 2:f6d058931b17 | 240 | vLCD_cmd_I2C (0x01); |
Dannis_mbed | 2:f6d058931b17 | 241 | //vLCD_delay_I2C (65535) |
Dannis_mbed | 2:f6d058931b17 | 242 | vLCD_delay_I2C (100); |
Dannis_mbed | 2:f6d058931b17 | 243 | // Display ON / OFF |
Dannis_mbed | 2:f6d058931b17 | 244 | vLCD_cmd_I2C (0x0C); |
Dannis_mbed | 2:f6d058931b17 | 245 | //vLCD_delay_I2C (65535) |
Dannis_mbed | 2:f6d058931b17 | 246 | vLCD_delay_I2C (100); |
Dannis_mbed | 2:f6d058931b17 | 247 | } |
Dannis_mbed | 2:f6d058931b17 | 248 | |
Dannis_mbed | 2:f6d058931b17 | 249 | ////////////////////////////////////////////////////////////////////////////////////// |
Dannis_mbed | 2:f6d058931b17 | 250 | // update LCD // |
Dannis_mbed | 2:f6d058931b17 | 251 | ////////////////////////////////////////////////////////////////////////////////////// |
Dannis_mbed | 2:f6d058931b17 | 252 | void LCD_I2C::vLCD_update (void) |
Dannis_mbed | 2:f6d058931b17 | 253 | { |
Dannis_mbed | 2:f6d058931b17 | 254 | vLCD_print_I2C((unsigned char*)mLCDMenu.getLine1(), 1); |
Dannis_mbed | 2:f6d058931b17 | 255 | vLCD_print_I2C((unsigned char*)mLCDMenu.getLine2(), 2); |
Dannis_mbed | 2:f6d058931b17 | 256 | //vLCD_printPos_I2C((unsigned char*)mLCDMenu.getLine1(), 1, 1); |
Dannis_mbed | 2:f6d058931b17 | 257 | //vLCD_printPos_I2C((unsigned char*)mLCDMenu.getLine2(), 2, 1); |
Dannis_mbed | 2:f6d058931b17 | 258 | } |