LRSD stephane / Mbed 2 deprecated WEBserverv1

Dependencies:   mbed

Committer:
geiineuville
Date:
Sat Sep 03 09:42:32 2011 +0000
Revision:
0:4570f87afab6
v1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
geiineuville 0:4570f87afab6 1 /* mbed TextLCD Library, for a 4-bit LCD based on HD44780
geiineuville 0:4570f87afab6 2 * Copyright (c) 2007-2010, sford, http://mbed.org
geiineuville 0:4570f87afab6 3 * Changes by Erik Kerger
geiineuville 0:4570f87afab6 4 *
geiineuville 0:4570f87afab6 5 *
geiineuville 0:4570f87afab6 6 * Permission is hereby granted, free of charge, to any person obtaining a copy
geiineuville 0:4570f87afab6 7 * of this software and associated documentation files (the "Software"), to deal
geiineuville 0:4570f87afab6 8 * in the Software without restriction, including without limitation the rights
geiineuville 0:4570f87afab6 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
geiineuville 0:4570f87afab6 10 * copies of the Software, and to permit persons to whom the Software is
geiineuville 0:4570f87afab6 11 * furnished to do so, subject to the following conditions:
geiineuville 0:4570f87afab6 12 *
geiineuville 0:4570f87afab6 13 * The above copyright notice and this permission notice shall be included in
geiineuville 0:4570f87afab6 14 * all copies or substantial portions of the Software.
geiineuville 0:4570f87afab6 15 *
geiineuville 0:4570f87afab6 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
geiineuville 0:4570f87afab6 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
geiineuville 0:4570f87afab6 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
geiineuville 0:4570f87afab6 19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
geiineuville 0:4570f87afab6 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
geiineuville 0:4570f87afab6 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
geiineuville 0:4570f87afab6 22 * THE SOFTWARE.
geiineuville 0:4570f87afab6 23 */
geiineuville 0:4570f87afab6 24
geiineuville 0:4570f87afab6 25 #include "NewTextLCD.h"
geiineuville 0:4570f87afab6 26 #include "mbed.h"
geiineuville 0:4570f87afab6 27
geiineuville 0:4570f87afab6 28 TextLCD::TextLCD(PinName rs, PinName rw, PinName e, PinName d4, PinName d5,
geiineuville 0:4570f87afab6 29 PinName d6, PinName d7, LCDType type) : _rs(rs), _rw(rw), _e(e),
geiineuville 0:4570f87afab6 30 _d(d4, d5, d6, d7), _type(type) {
geiineuville 0:4570f87afab6 31 _rs = 0; // command mode
geiineuville 0:4570f87afab6 32 _rw = 0; // r/w in defined state
geiineuville 0:4570f87afab6 33 _e = 0; // 0 --> inactive (most important change to original TextLCD)
geiineuville 0:4570f87afab6 34
geiineuville 0:4570f87afab6 35 if (_type != LCDuser)
geiineuville 0:4570f87afab6 36 setLCDparam(_type); // otherwise rows, colums, comdelay, adresses must be set before
geiineuville 0:4570f87afab6 37
geiineuville 0:4570f87afab6 38 wait(0.050f); // Wait 50ms to ensure powered up
geiineuville 0:4570f87afab6 39
geiineuville 0:4570f87afab6 40 // send "Display Settings" 3 times (Only top nibble of 0x30 as we've got 4-bit bus)
geiineuville 0:4570f87afab6 41 // this sets controler into 8 bit mode, so we have a defined state
geiineuville 0:4570f87afab6 42 for (int i=0; i<3; i++) {
geiineuville 0:4570f87afab6 43 _e = 1;
geiineuville 0:4570f87afab6 44 __nop();
geiineuville 0:4570f87afab6 45 __nop();
geiineuville 0:4570f87afab6 46 _d = 0x3;
geiineuville 0:4570f87afab6 47 __nop(); // data setup time at least 60 ns
geiineuville 0:4570f87afab6 48 _e = 0;
geiineuville 0:4570f87afab6 49 wait(0.005f); // 5ms
geiineuville 0:4570f87afab6 50 }
geiineuville 0:4570f87afab6 51 _e = 1;
geiineuville 0:4570f87afab6 52 __nop();
geiineuville 0:4570f87afab6 53 __nop();
geiineuville 0:4570f87afab6 54 _d = 0x2; // 4 Bit mode (after this command, we have to send 2 nibbles)
geiineuville 0:4570f87afab6 55 __nop();
geiineuville 0:4570f87afab6 56 _e = 0;
geiineuville 0:4570f87afab6 57 wait_us(LCDparam.delay);
geiineuville 0:4570f87afab6 58
geiineuville 0:4570f87afab6 59 writeCommand(0x28); // Function set 4 Bit, 2Line, 5*7
geiineuville 0:4570f87afab6 60 writeCommand(0x08); // Display off
geiineuville 0:4570f87afab6 61 cls(); // clear display, reset _column and _row
geiineuville 0:4570f87afab6 62 writeCommand(0x04); // cursor right, Display is not shifted
geiineuville 0:4570f87afab6 63 writeCommand(0x0C); // Display on , Cursor off
geiineuville 0:4570f87afab6 64 }
geiineuville 0:4570f87afab6 65
geiineuville 0:4570f87afab6 66 void TextLCD::character(int column, int row, int c) {
geiineuville 0:4570f87afab6 67 int a = 0x80 | (LCDparam.adresses[row & 3] + column);
geiineuville 0:4570f87afab6 68 writeCommand(a); // set cursor address
geiineuville 0:4570f87afab6 69 writeData(c); // write char
geiineuville 0:4570f87afab6 70 }
geiineuville 0:4570f87afab6 71
geiineuville 0:4570f87afab6 72 void TextLCD::cls() {
geiineuville 0:4570f87afab6 73 writeCommand(0x01); // cls, and set cursor to 0
geiineuville 0:4570f87afab6 74 locate(0, 0); // set internal position
geiineuville 0:4570f87afab6 75 wait_us(45 * LCDparam.delay); // CLS need much time
geiineuville 0:4570f87afab6 76 }
geiineuville 0:4570f87afab6 77
geiineuville 0:4570f87afab6 78 void TextLCD::locate(int column, int row) {
geiineuville 0:4570f87afab6 79 _column = column; // set position for next char
geiineuville 0:4570f87afab6 80 _row = row; // note: cursor is not set yet
geiineuville 0:4570f87afab6 81 }
geiineuville 0:4570f87afab6 82
geiineuville 0:4570f87afab6 83
geiineuville 0:4570f87afab6 84
geiineuville 0:4570f87afab6 85 int TextLCD::_putc(int value) {
geiineuville 0:4570f87afab6 86 if (value == '\n') {
geiineuville 0:4570f87afab6 87 _column = 0;
geiineuville 0:4570f87afab6 88 _row++;
geiineuville 0:4570f87afab6 89 if (_row >= LCDparam.rows) {
geiineuville 0:4570f87afab6 90 _row = 0;
geiineuville 0:4570f87afab6 91 }
geiineuville 0:4570f87afab6 92 } else {
geiineuville 0:4570f87afab6 93 character(_column, _row, value);
geiineuville 0:4570f87afab6 94 _column++;
geiineuville 0:4570f87afab6 95 if (_column >= LCDparam.columns) {
geiineuville 0:4570f87afab6 96 _column = 0;
geiineuville 0:4570f87afab6 97 _row++;
geiineuville 0:4570f87afab6 98 if (_row >= LCDparam.rows) {
geiineuville 0:4570f87afab6 99 _row = 0;
geiineuville 0:4570f87afab6 100 }
geiineuville 0:4570f87afab6 101 }
geiineuville 0:4570f87afab6 102 }
geiineuville 0:4570f87afab6 103 return value;
geiineuville 0:4570f87afab6 104 }
geiineuville 0:4570f87afab6 105
geiineuville 0:4570f87afab6 106 // Dummy function - read not supported
geiineuville 0:4570f87afab6 107 int TextLCD::_getc() {
geiineuville 0:4570f87afab6 108 return -1;
geiineuville 0:4570f87afab6 109 }
geiineuville 0:4570f87afab6 110
geiineuville 0:4570f87afab6 111 void TextLCD::writeByte(int value) {
geiineuville 0:4570f87afab6 112 _e = 1;
geiineuville 0:4570f87afab6 113 __nop();
geiineuville 0:4570f87afab6 114 _d = value >> 4; // higher nibble first
geiineuville 0:4570f87afab6 115 __nop();
geiineuville 0:4570f87afab6 116 _e = 0;
geiineuville 0:4570f87afab6 117 __nop();
geiineuville 0:4570f87afab6 118 __nop();
geiineuville 0:4570f87afab6 119 _e = 1;
geiineuville 0:4570f87afab6 120 __nop();
geiineuville 0:4570f87afab6 121 _d = value >> 0; // then lower
geiineuville 0:4570f87afab6 122 __nop();
geiineuville 0:4570f87afab6 123 _e = 0;
geiineuville 0:4570f87afab6 124 }
geiineuville 0:4570f87afab6 125
geiineuville 0:4570f87afab6 126 void TextLCD::writeCommand(int command) {
geiineuville 0:4570f87afab6 127 _rs = 0;
geiineuville 0:4570f87afab6 128 writeByte(command);
geiineuville 0:4570f87afab6 129 wait_us(LCDparam.delay);
geiineuville 0:4570f87afab6 130 }
geiineuville 0:4570f87afab6 131
geiineuville 0:4570f87afab6 132
geiineuville 0:4570f87afab6 133 void TextLCD::writeData(int data) {
geiineuville 0:4570f87afab6 134 _rs = 1;
geiineuville 0:4570f87afab6 135 writeByte(data);
geiineuville 0:4570f87afab6 136 wait_us(LCDparam.delay);
geiineuville 0:4570f87afab6 137 }
geiineuville 0:4570f87afab6 138
geiineuville 0:4570f87afab6 139
geiineuville 0:4570f87afab6 140 // set user defined char
geiineuville 0:4570f87afab6 141 void TextLCD::writeCGRAM(int address, int pattern[8]){
geiineuville 0:4570f87afab6 142 int i;
geiineuville 0:4570f87afab6 143 address = address & 7; //max 8 char
geiineuville 0:4570f87afab6 144 for(i=0;i<8;i++){
geiineuville 0:4570f87afab6 145 writeCommand(0x40 | (address * 8) + i);
geiineuville 0:4570f87afab6 146 writeData(pattern[i]);
geiineuville 0:4570f87afab6 147 }
geiineuville 0:4570f87afab6 148 }
geiineuville 0:4570f87afab6 149
geiineuville 0:4570f87afab6 150 void TextLCD::setLCDparam(LCDType _type){
geiineuville 0:4570f87afab6 151 switch (_type) {
geiineuville 0:4570f87afab6 152
geiineuville 0:4570f87afab6 153 case LCD16x2:
geiineuville 0:4570f87afab6 154 case LCD16x2B:
geiineuville 0:4570f87afab6 155 LCDparam.columns = 16;
geiineuville 0:4570f87afab6 156 break;
geiineuville 0:4570f87afab6 157 case LCD20x2:
geiineuville 0:4570f87afab6 158 case LCD20x4:
geiineuville 0:4570f87afab6 159 LCDparam.columns = 20;
geiineuville 0:4570f87afab6 160 break;
geiineuville 0:4570f87afab6 161 case LCD24x2:
geiineuville 0:4570f87afab6 162 LCDparam.columns = 24;
geiineuville 0:4570f87afab6 163 break;
geiineuville 0:4570f87afab6 164 }
geiineuville 0:4570f87afab6 165 if (_type == LCD20x4)
geiineuville 0:4570f87afab6 166 LCDparam.rows = 4;
geiineuville 0:4570f87afab6 167 else
geiineuville 0:4570f87afab6 168 LCDparam.rows = 2;
geiineuville 0:4570f87afab6 169
geiineuville 0:4570f87afab6 170 LCDparam.adresses[0] = 0;
geiineuville 0:4570f87afab6 171
geiineuville 0:4570f87afab6 172 if (_type == LCD16x2B)
geiineuville 0:4570f87afab6 173 LCDparam.adresses[1] = 40;
geiineuville 0:4570f87afab6 174 else
geiineuville 0:4570f87afab6 175 LCDparam.adresses[1] = 0x40;
geiineuville 0:4570f87afab6 176
geiineuville 0:4570f87afab6 177 if (_type == LCD20x4) {
geiineuville 0:4570f87afab6 178 LCDparam.adresses[2] = 0x14;
geiineuville 0:4570f87afab6 179 LCDparam.adresses[3] = 0x54;}
geiineuville 0:4570f87afab6 180 else {
geiineuville 0:4570f87afab6 181 LCDparam.adresses[2] = 0;
geiineuville 0:4570f87afab6 182 LCDparam.adresses[3] = 0;}
geiineuville 0:4570f87afab6 183
geiineuville 0:4570f87afab6 184 LCDparam.delay = 50; // 50 us delays as default
geiineuville 0:4570f87afab6 185 }
geiineuville 0:4570f87afab6 186