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.

Dependencies:   mbed MODI2C

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?

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