version 1.0

Dependencies:   CMSIS_DSP_401 GPS MPU9150_DMP PID QuaternionMath Servo mbed

Fork of SolarOnFoils_MainModule_20150518 by Dannis Brugman

Committer:
Dannis_mbed
Date:
Tue Aug 11 08:38:55 2015 +0000
Revision:
2:f6d058931b17
Test version mainmodule

Who changed what in which revision?

UserRevisionLine numberNew 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 }