Demo of LCD modified to use interrupts not delays.

Dependencies:   mbed

Fork of LCD_nonblocking_demo by Oliver Broad

This is an experiment in controlling an LCD from callbacks independently of the main program loop. As it runs from callbacks it is necessary to check if the library is "busy", which is currently indicated by an integer called "busy".

Busy checking should be converted into a method so that the criteria for being "busy" can be changed without changing the API.

As this is rough I have not issued it as a library ... yet.

Also due to my inexperience using the repository manager this is currently listed as a fork of itself. Sorry.

Committer:
oliverb
Date:
Mon Nov 18 13:49:59 2013 +0000
Revision:
0:e1231949753e
Child:
1:1106d7adbe79
First version to use buffering

Who changed what in which revision?

UserRevisionLine numberNew contents of line
oliverb 0:e1231949753e 1 // Hello World! for the TextLCD
oliverb 0:e1231949753e 2
oliverb 0:e1231949753e 3 #include "mbed.h"
oliverb 0:e1231949753e 4 /* mbed TextLCD Library, for a 4-bit LCD based on HD44780
oliverb 0:e1231949753e 5 * Copyright (c) 2007-2010, sford, http://mbed.org
oliverb 0:e1231949753e 6 *
oliverb 0:e1231949753e 7 * Permission is hereby granted, free of charge, to any person obtaining a copy
oliverb 0:e1231949753e 8 * of this software and associated documentation files (the "Software"), to deal
oliverb 0:e1231949753e 9 * in the Software without restriction, including without limitation the rights
oliverb 0:e1231949753e 10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
oliverb 0:e1231949753e 11 * copies of the Software, and to permit persons to whom the Software is
oliverb 0:e1231949753e 12 * furnished to do so, subject to the following conditions:
oliverb 0:e1231949753e 13 *
oliverb 0:e1231949753e 14 * The above copyright notice and this permission notice shall be included in
oliverb 0:e1231949753e 15 * all copies or substantial portions of the Software.
oliverb 0:e1231949753e 16 *
oliverb 0:e1231949753e 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
oliverb 0:e1231949753e 18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
oliverb 0:e1231949753e 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
oliverb 0:e1231949753e 20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
oliverb 0:e1231949753e 21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
oliverb 0:e1231949753e 22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
oliverb 0:e1231949753e 23 * THE SOFTWARE.
oliverb 0:e1231949753e 24 */
oliverb 0:e1231949753e 25
oliverb 0:e1231949753e 26 #ifndef MBED_TEXTLCD_H
oliverb 0:e1231949753e 27 #define MBED_TEXTLCD_H
oliverb 0:e1231949753e 28
oliverb 0:e1231949753e 29 //#include "mbed.h"
oliverb 0:e1231949753e 30
oliverb 0:e1231949753e 31 /** A TextLCD interface for driving 4-bit HD44780-based LCDs
oliverb 0:e1231949753e 32 *
oliverb 0:e1231949753e 33 * Currently supports 16x2, 20x2 and 20x4 panels
oliverb 0:e1231949753e 34 *
oliverb 0:e1231949753e 35 * @code
oliverb 0:e1231949753e 36 * #include "mbed.h"
oliverb 0:e1231949753e 37 * #include "TextLCD.h"
oliverb 0:e1231949753e 38 *
oliverb 0:e1231949753e 39 * TextLCD lcd(p10, p12, p15, p16, p29, p30); // rs, e, d4-d7
oliverb 0:e1231949753e 40 *
oliverb 0:e1231949753e 41 * int main() {
oliverb 0:e1231949753e 42 * lcd.printf("Hello World!\n");
oliverb 0:e1231949753e 43 * }
oliverb 0:e1231949753e 44 * @endcode
oliverb 0:e1231949753e 45 */
oliverb 0:e1231949753e 46 class TextLCD : public Stream {
oliverb 0:e1231949753e 47 public:
oliverb 0:e1231949753e 48
oliverb 0:e1231949753e 49 /** LCD panel format */
oliverb 0:e1231949753e 50 enum LCDType {
oliverb 0:e1231949753e 51 LCD16x2 /**< 16x2 LCD panel (default) */
oliverb 0:e1231949753e 52 , LCD16x2B /**< 16x2 LCD panel alternate addressing */
oliverb 0:e1231949753e 53 , LCD20x2 /**< 20x2 LCD panel */
oliverb 0:e1231949753e 54 , LCD20x4 /**< 20x4 LCD panel */
oliverb 0:e1231949753e 55 };
oliverb 0:e1231949753e 56
oliverb 0:e1231949753e 57 /** Create a TextLCD interface
oliverb 0:e1231949753e 58 *
oliverb 0:e1231949753e 59 * @param rs Instruction/data control line
oliverb 0:e1231949753e 60 * @param e Enable line (clock)
oliverb 0:e1231949753e 61 * @param d4-d7 Data lines for using as a 4-bit interface
oliverb 0:e1231949753e 62 * @param type Sets the panel size/addressing mode (default = LCD16x2)
oliverb 0:e1231949753e 63 */
oliverb 0:e1231949753e 64 TextLCD(PinName rs, PinName e, PinName d4, PinName d5, PinName d6, PinName d7, LCDType type = LCD16x2);
oliverb 0:e1231949753e 65
oliverb 0:e1231949753e 66 void init();
oliverb 0:e1231949753e 67 void init2();
oliverb 0:e1231949753e 68 void init3();
oliverb 0:e1231949753e 69 void init4();
oliverb 0:e1231949753e 70 void init5();
oliverb 0:e1231949753e 71 void init6();
oliverb 0:e1231949753e 72 void init7();
oliverb 0:e1231949753e 73 void init8();
oliverb 0:e1231949753e 74 void init9();
oliverb 0:e1231949753e 75
oliverb 0:e1231949753e 76
oliverb 0:e1231949753e 77 #if DOXYGEN_ONLY
oliverb 0:e1231949753e 78 /** Write a character to the LCD
oliverb 0:e1231949753e 79 *
oliverb 0:e1231949753e 80 * @param c The character to write to the display
oliverb 0:e1231949753e 81 */
oliverb 0:e1231949753e 82 int putc(int c);
oliverb 0:e1231949753e 83
oliverb 0:e1231949753e 84 /** Write a formated string to the LCD
oliverb 0:e1231949753e 85 *
oliverb 0:e1231949753e 86 * @param format A printf-style format string, followed by the
oliverb 0:e1231949753e 87 * variables to use in formating the string.
oliverb 0:e1231949753e 88 */
oliverb 0:e1231949753e 89 volatile int printf(const char* format, ...);
oliverb 0:e1231949753e 90 #endif
oliverb 0:e1231949753e 91
oliverb 0:e1231949753e 92 /** Locate to a screen column and row
oliverb 0:e1231949753e 93 *
oliverb 0:e1231949753e 94 * @param column The horizontal position from the left, indexed from 0
oliverb 0:e1231949753e 95 * @param row The vertical position from the top, indexed from 0
oliverb 0:e1231949753e 96 */
oliverb 0:e1231949753e 97 void locate(int column, int row);
oliverb 0:e1231949753e 98
oliverb 0:e1231949753e 99 /** Clear the screen and locate to 0,0 */
oliverb 0:e1231949753e 100 void cls();
oliverb 0:e1231949753e 101
oliverb 0:e1231949753e 102 int rows();
oliverb 0:e1231949753e 103 int columns();
oliverb 0:e1231949753e 104
oliverb 0:e1231949753e 105 volatile int busy;
oliverb 0:e1231949753e 106
oliverb 0:e1231949753e 107 protected:
oliverb 0:e1231949753e 108 Timeout timer;
oliverb 0:e1231949753e 109 // Stream implementation functions
oliverb 0:e1231949753e 110 virtual int _putc(int value);
oliverb 0:e1231949753e 111 virtual int _getc();
oliverb 0:e1231949753e 112
oliverb 0:e1231949753e 113 int address(int column, int row);
oliverb 0:e1231949753e 114 void character(int column, int row, int c);
oliverb 0:e1231949753e 115 void writeByte(int value);
oliverb 0:e1231949753e 116 void writeCommand(int command);
oliverb 0:e1231949753e 117 void writeData(int data);
oliverb 0:e1231949753e 118 void callback();
oliverb 0:e1231949753e 119
oliverb 0:e1231949753e 120 DigitalOut _rs, _e;
oliverb 0:e1231949753e 121 BusOut _d;
oliverb 0:e1231949753e 122 LCDType _type;
oliverb 0:e1231949753e 123
oliverb 0:e1231949753e 124 int _column;
oliverb 0:e1231949753e 125 int _row;
oliverb 0:e1231949753e 126 char _queue[40];
oliverb 0:e1231949753e 127 volatile int _head;
oliverb 0:e1231949753e 128 volatile int _tail;
oliverb 0:e1231949753e 129 // int _loop;
oliverb 0:e1231949753e 130 };
oliverb 0:e1231949753e 131
oliverb 0:e1231949753e 132 #endif
oliverb 0:e1231949753e 133 /* mbed TextLCD Library, for a 4-bit LCD based on HD44780
oliverb 0:e1231949753e 134 * Copyright (c) 2007-2010, sford, http://mbed.org
oliverb 0:e1231949753e 135 *
oliverb 0:e1231949753e 136 * Permission is hereby granted, free of charge, to any person obtaining a copy
oliverb 0:e1231949753e 137 * of this software and associated documentation files (the "Software"), to deal
oliverb 0:e1231949753e 138 * in the Software without restriction, including without limitation the rights
oliverb 0:e1231949753e 139 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
oliverb 0:e1231949753e 140 * copies of the Software, and to permit persons to whom the Software is
oliverb 0:e1231949753e 141 * furnished to do so, subject to the following conditions:
oliverb 0:e1231949753e 142 *
oliverb 0:e1231949753e 143 * The above copyright notice and this permission notice shall be included in
oliverb 0:e1231949753e 144 * all copies or substantial portions of the Software.
oliverb 0:e1231949753e 145 *
oliverb 0:e1231949753e 146 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
oliverb 0:e1231949753e 147 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
oliverb 0:e1231949753e 148 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
oliverb 0:e1231949753e 149 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
oliverb 0:e1231949753e 150 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
oliverb 0:e1231949753e 151 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
oliverb 0:e1231949753e 152 * THE SOFTWARE.
oliverb 0:e1231949753e 153 */
oliverb 0:e1231949753e 154
oliverb 0:e1231949753e 155 //#include "TextLCD.h"
oliverb 0:e1231949753e 156 //#include "mbed.h"
oliverb 0:e1231949753e 157
oliverb 0:e1231949753e 158
oliverb 0:e1231949753e 159 DigitalOut Led1(LED1);
oliverb 0:e1231949753e 160 DigitalOut Led2(LED2);
oliverb 0:e1231949753e 161 DigitalOut Led3(LED3);
oliverb 0:e1231949753e 162 DigitalOut Led4(LED4);
oliverb 0:e1231949753e 163
oliverb 0:e1231949753e 164
oliverb 0:e1231949753e 165
oliverb 0:e1231949753e 166
oliverb 0:e1231949753e 167
oliverb 0:e1231949753e 168 TextLCD::TextLCD(PinName rs, PinName e, PinName d4, PinName d5,
oliverb 0:e1231949753e 169 PinName d6, PinName d7, LCDType type) : busy(0),_rs(rs),
oliverb 0:e1231949753e 170 _e(e), _d(d4, d5, d6, d7),
oliverb 0:e1231949753e 171 _type(type) , _head(0), _tail(0) {}
oliverb 0:e1231949753e 172 void TextLCD::init()
oliverb 0:e1231949753e 173 {
oliverb 0:e1231949753e 174
oliverb 0:e1231949753e 175 busy=1;
oliverb 0:e1231949753e 176 _e = 0;
oliverb 0:e1231949753e 177 _rs = 0; // command mode
oliverb 0:e1231949753e 178 timer.attach(this,&TextLCD::init2,0.015);
oliverb 0:e1231949753e 179 }
oliverb 0:e1231949753e 180 void TextLCD::init2()
oliverb 0:e1231949753e 181 {
oliverb 0:e1231949753e 182
oliverb 0:e1231949753e 183 _d = 0x3;
oliverb 0:e1231949753e 184 _e = 1;
oliverb 0:e1231949753e 185 wait_us(1);
oliverb 0:e1231949753e 186 _e = 0;
oliverb 0:e1231949753e 187 timer.attach(this,&TextLCD::init3,0.0041);
oliverb 0:e1231949753e 188 }
oliverb 0:e1231949753e 189 void TextLCD::init3()
oliverb 0:e1231949753e 190 {
oliverb 0:e1231949753e 191 _d = 0x3;
oliverb 0:e1231949753e 192 _e = 1;
oliverb 0:e1231949753e 193 wait_us(1);
oliverb 0:e1231949753e 194 _e = 0;
oliverb 0:e1231949753e 195 timer.attach(this,&TextLCD::init4,0.0001);
oliverb 0:e1231949753e 196 }
oliverb 0:e1231949753e 197 void TextLCD::init4()
oliverb 0:e1231949753e 198 {
oliverb 0:e1231949753e 199 _d = 0x2;
oliverb 0:e1231949753e 200 _e = 1;
oliverb 0:e1231949753e 201 wait_us(1);
oliverb 0:e1231949753e 202 _e = 0;
oliverb 0:e1231949753e 203 timer.attach(this,&TextLCD::init5,0.000050);
oliverb 0:e1231949753e 204 }
oliverb 0:e1231949753e 205 void TextLCD::init5()
oliverb 0:e1231949753e 206 {
oliverb 0:e1231949753e 207
oliverb 0:e1231949753e 208 writeCommand(0x28); // Function set 001 BW N F - -
oliverb 0:e1231949753e 209 timer.attach(this,&TextLCD::init6,0.000050);
oliverb 0:e1231949753e 210 }
oliverb 0:e1231949753e 211 void TextLCD::init6()
oliverb 0:e1231949753e 212 {
oliverb 0:e1231949753e 213 writeCommand(0x0C);
oliverb 0:e1231949753e 214 timer.attach(this,&TextLCD::init7,0.000050);
oliverb 0:e1231949753e 215 }
oliverb 0:e1231949753e 216 void TextLCD::init7()
oliverb 0:e1231949753e 217 {
oliverb 0:e1231949753e 218 writeCommand(0x6); // Cursor Direction and Display Shift : 0000 01 CD S (CD 0-left, 1-right S(hift) 0-no, 1-yes
oliverb 0:e1231949753e 219 timer.attach(this,&TextLCD::init8,0.000050);
oliverb 0:e1231949753e 220 }
oliverb 0:e1231949753e 221 void TextLCD::init8()
oliverb 0:e1231949753e 222 {
oliverb 0:e1231949753e 223 writeCommand(0x01); // cls, and set cursor to 0
oliverb 0:e1231949753e 224 // This command takes 1.64 ms
oliverb 0:e1231949753e 225 timer.attach(this,&TextLCD::init9,0.00164);
oliverb 0:e1231949753e 226 }
oliverb 0:e1231949753e 227 void TextLCD::init9()
oliverb 0:e1231949753e 228 {
oliverb 0:e1231949753e 229 busy=0;
oliverb 0:e1231949753e 230 }
oliverb 0:e1231949753e 231
oliverb 0:e1231949753e 232 void TextLCD::character(int column, int row, int c) {
oliverb 0:e1231949753e 233 int a = address(column, row);
oliverb 0:e1231949753e 234 writeCommand(a);
oliverb 0:e1231949753e 235 writeData(c);
oliverb 0:e1231949753e 236 }
oliverb 0:e1231949753e 237
oliverb 0:e1231949753e 238 void TextLCD::cls() {
oliverb 0:e1231949753e 239 writeCommand(0x01); // cls, and set cursor to 0
oliverb 0:e1231949753e 240 wait(0.00164f); // This command takes 1.64 ms
oliverb 0:e1231949753e 241 locate(0, 0);
oliverb 0:e1231949753e 242 }
oliverb 0:e1231949753e 243
oliverb 0:e1231949753e 244 void TextLCD::locate(int column, int row) {
oliverb 0:e1231949753e 245 _column = column;
oliverb 0:e1231949753e 246 _row = row;
oliverb 0:e1231949753e 247 }
oliverb 0:e1231949753e 248 void TextLCD::callback()
oliverb 0:e1231949753e 249 {
oliverb 0:e1231949753e 250 if (_tail<_head)
oliverb 0:e1231949753e 251 {
oliverb 0:e1231949753e 252 _rs = 1; // data mode
oliverb 0:e1231949753e 253 writeByte(_queue[_tail++]);
oliverb 0:e1231949753e 254 timer.attach(this,&TextLCD::callback,0.000050f);
oliverb 0:e1231949753e 255 }
oliverb 0:e1231949753e 256 else
oliverb 0:e1231949753e 257 {
oliverb 0:e1231949753e 258 _head=_tail=0;
oliverb 0:e1231949753e 259 busy=0;
oliverb 0:e1231949753e 260 }
oliverb 0:e1231949753e 261 }
oliverb 0:e1231949753e 262
oliverb 0:e1231949753e 263
oliverb 0:e1231949753e 264
oliverb 0:e1231949753e 265
oliverb 0:e1231949753e 266 int TextLCD::_putc(int value)
oliverb 0:e1231949753e 267 {
oliverb 0:e1231949753e 268 if (_head<40)
oliverb 0:e1231949753e 269 {
oliverb 0:e1231949753e 270 _queue[_head++]=value;
oliverb 0:e1231949753e 271 };
oliverb 0:e1231949753e 272 if (!busy)
oliverb 0:e1231949753e 273 {
oliverb 0:e1231949753e 274 busy=1;
oliverb 0:e1231949753e 275 callback();
oliverb 0:e1231949753e 276 };
oliverb 0:e1231949753e 277 return value;
oliverb 0:e1231949753e 278 }
oliverb 0:e1231949753e 279
oliverb 0:e1231949753e 280 /*{
oliverb 0:e1231949753e 281 if (value == '\n') {
oliverb 0:e1231949753e 282 _column = 0;
oliverb 0:e1231949753e 283 _row++;
oliverb 0:e1231949753e 284 if (_row >= rows()) {
oliverb 0:e1231949753e 285 _row = 0;
oliverb 0:e1231949753e 286 }
oliverb 0:e1231949753e 287 } else {
oliverb 0:e1231949753e 288 character(_column, _row, value);
oliverb 0:e1231949753e 289 _column++;
oliverb 0:e1231949753e 290 if (_column >= columns()) {
oliverb 0:e1231949753e 291 _column = 0;
oliverb 0:e1231949753e 292 _row++;
oliverb 0:e1231949753e 293 if (_row >= rows()) {
oliverb 0:e1231949753e 294 _row = 0;
oliverb 0:e1231949753e 295 }
oliverb 0:e1231949753e 296 }
oliverb 0:e1231949753e 297 }
oliverb 0:e1231949753e 298 return value;
oliverb 0:e1231949753e 299 }
oliverb 0:e1231949753e 300 */
oliverb 0:e1231949753e 301 int TextLCD::_getc() {
oliverb 0:e1231949753e 302 return -1;
oliverb 0:e1231949753e 303 }
oliverb 0:e1231949753e 304
oliverb 0:e1231949753e 305 void TextLCD::writeByte(int value) {
oliverb 0:e1231949753e 306 _d = value >> 4;
oliverb 0:e1231949753e 307 _e = 1;
oliverb 0:e1231949753e 308 wait_us(1);
oliverb 0:e1231949753e 309 _e = 0;
oliverb 0:e1231949753e 310 _d = value >> 0;
oliverb 0:e1231949753e 311 wait_us(1);
oliverb 0:e1231949753e 312 _e = 1;
oliverb 0:e1231949753e 313 wait_us(1); // most instructions take 40us
oliverb 0:e1231949753e 314 _e = 0;
oliverb 0:e1231949753e 315 }
oliverb 0:e1231949753e 316
oliverb 0:e1231949753e 317 void TextLCD::writeCommand(int command) {
oliverb 0:e1231949753e 318 _rs = 0; //command mode
oliverb 0:e1231949753e 319 wait_us(50); // most instructions take 40us
oliverb 0:e1231949753e 320 writeByte(command);
oliverb 0:e1231949753e 321 }
oliverb 0:e1231949753e 322
oliverb 0:e1231949753e 323 void TextLCD::writeData(int data) {
oliverb 0:e1231949753e 324 _rs = 1; // data mode
oliverb 0:e1231949753e 325 wait_us(50); // most instructions take 40us
oliverb 0:e1231949753e 326 writeByte(data);
oliverb 0:e1231949753e 327 }
oliverb 0:e1231949753e 328
oliverb 0:e1231949753e 329 int TextLCD::address(int column, int row) {
oliverb 0:e1231949753e 330 switch (_type) {
oliverb 0:e1231949753e 331 case LCD20x4:
oliverb 0:e1231949753e 332 switch (row) {
oliverb 0:e1231949753e 333 case 0:
oliverb 0:e1231949753e 334 return 0x80 + column;
oliverb 0:e1231949753e 335 case 1:
oliverb 0:e1231949753e 336 return 0xc0 + column;
oliverb 0:e1231949753e 337 case 2:
oliverb 0:e1231949753e 338 return 0x94 + column;
oliverb 0:e1231949753e 339 case 3:
oliverb 0:e1231949753e 340 return 0xd4 + column;
oliverb 0:e1231949753e 341 }
oliverb 0:e1231949753e 342 case LCD16x2B:
oliverb 0:e1231949753e 343 return 0x80 + (row * 40) + column;
oliverb 0:e1231949753e 344 case LCD16x2:
oliverb 0:e1231949753e 345 case LCD20x2:
oliverb 0:e1231949753e 346 default:
oliverb 0:e1231949753e 347 return 0x80 + (row * 0x40) + column;
oliverb 0:e1231949753e 348 }
oliverb 0:e1231949753e 349 }
oliverb 0:e1231949753e 350
oliverb 0:e1231949753e 351 int TextLCD::columns() {
oliverb 0:e1231949753e 352 switch (_type) {
oliverb 0:e1231949753e 353 case LCD20x4:
oliverb 0:e1231949753e 354 case LCD20x2:
oliverb 0:e1231949753e 355 return 20;
oliverb 0:e1231949753e 356 case LCD16x2:
oliverb 0:e1231949753e 357 case LCD16x2B:
oliverb 0:e1231949753e 358 default:
oliverb 0:e1231949753e 359 return 16;
oliverb 0:e1231949753e 360 }
oliverb 0:e1231949753e 361 }
oliverb 0:e1231949753e 362
oliverb 0:e1231949753e 363 int TextLCD::rows() {
oliverb 0:e1231949753e 364 switch (_type) {
oliverb 0:e1231949753e 365 case LCD20x4:
oliverb 0:e1231949753e 366 return 4;
oliverb 0:e1231949753e 367 case LCD16x2:
oliverb 0:e1231949753e 368 case LCD16x2B:
oliverb 0:e1231949753e 369 case LCD20x2:
oliverb 0:e1231949753e 370 default:
oliverb 0:e1231949753e 371 return 2;
oliverb 0:e1231949753e 372 }
oliverb 0:e1231949753e 373 }
oliverb 0:e1231949753e 374
oliverb 0:e1231949753e 375 TextLCD lcd(p15, p16, p17, p18, p19, p20); // rs, e, d4-d7
oliverb 0:e1231949753e 376
oliverb 0:e1231949753e 377
oliverb 0:e1231949753e 378 int main() {
oliverb 0:e1231949753e 379 Led1=1;
oliverb 0:e1231949753e 380 lcd.init();
oliverb 0:e1231949753e 381 Led2=1;
oliverb 0:e1231949753e 382 Led1=0;
oliverb 0:e1231949753e 383 while (lcd.busy) {}
oliverb 0:e1231949753e 384 Led3=1;
oliverb 0:e1231949753e 385 Led2=0;
oliverb 0:e1231949753e 386 lcd.printf("Hello World!\n");
oliverb 0:e1231949753e 387 Led4=1;
oliverb 0:e1231949753e 388 Led3=0;
oliverb 0:e1231949753e 389 while (lcd.busy) {}
oliverb 0:e1231949753e 390 Led1=1;
oliverb 0:e1231949753e 391 }