NOT FINISHED YET!!! My first try to get a self built fully working Quadrocopter based on an mbed, a self built frame and some other more or less cheap parts.
LCD/LCD.cpp@33:fd98776b6cc7, 2013-04-04 (annotated)
- Committer:
- maetugr
- Date:
- Thu Apr 04 14:25:21 2013 +0000
- Revision:
- 33:fd98776b6cc7
- Parent:
- 0:0c4fafa398b4
New version developed in eastern holidays, ported Madgwick Filter, added support for chaning PID values while flying over bluetooth, still not flying stable or even controllable
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
maetugr | 0:0c4fafa398b4 | 1 | /* mbed LCD Library, for a 4-bit LCD based on HD44780 |
maetugr | 0:0c4fafa398b4 | 2 | * Copyright (c) 2007-2010, hb9gaa |
maetugr | 0:0c4fafa398b4 | 3 | * |
maetugr | 0:0c4fafa398b4 | 4 | */ |
maetugr | 0:0c4fafa398b4 | 5 | |
maetugr | 0:0c4fafa398b4 | 6 | #include "LCD.h" |
maetugr | 0:0c4fafa398b4 | 7 | #include "mbed.h" |
maetugr | 0:0c4fafa398b4 | 8 | |
maetugr | 0:0c4fafa398b4 | 9 | TextLCD::TextLCD(PinName rs, PinName rw, PinName e, PinName d0, PinName d1, |
maetugr | 0:0c4fafa398b4 | 10 | PinName d2, PinName d3, LCDType type) : _rs(rs), _rw(rw), |
maetugr | 0:0c4fafa398b4 | 11 | _e(e), _d(d0, d1, d2, d3), |
maetugr | 0:0c4fafa398b4 | 12 | _type(type) { |
maetugr | 0:0c4fafa398b4 | 13 | |
maetugr | 0:0c4fafa398b4 | 14 | _e = 1; |
maetugr | 0:0c4fafa398b4 | 15 | _rw = 0; |
maetugr | 0:0c4fafa398b4 | 16 | _rs = 0; // command mode |
maetugr | 0:0c4fafa398b4 | 17 | |
maetugr | 0:0c4fafa398b4 | 18 | wait(0.015); // Wait 15ms to ensure powered up |
maetugr | 0:0c4fafa398b4 | 19 | |
maetugr | 0:0c4fafa398b4 | 20 | // send "Display Settings" 3 times (Only top nibble of 0x30 as we've got 4-bit bus) |
maetugr | 0:0c4fafa398b4 | 21 | for (int i=0; i<3; i++) { |
maetugr | 0:0c4fafa398b4 | 22 | writeByte(0x3); |
maetugr | 0:0c4fafa398b4 | 23 | wait(0.00164); // this command takes 1.64ms, so wait for it |
maetugr | 0:0c4fafa398b4 | 24 | } |
maetugr | 0:0c4fafa398b4 | 25 | writeByte(0x2); // 4-bit mode |
maetugr | 0:0c4fafa398b4 | 26 | wait(0.0001f); // most instructions take 100us |
maetugr | 0:0c4fafa398b4 | 27 | |
maetugr | 0:0c4fafa398b4 | 28 | writeCommand(0x28); // Function set 001 BW N F - - |
maetugr | 0:0c4fafa398b4 | 29 | writeCommand(0x0C); |
maetugr | 0:0c4fafa398b4 | 30 | writeCommand(0x6); // Cursor Direction and Display Shift : 0000 01 CD S (CD 0-left, 1-right S(hift) 0-no, 1-yes |
maetugr | 0:0c4fafa398b4 | 31 | cls(); |
maetugr | 0:0c4fafa398b4 | 32 | } |
maetugr | 0:0c4fafa398b4 | 33 | |
maetugr | 0:0c4fafa398b4 | 34 | void TextLCD::character(int column, int row, int c) { |
maetugr | 0:0c4fafa398b4 | 35 | int a = address(column, row); |
maetugr | 0:0c4fafa398b4 | 36 | writeCommand(a); |
maetugr | 0:0c4fafa398b4 | 37 | writeData(c); |
maetugr | 0:0c4fafa398b4 | 38 | } |
maetugr | 0:0c4fafa398b4 | 39 | |
maetugr | 0:0c4fafa398b4 | 40 | void TextLCD::cls() { |
maetugr | 0:0c4fafa398b4 | 41 | writeCommand(0x01); // cls, and set cursor to 0 |
maetugr | 0:0c4fafa398b4 | 42 | wait(0.004100f); // This command takes 4.1 ms |
maetugr | 0:0c4fafa398b4 | 43 | locate(0, 0); |
maetugr | 0:0c4fafa398b4 | 44 | } |
maetugr | 0:0c4fafa398b4 | 45 | |
maetugr | 0:0c4fafa398b4 | 46 | void TextLCD::locate(int row, int column) { |
maetugr | 0:0c4fafa398b4 | 47 | _row = row; |
maetugr | 0:0c4fafa398b4 | 48 | _column = column; |
maetugr | 0:0c4fafa398b4 | 49 | } |
maetugr | 0:0c4fafa398b4 | 50 | |
maetugr | 0:0c4fafa398b4 | 51 | int TextLCD::_putc(int value) { |
maetugr | 0:0c4fafa398b4 | 52 | if (value == '\n') { |
maetugr | 0:0c4fafa398b4 | 53 | _column = 0; |
maetugr | 0:0c4fafa398b4 | 54 | _row++; |
maetugr | 0:0c4fafa398b4 | 55 | if (_row >= rows()) { |
maetugr | 0:0c4fafa398b4 | 56 | _row = 0; |
maetugr | 0:0c4fafa398b4 | 57 | } |
maetugr | 0:0c4fafa398b4 | 58 | } else { |
maetugr | 0:0c4fafa398b4 | 59 | character(_column, _row, value); |
maetugr | 0:0c4fafa398b4 | 60 | _column++; |
maetugr | 0:0c4fafa398b4 | 61 | if (_column >= columns()) { |
maetugr | 0:0c4fafa398b4 | 62 | _column = 0; |
maetugr | 0:0c4fafa398b4 | 63 | _row++; |
maetugr | 0:0c4fafa398b4 | 64 | if (_row >= rows()) { |
maetugr | 0:0c4fafa398b4 | 65 | _row = 0; |
maetugr | 0:0c4fafa398b4 | 66 | } |
maetugr | 0:0c4fafa398b4 | 67 | } |
maetugr | 0:0c4fafa398b4 | 68 | } |
maetugr | 0:0c4fafa398b4 | 69 | return value; |
maetugr | 0:0c4fafa398b4 | 70 | } |
maetugr | 0:0c4fafa398b4 | 71 | |
maetugr | 0:0c4fafa398b4 | 72 | int TextLCD::_getc() { |
maetugr | 0:0c4fafa398b4 | 73 | return -1; |
maetugr | 0:0c4fafa398b4 | 74 | } |
maetugr | 0:0c4fafa398b4 | 75 | |
maetugr | 0:0c4fafa398b4 | 76 | void TextLCD::writeByte(int value) { |
maetugr | 0:0c4fafa398b4 | 77 | _d = value >> 4; |
maetugr | 0:0c4fafa398b4 | 78 | wait(0.0001); // most instructions take 100us |
maetugr | 0:0c4fafa398b4 | 79 | _e = 0; |
maetugr | 0:0c4fafa398b4 | 80 | wait(0.0001); |
maetugr | 0:0c4fafa398b4 | 81 | _e = 1; |
maetugr | 0:0c4fafa398b4 | 82 | _d = value >> 0; |
maetugr | 0:0c4fafa398b4 | 83 | wait(0.0001); |
maetugr | 0:0c4fafa398b4 | 84 | _e = 0; |
maetugr | 0:0c4fafa398b4 | 85 | wait(0.0001); // most instructions take 100us |
maetugr | 0:0c4fafa398b4 | 86 | _e = 1; |
maetugr | 0:0c4fafa398b4 | 87 | } |
maetugr | 0:0c4fafa398b4 | 88 | |
maetugr | 0:0c4fafa398b4 | 89 | void TextLCD::writeCommand(int command) { |
maetugr | 0:0c4fafa398b4 | 90 | _rs = 0; |
maetugr | 0:0c4fafa398b4 | 91 | writeByte(command); |
maetugr | 0:0c4fafa398b4 | 92 | } |
maetugr | 0:0c4fafa398b4 | 93 | |
maetugr | 0:0c4fafa398b4 | 94 | void TextLCD::writeData(int data) { |
maetugr | 0:0c4fafa398b4 | 95 | _rs = 1; |
maetugr | 0:0c4fafa398b4 | 96 | writeByte(data); |
maetugr | 0:0c4fafa398b4 | 97 | } |
maetugr | 0:0c4fafa398b4 | 98 | |
maetugr | 0:0c4fafa398b4 | 99 | int TextLCD::address(int column, int row) { |
maetugr | 0:0c4fafa398b4 | 100 | switch (_type) { |
maetugr | 0:0c4fafa398b4 | 101 | case LCD20x4: |
maetugr | 0:0c4fafa398b4 | 102 | switch (row) { |
maetugr | 0:0c4fafa398b4 | 103 | case 0: |
maetugr | 0:0c4fafa398b4 | 104 | return 0x80 + column; |
maetugr | 0:0c4fafa398b4 | 105 | case 1: |
maetugr | 0:0c4fafa398b4 | 106 | return 0xc0 + column; |
maetugr | 0:0c4fafa398b4 | 107 | case 2: |
maetugr | 0:0c4fafa398b4 | 108 | return 0x94 + column; |
maetugr | 0:0c4fafa398b4 | 109 | case 3: |
maetugr | 0:0c4fafa398b4 | 110 | return 0xd4 + column; |
maetugr | 0:0c4fafa398b4 | 111 | } |
maetugr | 0:0c4fafa398b4 | 112 | case LCD16x2B: |
maetugr | 0:0c4fafa398b4 | 113 | return 0x80 + (row * 40) + column; |
maetugr | 0:0c4fafa398b4 | 114 | case LCD16x2: |
maetugr | 0:0c4fafa398b4 | 115 | case LCD20x2: |
maetugr | 0:0c4fafa398b4 | 116 | default: |
maetugr | 0:0c4fafa398b4 | 117 | return 0x80 + (row * 0x40) + column; |
maetugr | 0:0c4fafa398b4 | 118 | } |
maetugr | 0:0c4fafa398b4 | 119 | } |
maetugr | 0:0c4fafa398b4 | 120 | |
maetugr | 0:0c4fafa398b4 | 121 | int TextLCD::columns() { |
maetugr | 0:0c4fafa398b4 | 122 | switch (_type) { |
maetugr | 0:0c4fafa398b4 | 123 | case LCD20x4: |
maetugr | 0:0c4fafa398b4 | 124 | case LCD20x2: |
maetugr | 0:0c4fafa398b4 | 125 | return 20; |
maetugr | 0:0c4fafa398b4 | 126 | case LCD16x2: |
maetugr | 0:0c4fafa398b4 | 127 | case LCD16x2B: |
maetugr | 0:0c4fafa398b4 | 128 | default: |
maetugr | 0:0c4fafa398b4 | 129 | return 16; |
maetugr | 0:0c4fafa398b4 | 130 | } |
maetugr | 0:0c4fafa398b4 | 131 | } |
maetugr | 0:0c4fafa398b4 | 132 | |
maetugr | 0:0c4fafa398b4 | 133 | int TextLCD::rows() { |
maetugr | 0:0c4fafa398b4 | 134 | switch (_type) { |
maetugr | 0:0c4fafa398b4 | 135 | case LCD20x4: |
maetugr | 0:0c4fafa398b4 | 136 | return 4; |
maetugr | 0:0c4fafa398b4 | 137 | case LCD16x2: |
maetugr | 0:0c4fafa398b4 | 138 | case LCD16x2B: |
maetugr | 0:0c4fafa398b4 | 139 | case LCD20x2: |
maetugr | 0:0c4fafa398b4 | 140 | default: |
maetugr | 0:0c4fafa398b4 | 141 | return 2; |
maetugr | 0:0c4fafa398b4 | 142 | } |
maetugr | 0:0c4fafa398b4 | 143 | } |