Functions test with Optrex LCD 20x4
Dependents: DatatypesLength AsciiCode IntegerFormatSpecifiers FloatFormatSpecifier
Diff: OptrexLCD.cpp
- Revision:
- 0:ef7b6dec773f
diff -r 000000000000 -r ef7b6dec773f OptrexLCD.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OptrexLCD.cpp Mon Nov 22 21:58:23 2010 +0000 @@ -0,0 +1,180 @@ +/* mbed TextLCD Library, for a 4-bit LCD based on Optrex DCM20481 NY-LY-ABE +* +* Copyright (c) 2007-2010, sford modified by E.Sjoukes +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software i +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +*/ + +#include "OptrexLCD.h" +#include "mbed.h" + +// initialiseer +TextLCD::TextLCD(PinName rs, PinName e, PinName d0, PinName d1, PinName d2, + PinName d3, LCDType type) : _rs(rs), _e(e), _d(d0, d1, d2, d3), _type(type) +{ + _e = 1; // enable normaly high + _rs = 0; // command mode + + wait(0.015); // Wait 15ms to ensure powered up + + for (int i=0; i<3; i++) // send "Display Settings" 3 times + { + writeByte(0x3); + wait(0.00164); // this command takes 1.64ms, so wait for it + } + writeByte(0x2); // 4-bit mode + wait(0.000040f); // most instructions take 40us + + writeCommand(0x28); // Function set 001 BW N F - - + writeCommand(0x0C); + writeCommand(0x6); // Cursor Direction and Display Shift : 0000 01 CD S (CD 0-left, 1-right S(hift) 0-no, 1-yes + cls(); +} + +void TextLCD::character(int column, int row, int c) +{ + int a = address(column, row); + writeCommand(a); + writeData(c); +} + +void TextLCD::cls() +{ + writeCommand(0x01); // cls, and set cursor to 0 + wait(0.003000f); // This command takes 3ms with Optrex, normaly it wood be 1.64ms + locate(0, 0); +} + +void TextLCD::locate(int column, int row) +{ + _column = column; + _row = row; +} + +int TextLCD::_putc(int value) +{ + if (value == '\n') + { + _column = 0; + _row++; + if (_row >= rows()) + { + _row = 0; + } + } + else + { + character(_column, _row, value); + _column++; + if (_column >= columns()) + { + _column = 0; + _row++; + if (_row >= rows()) + { + _row = 0; + } + } + } + return value; +} + +int TextLCD::_getc() +{ + return -1; +} + +void TextLCD::writeByte(int value) +{ + _d = value >> 4; + wait(0.000040f); // most instructions take 40us + _e = 0; + wait(0.000075f); // enable puls of Optrex needs to be 75us + _e = 1; + _d = value >> 0; + wait(0.000075f); // enable puls of Optrex needs to be 75us + _e = 0; + wait(0.000075f); // enable puls of Optrex needs to be 75us + _e = 1; +} + +void TextLCD::writeCommand(int command) +{ + _rs = 0; + writeByte(command); +} + +void TextLCD::writeData(int data) +{ + _rs = 1; + writeByte(data); +} + +int TextLCD::address(int column, int row) +{ + switch (_type) + { + case LCD20x4: + switch (row) + { + case 0: + return 0x80 + column; + case 1: + return 0xc0 + column; + case 2: + return 0x94 + column; + case 3: + return 0xd4 + column; + } + case LCD16x2B: + return 0x80 + (row * 40) + column; + case LCD16x2: + case LCD20x2: + default: + return 0x80 + (row * 0x40) + column; + } +} + +int TextLCD::columns() +{ + switch (_type) + { + case LCD20x4: + case LCD20x2: + return 20; + case LCD16x2: + case LCD16x2B: + default: + return 16; + } +} + +int TextLCD::rows() +{ + switch (_type) + { + case LCD20x4: + return 4; + case LCD16x2: + case LCD16x2B: + case LCD20x2: + default: + return 2; + } +}