diff --git a/VFD.cc b/VFD.cc index 0d0ab29..06d990c 100644 --- a/VFD.cc +++ b/VFD.cc @@ -49,6 +49,9 @@ bool VFD::connect(const std::string & parport) } else { + usleep(INIT_DELAY); + sendNibble(0, 0x2); /* set 4-bit mode */ + sendByte(1, 0); /* set brightness */ return true; } @@ -97,3 +100,55 @@ void VFD::sendByte(unsigned char rs, unsigned char dat) sendNibble(rs, (dat >> 4) & 0xF); sendNibble(rs, dat & 0xF); } + +void VFD::displayClear() +{ + sendByte(0, 0x1); + usleep(INIT_DELAY); +} + +void VFD::cursorHome() +{ + sendByte(0, 0x2); +} + +void VFD::entryModeSet(unsigned char address_direction, /* LEFT|RIGHT */ + unsigned char display_shift) /* ON|OFF */ +{ + sendByte(0, 0x4 + | ((address_direction & 0x1) << 1) + | (display_shift & 0x1) ); +} + +void VFD::setDisplay(unsigned char display, /* ON|OFF */ + unsigned char cursor, /* ON|OFF */ + unsigned char cursor_blink) /* ON|OFF */ +{ + sendByte(0, 0x8 + | ((display & 0x1) << 2) + | ((cursor & 0x1) << 1) + | (cursor_blink & 0x1) ); +} + +void VFD::shift(unsigned char shift_display, /* ON|OFF */ + unsigned char direction) /* LEFT|RIGHT */ +{ + sendByte(0, 0x10 + | ((shift_display & 0x1) << 3) + | ((direction & 0x1) << 2) ); +} + +void VFD::setCGAddress(unsigned char address) +{ + sendByte(0, 0x40 | (address & 0x3F)); +} + +void VFD::setAddress(unsigned char address) +{ + sendByte(0, 0x80 | (address & 0x7F)); +} + +void VFD::writeData(unsigned char data) +{ + sendByte(1, data); +} diff --git a/VFD.h b/VFD.h index 8d15bf4..2851f5c 100644 --- a/VFD.h +++ b/VFD.h @@ -32,10 +32,30 @@ class VFD { public: + static const unsigned char SHIFT_CURSOR = 0; + static const unsigned char SHIFT_DISPLAY = 1; + static const unsigned char LEFT = 0; + static const unsigned char RIGHT = 1; + static const unsigned char OFF = 0; + static const unsigned char ON = 1; + VFD(); bool connect(const std::string & parport = "/dev/parport0"); void disconnect(); + void displayClear(); + void cursorHome(); + void entryModeSet(unsigned char address_direction, /* LEFT|RIGHT */ + unsigned char display_shift); /* ON|OFF */ + void setDisplay(unsigned char display, /* ON|OFF */ + unsigned char cursor, /* ON|OFF */ + unsigned char cursor_blink); /* ON|OFF */ + void shift(unsigned char shift_display, /* ON|OFF */ + unsigned char direction); /* LEFT|RIGHT */ + void setCGAddress(unsigned char address); + void setAddress(unsigned char address); + void writeData(unsigned char data); + protected: static const unsigned char RW_WRITE = 0; static const unsigned char RW_READ = 1; @@ -47,6 +67,7 @@ class VFD static const unsigned char PP_OFFSET_RW = 1; static const unsigned char PP_OFFSET_E = 2; static const unsigned char PP_OFFSET_DATA = 3; + static const int INIT_DELAY = 2400; void sendByte(unsigned char rs, unsigned char dat); void sendNibble(unsigned char rs, unsigned char dat);