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 Components

Committer:
margadon
Date:
Thu Nov 27 12:28:25 2014 +0000
Revision:
7:08abb319acab
Parent:
6:9ef0091c2a4f
Final

Who changed what in which revision?

UserRevisionLine numberNew 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 }