Fork of Freetronics_16x2_LCD class for HD4478 based LCDs with Cyrillic symbols like WH1602 etc. Use puts() for latin and cyrillic texts, symbols. ( ° included)
Fork of Freetronics_16x2_LCD by
freetronicsLCDShieldRus.cpp@7:08abb319acab, 2014-11-27 (annotated)
- Committer:
- margadon
- Date:
- Thu Nov 27 12:28:25 2014 +0000
- Revision:
- 7:08abb319acab
- Parent:
- 6:9ef0091c2a4f
Final
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
margadon | 6:9ef0091c2a4f | 1 | |
margadon | 6:9ef0091c2a4f | 2 | #include "mbed.h" |
margadon | 6:9ef0091c2a4f | 3 | #include "freetronicsLCDShieldRus.h" |
margadon | 6:9ef0091c2a4f | 4 | |
margadon | 6:9ef0091c2a4f | 5 | #define PULSE_E wait(0.000001f); \ |
margadon | 6:9ef0091c2a4f | 6 | _e = 0; \ |
margadon | 6:9ef0091c2a4f | 7 | wait(0.000001f); \ |
margadon | 6:9ef0091c2a4f | 8 | _e = 1; |
margadon | 6:9ef0091c2a4f | 9 | |
margadon | 6:9ef0091c2a4f | 10 | |
margadon | 6:9ef0091c2a4f | 11 | freetronicsLCDShieldRus::freetronicsLCDShieldRus (PinName rs, PinName e, PinName d0, PinName d1, PinName d2, PinName d3, PinName bl, PinName a0) |
margadon | 6:9ef0091c2a4f | 12 | : _rs(rs), _e(e), _d(d0, d1, d2, d3), _bl(bl), _a0(a0) |
margadon | 6:9ef0091c2a4f | 13 | { |
margadon | 6:9ef0091c2a4f | 14 | // Class constructor |
margadon | 6:9ef0091c2a4f | 15 | // Init the display, wait 15ms to insure the power is up |
margadon | 6:9ef0091c2a4f | 16 | _e = true; |
margadon | 6:9ef0091c2a4f | 17 | _rs = false; |
margadon | 6:9ef0091c2a4f | 18 | wait(0.015f); |
margadon | 6:9ef0091c2a4f | 19 | |
margadon | 6:9ef0091c2a4f | 20 | for (int i = 0; i < 3; i++) { |
margadon | 6:9ef0091c2a4f | 21 | writeByte(0x3); |
margadon | 6:9ef0091c2a4f | 22 | wait(0.00164f); // this command takes 1.64ms, so wait for it |
margadon | 6:9ef0091c2a4f | 23 | } |
margadon | 6:9ef0091c2a4f | 24 | |
margadon | 6:9ef0091c2a4f | 25 | writeByte(0x2); // 4-bit mode |
margadon | 6:9ef0091c2a4f | 26 | writeCommand(0x28); // Function set 001 BW N F - - |
margadon | 6:9ef0091c2a4f | 27 | writeCommand(0x0C); // Display on/off controll 0000 1 D C B (D(isplay) On/Off C(ursor) On/Off B(link) On/Off |
margadon | 6:9ef0091c2a4f | 28 | writeCommand(0x6); // Cursor Direction and Display Shift : 0000 01 CD S (CD 0-left, 1-right S(hift) 0-no, 1-yes |
margadon | 6:9ef0091c2a4f | 29 | cls(); |
margadon | 6:9ef0091c2a4f | 30 | |
margadon | 6:9ef0091c2a4f | 31 | // Set the PWM period to 20ms |
margadon | 6:9ef0091c2a4f | 32 | _bl.period_ms(1); |
margadon | 6:9ef0091c2a4f | 33 | _bl.write(0.0); |
margadon | 6:9ef0091c2a4f | 34 | } |
margadon | 6:9ef0091c2a4f | 35 | |
margadon | 6:9ef0091c2a4f | 36 | void freetronicsLCDShieldRus::setCursorPosition (int line, int col) |
margadon | 6:9ef0091c2a4f | 37 | { |
margadon | 6:9ef0091c2a4f | 38 | // Set the new cursorposition |
margadon | 6:9ef0091c2a4f | 39 | writeCommand(0x80 + (line * 0x40) + col); |
margadon | 6:9ef0091c2a4f | 40 | } |
margadon | 6:9ef0091c2a4f | 41 | |
margadon | 6:9ef0091c2a4f | 42 | void freetronicsLCDShieldRus::setBackLight (bool blStatus) |
margadon | 6:9ef0091c2a4f | 43 | { |
margadon | 6:9ef0091c2a4f | 44 | // Switch the backlight on (true) or off (false) |
margadon | 6:9ef0091c2a4f | 45 | _bl = (blStatus) ? 1.0 : 0.0; |
margadon | 6:9ef0091c2a4f | 46 | } |
margadon | 6:9ef0091c2a4f | 47 | |
margadon | 6:9ef0091c2a4f | 48 | void freetronicsLCDShieldRus::setBackLight (float blIntensity) |
margadon | 6:9ef0091c2a4f | 49 | { |
margadon | 6:9ef0091c2a4f | 50 | // Switch the backlight on (true) or off (false) |
margadon | 6:9ef0091c2a4f | 51 | _bl = blIntensity; |
margadon | 6:9ef0091c2a4f | 52 | } |
margadon | 6:9ef0091c2a4f | 53 | |
margadon | 6:9ef0091c2a4f | 54 | void freetronicsLCDShieldRus::setCursor (bool cStatus, bool blink) |
margadon | 6:9ef0091c2a4f | 55 | { |
margadon | 6:9ef0091c2a4f | 56 | int tmp = 0; |
margadon | 6:9ef0091c2a4f | 57 | |
margadon | 6:9ef0091c2a4f | 58 | if (blink) tmp = 0x01; |
margadon | 6:9ef0091c2a4f | 59 | if (cStatus) tmp |= 0x02; |
margadon | 6:9ef0091c2a4f | 60 | writeCommand(0x0C + tmp); |
margadon | 6:9ef0091c2a4f | 61 | } |
margadon | 6:9ef0091c2a4f | 62 | |
margadon | 6:9ef0091c2a4f | 63 | void freetronicsLCDShieldRus::shift(bool direction) |
margadon | 6:9ef0091c2a4f | 64 | { |
margadon | 6:9ef0091c2a4f | 65 | if(direction == LEFT) shiftLeft(); |
margadon | 6:9ef0091c2a4f | 66 | else shiftRight(); |
margadon | 6:9ef0091c2a4f | 67 | } |
margadon | 6:9ef0091c2a4f | 68 | |
margadon | 6:9ef0091c2a4f | 69 | void freetronicsLCDShieldRus::shiftLeft(void) |
margadon | 6:9ef0091c2a4f | 70 | { |
margadon | 6:9ef0091c2a4f | 71 | writeCommand(0x18 + 0x04); |
margadon | 6:9ef0091c2a4f | 72 | } |
margadon | 6:9ef0091c2a4f | 73 | |
margadon | 6:9ef0091c2a4f | 74 | void freetronicsLCDShieldRus::shiftRight(void) |
margadon | 6:9ef0091c2a4f | 75 | { |
margadon | 6:9ef0091c2a4f | 76 | writeCommand(0x18); |
margadon | 6:9ef0091c2a4f | 77 | } |
margadon | 6:9ef0091c2a4f | 78 | |
margadon | 6:9ef0091c2a4f | 79 | void freetronicsLCDShieldRus::cls(void) |
margadon | 6:9ef0091c2a4f | 80 | { |
margadon | 6:9ef0091c2a4f | 81 | // Clear the display and place the cursor at 0, 0 |
margadon | 6:9ef0091c2a4f | 82 | writeCommand(0x01); |
margadon | 6:9ef0091c2a4f | 83 | wait(0.00164f); |
margadon | 6:9ef0091c2a4f | 84 | } |
margadon | 6:9ef0091c2a4f | 85 | |
margadon | 6:9ef0091c2a4f | 86 | void freetronicsLCDShieldRus::home(void) |
margadon | 6:9ef0091c2a4f | 87 | { |
margadon | 6:9ef0091c2a4f | 88 | // Undo shift operations and place cursor at 0,0 |
margadon | 6:9ef0091c2a4f | 89 | writeCommand(0x02); |
margadon | 6:9ef0091c2a4f | 90 | wait(0.00164f); |
margadon | 6:9ef0091c2a4f | 91 | } |
margadon | 6:9ef0091c2a4f | 92 | |
margadon | 6:9ef0091c2a4f | 93 | void freetronicsLCDShieldRus::writeCGRAM (char address, const char *ptr, char nbytes) |
margadon | 6:9ef0091c2a4f | 94 | { |
margadon | 6:9ef0091c2a4f | 95 | // Write the address only once, it is autoincremented |
margadon | 6:9ef0091c2a4f | 96 | writeCommand(0x40 | address); |
margadon | 6:9ef0091c2a4f | 97 | |
margadon | 6:9ef0091c2a4f | 98 | // Write the data |
margadon | 6:9ef0091c2a4f | 99 | for(int i = 0; i < nbytes; i++) { |
margadon | 6:9ef0091c2a4f | 100 | writeData(*ptr++); |
margadon | 6:9ef0091c2a4f | 101 | } |
margadon | 6:9ef0091c2a4f | 102 | } |
margadon | 6:9ef0091c2a4f | 103 | |
margadon | 6:9ef0091c2a4f | 104 | // Low level output functions |
margadon | 6:9ef0091c2a4f | 105 | void freetronicsLCDShieldRus::writeByte (int byte) |
margadon | 6:9ef0091c2a4f | 106 | { |
margadon | 6:9ef0091c2a4f | 107 | // Split the byte in high and low nibble, write high nibble first |
margadon | 6:9ef0091c2a4f | 108 | _d = byte >> 4; |
margadon | 6:9ef0091c2a4f | 109 | PULSE_E; |
margadon | 6:9ef0091c2a4f | 110 | _d = byte >> 0; |
margadon | 6:9ef0091c2a4f | 111 | PULSE_E; |
margadon | 6:9ef0091c2a4f | 112 | // Most instructions take 40us |
margadon | 6:9ef0091c2a4f | 113 | wait(0.000040f); |
margadon | 6:9ef0091c2a4f | 114 | } |
margadon | 6:9ef0091c2a4f | 115 | |
margadon | 6:9ef0091c2a4f | 116 | void freetronicsLCDShieldRus::writeData (int data) |
margadon | 6:9ef0091c2a4f | 117 | { |
margadon | 6:9ef0091c2a4f | 118 | _rs = true; |
margadon | 6:9ef0091c2a4f | 119 | writeByte(data); |
margadon | 6:9ef0091c2a4f | 120 | } |
margadon | 6:9ef0091c2a4f | 121 | |
margadon | 6:9ef0091c2a4f | 122 | void freetronicsLCDShieldRus::writeCommand (int command) |
margadon | 6:9ef0091c2a4f | 123 | { |
margadon | 6:9ef0091c2a4f | 124 | _rs = false; |
margadon | 6:9ef0091c2a4f | 125 | writeByte(command); |
margadon | 6:9ef0091c2a4f | 126 | } |
margadon | 6:9ef0091c2a4f | 127 | |
margadon | 6:9ef0091c2a4f | 128 | unsigned char ROM1602Cyr_table[]= |
margadon | 6:9ef0091c2a4f | 129 | { |
margadon | 6:9ef0091c2a4f | 130 | 0x41,0xa0,0x42,0xa1,0xe0,0x45,0xa3,0xa4, |
margadon | 6:9ef0091c2a4f | 131 | 0xa5,0xa6,0x4b,0xa7,0x4d,0x48,0x4f,0xa8, |
margadon | 6:9ef0091c2a4f | 132 | 0x50,0x43,0x54,0xa9,0xaa,0x58,0xe1,0xab, |
margadon | 6:9ef0091c2a4f | 133 | 0xac,0xe2,0xad,0xae,0x62,0xaf,0xb0,0xb1, |
margadon | 6:9ef0091c2a4f | 134 | 0x61,0xb2,0xb3,0xb4,0xe3,0x65,0xb6,0xb7, |
margadon | 6:9ef0091c2a4f | 135 | 0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0x6f,0xbe, |
margadon | 6:9ef0091c2a4f | 136 | 0x70,0x63,0xbf,0x79,0xe4,0x78,0xe5,0xc0, |
margadon | 6:9ef0091c2a4f | 137 | 0xc1,0xe6,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7, |
margadon | 6:9ef0091c2a4f | 138 | }; |
margadon | 6:9ef0091c2a4f | 139 | |
margadon | 6:9ef0091c2a4f | 140 | int freetronicsLCDShieldRus::puts(const char *str){ |
margadon | 6:9ef0091c2a4f | 141 | int shift=0; |
margadon | 6:9ef0091c2a4f | 142 | int outchar=0; |
margadon | 6:9ef0091c2a4f | 143 | bool grad_sign = false; |
margadon | 6:9ef0091c2a4f | 144 | while( *str ) { |
margadon | 6:9ef0091c2a4f | 145 | if (*str>0x80){ // UTF-8 handler; |
margadon | 6:9ef0091c2a4f | 146 | if (*str==0xd0)shift=0x90; |
margadon | 6:9ef0091c2a4f | 147 | if (*str==0xd1)shift=0x50; |
margadon | 6:9ef0091c2a4f | 148 | if (*str==0xc2)grad_sign = true; |
margadon | 6:9ef0091c2a4f | 149 | else grad_sign = false; |
margadon | 6:9ef0091c2a4f | 150 | *str++; |
margadon | 6:9ef0091c2a4f | 151 | outchar=ROM1602Cyr_table[*str-shift]; |
margadon | 6:9ef0091c2a4f | 152 | if (*str==0x91&shift==0x50)outchar=0xb5; //ё |
margadon | 6:9ef0091c2a4f | 153 | if (*str==0x81&shift==0x90)outchar=0xa2; //Ё |
margadon | 6:9ef0091c2a4f | 154 | if (*str==0xb0&grad_sign==true)outchar=0xef; //° Alt+0176 |
margadon | 6:9ef0091c2a4f | 155 | putc(outchar); |
margadon | 6:9ef0091c2a4f | 156 | //putc(0xef); |
margadon | 6:9ef0091c2a4f | 157 | *str++; |
margadon | 6:9ef0091c2a4f | 158 | } |
margadon | 6:9ef0091c2a4f | 159 | else putc( *str++ ); |
margadon | 6:9ef0091c2a4f | 160 | } |
margadon | 6:9ef0091c2a4f | 161 | } |
margadon | 6:9ef0091c2a4f | 162 | |
margadon | 6:9ef0091c2a4f | 163 | |
margadon | 6:9ef0091c2a4f | 164 | |
margadon | 6:9ef0091c2a4f | 165 | // <instanceName>.writeCGRAM (0x00, &CGRAM_DATA[0], 8); |
margadon | 6:9ef0091c2a4f | 166 | |
margadon | 6:9ef0091c2a4f | 167 | float freetronicsLCDShieldRus::readButton(void) |
margadon | 6:9ef0091c2a4f | 168 | { |
margadon | 6:9ef0091c2a4f | 169 | return(_a0.read()); |
margadon | 6:9ef0091c2a4f | 170 | } |
margadon | 6:9ef0091c2a4f | 171 | |
margadon | 6:9ef0091c2a4f | 172 | // Virtual functions for stream |
margadon | 6:9ef0091c2a4f | 173 | int freetronicsLCDShieldRus::_putc(int value) |
margadon | 6:9ef0091c2a4f | 174 | { |
margadon | 6:9ef0091c2a4f | 175 | writeData(value); |
margadon | 6:9ef0091c2a4f | 176 | return value; |
margadon | 6:9ef0091c2a4f | 177 | } |
margadon | 6:9ef0091c2a4f | 178 | |
margadon | 6:9ef0091c2a4f | 179 | int freetronicsLCDShieldRus::_getc() |
margadon | 6:9ef0091c2a4f | 180 | { |
margadon | 6:9ef0091c2a4f | 181 | return -1; |
margadon | 6:9ef0091c2a4f | 182 | } |