TextLCD_RUS - this change module NewTextLCD Erik Kerger. It adds the ability to output a simple Russian text, as well as some additional features implemented chip HD44780. The test was carried out on the module module MT-16S2D.

Dependents:   Rus_TextLCD

Committer:
vbogom
Date:
Tue Mar 24 20:52:19 2015 +0000
Revision:
2:fbd41515ce75
Parent:
0:d4a4f76fffb5

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vbogom 0:d4a4f76fffb5 1 /* mbed TextLCD Library, for a 4-bit LCD based on HD44780
vbogom 0:d4a4f76fffb5 2 * Copyright (c) 2007-2010, sford, http://mbed.org
vbogom 0:d4a4f76fffb5 3 * Changes by Erik Kerger
vbogom 0:d4a4f76fffb5 4 *
vbogom 0:d4a4f76fffb5 5 *
vbogom 0:d4a4f76fffb5 6 * Changes by Bogomazyuk Vasiliy (Богомазюк Василий)
vbogom 0:d4a4f76fffb5 7 * Модуль испытан на жидкокристаллическом модуле MT–16S2D
vbogom 0:d4a4f76fffb5 8 *
vbogom 0:d4a4f76fffb5 9 *
vbogom 0:d4a4f76fffb5 10 *
vbogom 0:d4a4f76fffb5 11 * Permission is hereby granted, free of charge, to any person obtaining a copy
vbogom 0:d4a4f76fffb5 12 * of this software and associated documentation files (the "Software"), to deal
vbogom 0:d4a4f76fffb5 13 * in the Software without restriction, including without limitation the rights
vbogom 0:d4a4f76fffb5 14 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
vbogom 0:d4a4f76fffb5 15 * copies of the Software, and to permit persons to whom the Software is
vbogom 0:d4a4f76fffb5 16 * furnished to do so, subject to the following conditions:
vbogom 0:d4a4f76fffb5 17 *
vbogom 0:d4a4f76fffb5 18 * The above copyright notice and this permission notice shall be included in
vbogom 0:d4a4f76fffb5 19 * all copies or substantial portions of the Software.
vbogom 0:d4a4f76fffb5 20 *
vbogom 0:d4a4f76fffb5 21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
vbogom 0:d4a4f76fffb5 22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
vbogom 0:d4a4f76fffb5 23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
vbogom 0:d4a4f76fffb5 24 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
vbogom 0:d4a4f76fffb5 25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
vbogom 0:d4a4f76fffb5 26 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
vbogom 0:d4a4f76fffb5 27 * THE SOFTWARE.
vbogom 0:d4a4f76fffb5 28 */
vbogom 0:d4a4f76fffb5 29
vbogom 0:d4a4f76fffb5 30 #include "TextLCD_Rus.h"
vbogom 0:d4a4f76fffb5 31 #include "mbed.h"
vbogom 0:d4a4f76fffb5 32
vbogom 0:d4a4f76fffb5 33 //---------------------------------------------------------------------------------------------------------
vbogom 0:d4a4f76fffb5 34 // Начало изменений
vbogom 0:d4a4f76fffb5 35 //---------------------------------------------------------------------------------------------------------
vbogom 0:d4a4f76fffb5 36 #include <string>
vbogom 0:d4a4f76fffb5 37
vbogom 0:d4a4f76fffb5 38 const unsigned char utf_recode[] =
vbogom 0:d4a4f76fffb5 39 {
vbogom 0:d4a4f76fffb5 40 0x41,0xa0,0x42,0xa1,0xe0,0x45,0xa3,0xa4,
vbogom 0:d4a4f76fffb5 41 0xa5,0xa6,0x4b,0xa7,0x4d,0x48,0x4f,0xa8,
vbogom 0:d4a4f76fffb5 42 0x50,0x43,0x54,0xa9,0xaa,0x58,0xe1,0xab,
vbogom 0:d4a4f76fffb5 43 0xac,0xe2,0xad,0xae,0x62,0xaf,0xb0,0xb1,
vbogom 0:d4a4f76fffb5 44 0x61,0xb2,0xb3,0xb4,0xe3,0x65,0xb6,0xb7,
vbogom 0:d4a4f76fffb5 45 0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0x6f,0xbe,
vbogom 0:d4a4f76fffb5 46 0x70,0x63,0xbf,0x79,0xe4,0x78,0xe5,0xc0,
vbogom 0:d4a4f76fffb5 47 0xc1,0xe6,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7
vbogom 0:d4a4f76fffb5 48 };
vbogom 0:d4a4f76fffb5 49
vbogom 0:d4a4f76fffb5 50 int ConvertChar(int c)
vbogom 0:d4a4f76fffb5 51 {
vbogom 0:d4a4f76fffb5 52 int i=c;
vbogom 0:d4a4f76fffb5 53 if ((c>=0xD090)and(c<=0xD0BF))i=utf_recode[c-0xD090];
vbogom 0:d4a4f76fffb5 54 if ((c>=0xD180)and(c<=0xD18F))i=utf_recode[c-0xD150];
vbogom 0:d4a4f76fffb5 55 if (c==0xD081) i=0xA2;
vbogom 0:d4a4f76fffb5 56 if (c==0xD191) i=0xB5;
vbogom 0:d4a4f76fffb5 57 return i;
vbogom 0:d4a4f76fffb5 58 }
vbogom 0:d4a4f76fffb5 59 //---------------------------------------------------------------------------------------------------------
vbogom 0:d4a4f76fffb5 60 // Конец изменений
vbogom 0:d4a4f76fffb5 61 //---------------------------------------------------------------------------------------------------------
vbogom 0:d4a4f76fffb5 62
vbogom 0:d4a4f76fffb5 63
vbogom 0:d4a4f76fffb5 64 TextLCD::TextLCD(PinName rs,PinName e, PinName d4, PinName d5,
vbogom 0:d4a4f76fffb5 65 PinName d6, PinName d7, LCDType type) : _rs(rs), _e(e),
vbogom 0:d4a4f76fffb5 66 _d(d4, d5, d6, d7), _type(type) {
vbogom 0:d4a4f76fffb5 67 _rs = 0; // command mode
vbogom 0:d4a4f76fffb5 68 _e = 0; // 0 --> inactive (most important change to original TextLCD)
vbogom 0:d4a4f76fffb5 69
vbogom 0:d4a4f76fffb5 70 if (_type != LCDuser)
vbogom 0:d4a4f76fffb5 71 setLCDparam(_type); // otherwise rows, colums, comdelay, adresses must be set before
vbogom 0:d4a4f76fffb5 72
vbogom 0:d4a4f76fffb5 73 wait(0.050f); // Wait 50ms to ensure powered up
vbogom 0:d4a4f76fffb5 74
vbogom 0:d4a4f76fffb5 75 // send "Display Settings" 3 times (Only top nibble of 0x30 as we've got 4-bit bus)
vbogom 0:d4a4f76fffb5 76 // this sets controler into 8 bit mode, so we have a defined state
vbogom 0:d4a4f76fffb5 77 for (int i=0; i<3; i++) {
vbogom 0:d4a4f76fffb5 78 _e = 1;
vbogom 0:d4a4f76fffb5 79 __nop();
vbogom 0:d4a4f76fffb5 80 __nop();
vbogom 0:d4a4f76fffb5 81 _d = 0x3;
vbogom 0:d4a4f76fffb5 82 __nop(); // data setup time at least 60 ns
vbogom 0:d4a4f76fffb5 83 _e = 0;
vbogom 0:d4a4f76fffb5 84 wait(0.005f); // 5ms
vbogom 0:d4a4f76fffb5 85 }
vbogom 0:d4a4f76fffb5 86 _e = 1;
vbogom 0:d4a4f76fffb5 87 __nop();
vbogom 0:d4a4f76fffb5 88 __nop();
vbogom 0:d4a4f76fffb5 89 _d = 0x2; // 4 Bit mode (after this command, we have to send 2 nibbles)
vbogom 0:d4a4f76fffb5 90 __nop();
vbogom 0:d4a4f76fffb5 91 _e = 0;
vbogom 0:d4a4f76fffb5 92 wait_us(LCDparam.delay);
vbogom 0:d4a4f76fffb5 93
vbogom 0:d4a4f76fffb5 94 writeCommand(0x28); // Function set 4 Bit, 2Line, 5*7
vbogom 0:d4a4f76fffb5 95 writeCommand(0x08); // Display off
vbogom 0:d4a4f76fffb5 96 cls(); // clear display, reset _column and _row
vbogom 0:d4a4f76fffb5 97 writeCommand(0x04); // cursor right, Display is not shifted
vbogom 0:d4a4f76fffb5 98 writeCommand(0x0C); // Display on , Cursor off
vbogom 0:d4a4f76fffb5 99 //---------------------------------------------------------------------------------------------------------
vbogom 0:d4a4f76fffb5 100 // Начало изменений
vbogom 0:d4a4f76fffb5 101 //---------------------------------------------------------------------------------------------------------
vbogom 0:d4a4f76fffb5 102 _setCursor=0x0; //Курсор выключен и не мигает
vbogom 0:d4a4f76fffb5 103 //---------------------------------------------------------------------------------------------------------
vbogom 0:d4a4f76fffb5 104 // Конец изменений
vbogom 0:d4a4f76fffb5 105 //---------------------------------------------------------------------------------------------------------
vbogom 0:d4a4f76fffb5 106 }
vbogom 0:d4a4f76fffb5 107
vbogom 0:d4a4f76fffb5 108 void TextLCD::character(int column, int row, int c) {
vbogom 0:d4a4f76fffb5 109 int a = 0x80 | (LCDparam.adresses[row & 3] + column);
vbogom 0:d4a4f76fffb5 110 writeCommand(a); // set cursor address
vbogom 0:d4a4f76fffb5 111 writeData(c); // write char
vbogom 0:d4a4f76fffb5 112 }
vbogom 0:d4a4f76fffb5 113
vbogom 0:d4a4f76fffb5 114 void TextLCD::cls() {
vbogom 0:d4a4f76fffb5 115 writeCommand(0x01); // cls, and set cursor to 0
vbogom 0:d4a4f76fffb5 116 locate(0, 0); // set internal position
vbogom 0:d4a4f76fffb5 117 wait_us(45 * LCDparam.delay); // CLS need much time
vbogom 0:d4a4f76fffb5 118 }
vbogom 0:d4a4f76fffb5 119
vbogom 0:d4a4f76fffb5 120 void TextLCD::locate(int column, int row) {
vbogom 0:d4a4f76fffb5 121 _column = column; // set position for next char
vbogom 0:d4a4f76fffb5 122 _row = row; // note: cursor is not set yet
vbogom 0:d4a4f76fffb5 123 }
vbogom 0:d4a4f76fffb5 124
vbogom 0:d4a4f76fffb5 125
vbogom 0:d4a4f76fffb5 126
vbogom 0:d4a4f76fffb5 127 int TextLCD::_putc(int value) {
vbogom 0:d4a4f76fffb5 128 if (value == '\n') {
vbogom 0:d4a4f76fffb5 129 _column = 0;
vbogom 0:d4a4f76fffb5 130 _row++;
vbogom 0:d4a4f76fffb5 131 if (_row >= LCDparam.rows) {
vbogom 0:d4a4f76fffb5 132 _row = 0;
vbogom 0:d4a4f76fffb5 133 }
vbogom 0:d4a4f76fffb5 134 } else {
vbogom 0:d4a4f76fffb5 135 character(_column, _row, value);
vbogom 0:d4a4f76fffb5 136 _column++;
vbogom 0:d4a4f76fffb5 137 if (_column >= LCDparam.columns) {
vbogom 0:d4a4f76fffb5 138 _column = 0;
vbogom 0:d4a4f76fffb5 139 _row++;
vbogom 0:d4a4f76fffb5 140 if (_row >= LCDparam.rows) {
vbogom 0:d4a4f76fffb5 141 _row = 0;
vbogom 0:d4a4f76fffb5 142 }
vbogom 0:d4a4f76fffb5 143 }
vbogom 0:d4a4f76fffb5 144 }
vbogom 0:d4a4f76fffb5 145 return value;
vbogom 0:d4a4f76fffb5 146 }
vbogom 0:d4a4f76fffb5 147
vbogom 0:d4a4f76fffb5 148 // Dummy function - read not supported
vbogom 0:d4a4f76fffb5 149 int TextLCD::_getc() {
vbogom 0:d4a4f76fffb5 150 return -1;
vbogom 0:d4a4f76fffb5 151 }
vbogom 0:d4a4f76fffb5 152
vbogom 0:d4a4f76fffb5 153 void TextLCD::writeByte(int value) {
vbogom 0:d4a4f76fffb5 154 _e = 1;
vbogom 0:d4a4f76fffb5 155 __nop();
vbogom 0:d4a4f76fffb5 156 _d = value >> 4; // higher nibble first
vbogom 0:d4a4f76fffb5 157 __nop();
vbogom 0:d4a4f76fffb5 158 _e = 0;
vbogom 0:d4a4f76fffb5 159 __nop();
vbogom 0:d4a4f76fffb5 160 __nop();
vbogom 0:d4a4f76fffb5 161 _e = 1;
vbogom 0:d4a4f76fffb5 162 __nop();
vbogom 0:d4a4f76fffb5 163 _d = value >> 0; // then lower
vbogom 0:d4a4f76fffb5 164 __nop();
vbogom 0:d4a4f76fffb5 165 _e = 0;
vbogom 0:d4a4f76fffb5 166 }
vbogom 0:d4a4f76fffb5 167
vbogom 0:d4a4f76fffb5 168 void TextLCD::writeCommand(int command) {
vbogom 0:d4a4f76fffb5 169 _rs = 0;
vbogom 0:d4a4f76fffb5 170 writeByte(command);
vbogom 0:d4a4f76fffb5 171 wait_us(LCDparam.delay);
vbogom 0:d4a4f76fffb5 172 }
vbogom 0:d4a4f76fffb5 173
vbogom 0:d4a4f76fffb5 174
vbogom 0:d4a4f76fffb5 175 void TextLCD::writeData(int data) {
vbogom 0:d4a4f76fffb5 176 _rs = 1;
vbogom 0:d4a4f76fffb5 177 writeByte(data);
vbogom 0:d4a4f76fffb5 178 wait_us(LCDparam.delay);
vbogom 0:d4a4f76fffb5 179 }
vbogom 0:d4a4f76fffb5 180
vbogom 0:d4a4f76fffb5 181
vbogom 0:d4a4f76fffb5 182 // set user defined char
vbogom 0:d4a4f76fffb5 183 void TextLCD::writeCGRAM(int address, int pattern[8]){
vbogom 0:d4a4f76fffb5 184 int i;
vbogom 0:d4a4f76fffb5 185 address = address & 7; //max 8 char
vbogom 0:d4a4f76fffb5 186 for(i=0;i<8;i++){
vbogom 0:d4a4f76fffb5 187 writeCommand(0x40 | (address * 8) + i);
vbogom 0:d4a4f76fffb5 188 writeData(pattern[i]);
vbogom 0:d4a4f76fffb5 189 }
vbogom 0:d4a4f76fffb5 190 }
vbogom 0:d4a4f76fffb5 191
vbogom 0:d4a4f76fffb5 192 void TextLCD::setLCDparam(LCDType _type){
vbogom 0:d4a4f76fffb5 193 switch (_type) {
vbogom 0:d4a4f76fffb5 194
vbogom 0:d4a4f76fffb5 195 case LCD16x2:
vbogom 0:d4a4f76fffb5 196 case LCD16x2B:
vbogom 0:d4a4f76fffb5 197 LCDparam.columns = 16;
vbogom 0:d4a4f76fffb5 198 break;
vbogom 0:d4a4f76fffb5 199 case LCD20x2:
vbogom 0:d4a4f76fffb5 200 case LCD20x4:
vbogom 0:d4a4f76fffb5 201 LCDparam.columns = 20;
vbogom 0:d4a4f76fffb5 202 break;
vbogom 0:d4a4f76fffb5 203 case LCD24x2:
vbogom 0:d4a4f76fffb5 204 LCDparam.columns = 24;
vbogom 0:d4a4f76fffb5 205 break;
vbogom 0:d4a4f76fffb5 206 }
vbogom 0:d4a4f76fffb5 207 if (_type == LCD20x4)
vbogom 0:d4a4f76fffb5 208 LCDparam.rows = 4;
vbogom 0:d4a4f76fffb5 209 else
vbogom 0:d4a4f76fffb5 210 LCDparam.rows = 2;
vbogom 0:d4a4f76fffb5 211
vbogom 0:d4a4f76fffb5 212 LCDparam.adresses[0] = 0;
vbogom 0:d4a4f76fffb5 213
vbogom 0:d4a4f76fffb5 214 if (_type == LCD16x2B)
vbogom 0:d4a4f76fffb5 215 LCDparam.adresses[1] = 40;
vbogom 0:d4a4f76fffb5 216 else
vbogom 0:d4a4f76fffb5 217 LCDparam.adresses[1] = 0x40;
vbogom 0:d4a4f76fffb5 218
vbogom 0:d4a4f76fffb5 219 if (_type == LCD20x4) {
vbogom 0:d4a4f76fffb5 220 LCDparam.adresses[2] = 0x14;
vbogom 0:d4a4f76fffb5 221 LCDparam.adresses[3] = 0x54;}
vbogom 0:d4a4f76fffb5 222 else {
vbogom 0:d4a4f76fffb5 223 LCDparam.adresses[2] = 0;
vbogom 0:d4a4f76fffb5 224 LCDparam.adresses[3] = 0;}
vbogom 0:d4a4f76fffb5 225
vbogom 0:d4a4f76fffb5 226 LCDparam.delay = 50; // 50 us delays as default
vbogom 0:d4a4f76fffb5 227 }
vbogom 0:d4a4f76fffb5 228
vbogom 0:d4a4f76fffb5 229
vbogom 0:d4a4f76fffb5 230 //---------------------------------------------------------------------------------------------------------
vbogom 0:d4a4f76fffb5 231 // Начало изменений
vbogom 0:d4a4f76fffb5 232 //---------------------------------------------------------------------------------------------------------
vbogom 0:d4a4f76fffb5 233
vbogom 0:d4a4f76fffb5 234 //---------------------------------------------------------------------------------------------------------
vbogom 0:d4a4f76fffb5 235 // Новые возможности!
vbogom 0:d4a4f76fffb5 236 //---------------------------------------------------------------------------------------------------------
vbogom 0:d4a4f76fffb5 237
vbogom 0:d4a4f76fffb5 238 int TextLCD::putc_rus(int c) {
vbogom 0:d4a4f76fffb5 239 return putc(ConvertChar(c));
vbogom 0:d4a4f76fffb5 240 }
vbogom 0:d4a4f76fffb5 241
vbogom 0:d4a4f76fffb5 242 void TextLCD::print_rus(const string rustext){
vbogom 0:d4a4f76fffb5 243 int len = rustext.length();
vbogom 0:d4a4f76fffb5 244 for (int i=0; i<len; i++) {
vbogom 0:d4a4f76fffb5 245 uint16_t temp=uint8_t(rustext[i]);
vbogom 0:d4a4f76fffb5 246 i++;
vbogom 0:d4a4f76fffb5 247 temp=temp<<8|uint8_t(rustext[i]);
vbogom 0:d4a4f76fffb5 248 putc(ConvertChar(temp));
vbogom 0:d4a4f76fffb5 249 };
vbogom 0:d4a4f76fffb5 250 }
vbogom 0:d4a4f76fffb5 251
vbogom 0:d4a4f76fffb5 252
vbogom 0:d4a4f76fffb5 253 void TextLCD::ShiftLCD_Left() {
vbogom 0:d4a4f76fffb5 254 writeCommand(0x18);
vbogom 0:d4a4f76fffb5 255 }
vbogom 0:d4a4f76fffb5 256
vbogom 0:d4a4f76fffb5 257 void TextLCD::ShiftLCD_Right() {
vbogom 0:d4a4f76fffb5 258 writeCommand(0x1C);
vbogom 0:d4a4f76fffb5 259 }
vbogom 0:d4a4f76fffb5 260
vbogom 0:d4a4f76fffb5 261 void TextLCD::ShiftCursor_Left() {
vbogom 0:d4a4f76fffb5 262 writeCommand(0x10);
vbogom 0:d4a4f76fffb5 263 }
vbogom 0:d4a4f76fffb5 264
vbogom 0:d4a4f76fffb5 265 void TextLCD::ShiftCursor_Right() {
vbogom 0:d4a4f76fffb5 266 writeCommand(0x14);
vbogom 0:d4a4f76fffb5 267 }
vbogom 0:d4a4f76fffb5 268
vbogom 0:d4a4f76fffb5 269
vbogom 0:d4a4f76fffb5 270 void TextLCD::home() {
vbogom 0:d4a4f76fffb5 271 writeCommand(0x2);
vbogom 0:d4a4f76fffb5 272 }
vbogom 0:d4a4f76fffb5 273
vbogom 0:d4a4f76fffb5 274 void TextLCD::on() {
vbogom 0:d4a4f76fffb5 275 writeCommand(0xC|_setCursor);
vbogom 0:d4a4f76fffb5 276 }
vbogom 0:d4a4f76fffb5 277
vbogom 0:d4a4f76fffb5 278 void TextLCD::off() {
vbogom 0:d4a4f76fffb5 279 writeCommand(0x8|_setCursor);
vbogom 0:d4a4f76fffb5 280 }
vbogom 0:d4a4f76fffb5 281
vbogom 0:d4a4f76fffb5 282
vbogom 0:d4a4f76fffb5 283 void TextLCD::SetCursor(int modeCursor) {
vbogom 0:d4a4f76fffb5 284 _setCursor=modeCursor;
vbogom 0:d4a4f76fffb5 285 writeCommand(0xC|_setCursor);
vbogom 0:d4a4f76fffb5 286 }
vbogom 0:d4a4f76fffb5 287
vbogom 0:d4a4f76fffb5 288 void TextLCD::CursorPosition(int column, int row) { //Устанавливаем позицию курсора
vbogom 0:d4a4f76fffb5 289 writeCommand(0x80 | (LCDparam.adresses[row & 3] + column));
vbogom 0:d4a4f76fffb5 290 }
vbogom 0:d4a4f76fffb5 291
vbogom 0:d4a4f76fffb5 292 //---------------------------------------------------------------------------------------------------------
vbogom 0:d4a4f76fffb5 293 // Конец изменений
vbogom 0:d4a4f76fffb5 294 //---------------------------------------------------------------------------------------------------------