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
Diff: freetronicsLCDShieldRus.cpp
- Revision:
- 6:9ef0091c2a4f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/freetronicsLCDShieldRus.cpp Thu Nov 27 12:00:09 2014 +0000 @@ -0,0 +1,182 @@ + +#include "mbed.h" +#include "freetronicsLCDShieldRus.h" + +#define PULSE_E wait(0.000001f); \ + _e = 0; \ + wait(0.000001f); \ + _e = 1; + + +freetronicsLCDShieldRus::freetronicsLCDShieldRus (PinName rs, PinName e, PinName d0, PinName d1, PinName d2, PinName d3, PinName bl, PinName a0) + : _rs(rs), _e(e), _d(d0, d1, d2, d3), _bl(bl), _a0(a0) +{ + // Class constructor + // Init the display, wait 15ms to insure the power is up + _e = true; + _rs = false; + wait(0.015f); + + for (int i = 0; i < 3; i++) { + writeByte(0x3); + wait(0.00164f); // this command takes 1.64ms, so wait for it + } + + writeByte(0x2); // 4-bit mode + writeCommand(0x28); // Function set 001 BW N F - - + writeCommand(0x0C); // Display on/off controll 0000 1 D C B (D(isplay) On/Off C(ursor) On/Off B(link) On/Off + writeCommand(0x6); // Cursor Direction and Display Shift : 0000 01 CD S (CD 0-left, 1-right S(hift) 0-no, 1-yes + cls(); + + // Set the PWM period to 20ms + _bl.period_ms(1); + _bl.write(0.0); +} + +void freetronicsLCDShieldRus::setCursorPosition (int line, int col) +{ + // Set the new cursorposition + writeCommand(0x80 + (line * 0x40) + col); +} + +void freetronicsLCDShieldRus::setBackLight (bool blStatus) +{ + // Switch the backlight on (true) or off (false) + _bl = (blStatus) ? 1.0 : 0.0; +} + +void freetronicsLCDShieldRus::setBackLight (float blIntensity) +{ + // Switch the backlight on (true) or off (false) + _bl = blIntensity; +} + +void freetronicsLCDShieldRus::setCursor (bool cStatus, bool blink) +{ + int tmp = 0; + + if (blink) tmp = 0x01; + if (cStatus) tmp |= 0x02; + writeCommand(0x0C + tmp); +} + +void freetronicsLCDShieldRus::shift(bool direction) +{ + if(direction == LEFT) shiftLeft(); + else shiftRight(); +} + +void freetronicsLCDShieldRus::shiftLeft(void) +{ + writeCommand(0x18 + 0x04); +} + +void freetronicsLCDShieldRus::shiftRight(void) +{ + writeCommand(0x18); +} + +void freetronicsLCDShieldRus::cls(void) +{ + // Clear the display and place the cursor at 0, 0 + writeCommand(0x01); + wait(0.00164f); +} + +void freetronicsLCDShieldRus::home(void) +{ + // Undo shift operations and place cursor at 0,0 + writeCommand(0x02); + wait(0.00164f); +} + +void freetronicsLCDShieldRus::writeCGRAM (char address, const char *ptr, char nbytes) +{ + // Write the address only once, it is autoincremented + writeCommand(0x40 | address); + + // Write the data + for(int i = 0; i < nbytes; i++) { + writeData(*ptr++); + } +} + +// Low level output functions +void freetronicsLCDShieldRus::writeByte (int byte) +{ + // Split the byte in high and low nibble, write high nibble first + _d = byte >> 4; + PULSE_E; + _d = byte >> 0; + PULSE_E; + // Most instructions take 40us + wait(0.000040f); +} + +void freetronicsLCDShieldRus::writeData (int data) +{ + _rs = true; + writeByte(data); +} + +void freetronicsLCDShieldRus::writeCommand (int command) +{ + _rs = false; + writeByte(command); +} + +unsigned char ROM1602Cyr_table[]= +{ + 0x41,0xa0,0x42,0xa1,0xe0,0x45,0xa3,0xa4, + 0xa5,0xa6,0x4b,0xa7,0x4d,0x48,0x4f,0xa8, + 0x50,0x43,0x54,0xa9,0xaa,0x58,0xe1,0xab, + 0xac,0xe2,0xad,0xae,0x62,0xaf,0xb0,0xb1, + 0x61,0xb2,0xb3,0xb4,0xe3,0x65,0xb6,0xb7, + 0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0x6f,0xbe, + 0x70,0x63,0xbf,0x79,0xe4,0x78,0xe5,0xc0, + 0xc1,0xe6,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7, +}; + +int freetronicsLCDShieldRus::puts(const char *str){ + int shift=0; + int outchar=0; + bool grad_sign = false; + while( *str ) { + if (*str>0x80){ // UTF-8 handler; + if (*str==0xd0)shift=0x90; + if (*str==0xd1)shift=0x50; + if (*str==0xc2)grad_sign = true; + else grad_sign = false; + *str++; + outchar=ROM1602Cyr_table[*str-shift]; + if (*str==0x91&shift==0x50)outchar=0xb5; //ё + if (*str==0x81&shift==0x90)outchar=0xa2; //Ё + if (*str==0xb0&grad_sign==true)outchar=0xef; //° Alt+0176 + putc(outchar); + //putc(0xef); + *str++; + } + else putc( *str++ ); + } +} + + + + // <instanceName>.writeCGRAM (0x00, &CGRAM_DATA[0], 8); + +float freetronicsLCDShieldRus::readButton(void) +{ + return(_a0.read()); +} + +// Virtual functions for stream +int freetronicsLCDShieldRus::_putc(int value) +{ + writeData(value); + return value; +} + +int freetronicsLCDShieldRus::_getc() +{ + return -1; +} \ No newline at end of file