LRSD stephane / Mbed 2 deprecated WEBserverv3

Dependencies:   mbed

Committer:
geiineuville
Date:
Thu Sep 08 08:57:21 2011 +0000
Revision:
0:9cf1d79ebe04
v0 v1 v2   \"v3\"

Who changed what in which revision?

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