HDSP253X Smart Alphanumeric LED matrix display

Dependents:   mbed_bus

Files at this revision

API Documentation at this revision

Comitter:
wim
Date:
Sun Jan 25 17:23:44 2015 +0000
Commit message:
HDSP253X Smart Alphanumeric LED matrix display. First release as Lib.

Changed in this revision

HDSP253X.cpp Show annotated file Show diff for this revision Revisions of this file
HDSP253X.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r b3430a613781 HDSP253X.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HDSP253X.cpp	Sun Jan 25 17:23:44 2015 +0000
@@ -0,0 +1,627 @@
+/* HDSP253X_Display - Intelligent 8 digit 5x7 LED matrix display
+ *
+ * Copyright (c) 2011 Wim Huiskamp
+ * Modified software based on sourcecode by RAC 06/08/2008
+ *
+ * Released under the MIT License: http://mbed.org/license/mit
+ *
+ * version 0.2 Initial Release
+*/
+#include "mbed.h"
+//#include "Utils.h"
+#include "PCF8574_DataBus.h"
+#include "PCF8574_AddressBus.h"
+#include "PCF8574_EnableBus.h"
+#include "MBED_ControlBus.h"
+#include "HDSP253X.h"
+
+/** Create an HDSP253X_Display object connected to the proper busses
+ *
+ * @param  PCF8574_DataBus data databus to connect to 
+ * @param  PCF8574_AddressBus address addressbus to connect to 
+ * @param  PCF8574_EnableBus enable enablebus to connect to 
+ * @param  MBED_ControlBus control controlbus to connect to 
+*/
+HDSP253X_Display::HDSP253X_Display (PCF8574_DataBus &databus, PCF8574_AddressBus &addressbus, PCF8574_EnableBus &enablebus, MBED_ControlBus &controlbus) : 
+                                     _databus(databus), _addressbus(addressbus), _enablebus(enablebus), _controlbus(controlbus) {
+
+   _init();
+}    
+
+/** Init HDSP253X_Display
+ * @param
+ * @returns 
+ */
+void HDSP253X_Display::_init(void)
+{
+    // Apply reset
+    reset();  // Note that this also resets the LED status display. 
+ 
+    // Note: Brightness is 100% after reset
+    set_brightness(HDSP253X_DEF_DISPLAY_BRIGHT);
+ 
+    // Reset cursor 
+    locate(0);
+}
+
+
+/*****************************************************************************/
+/*******************  LOW LEVEL HDSP253X SUPPORT FUNCTIONS  ******************/
+/*****************************************************************************/
+
+/*---------------------------------------------------------------------------*\
+ |
+ |  Function:       HDSP253X_reset
+ |
+ |  Description:    Reset routine for HDSP253X display, applying reset, 
+ |                  removing reset, then waiting for preset delay.
+ |                  With the internal clock, the delay should be around 1
+ |                  millisecond, but slower clocks will require longer delays.
+ |                  After reset the Char RAM and Flash RAM is cleared, the CTRL word is
+ |                  cleared (Blink Off, Flash Off, Brightness 100%). UDC RAM and address
+ |                  are unaffected.
+ |
+ |  Parameters:     None
+ |
+ |  Returns:        Nothing.
+ |
+\*---------------------------------------------------------------------------*/
+void HDSP253X_Display::reset(void)
+{
+//NOTE: On LF28A the Reset* pin is connected to the display and to the latches.
+//      That implies they are all reset when the Reset* pin is used !
+// 
+// Alternative for the Display may be SW reset instruction
+
+    // Apply the reset condition and then remove after short delay
+    _enablebus.chipselect(CS_DISP, HIGH);  
+    wait_ms(HDSP253X_1TCY_WAIT_MS);
+    
+    _enablebus.reset(LOW);   
+    wait_ms(HDSP253X_1TCY_WAIT_MS);    
+    wait_ms(HDSP253X_1TCY_WAIT_MS);        
+    _enablebus.reset(HIGH);             
+    
+    // Wait for the preset delay to allow operation to complete
+    wait_ms(HDSP253X_RST_CLR_DELAY_MS);
+    
+    // Reset cursor 
+    locate(0);
+}
+
+
+/*---------------------------------------------------------------------------*\
+ |
+ |  Function:       HDSP253X_write
+ |
+ |  Description:    Low level data write routine for HDSP253X. Takes in data
+ |                  and address (including Flash as top bit) and writes
+ |                  it to the display. For simplicity, entire address byte
+ |                  is written, even though top two bits are unused inputs.
+ |                  After performing the operation, address lines are set
+ |                  all high, in order to eliminate current drain through
+ |                  pullup resistors (0.5mA per pin with 10K pullups)
+ |
+ |  Parameters:     address - full address in bits 0-5 (bit 5 is flash)
+ |                  data - data byte to write out
+ |
+ |  Returns:        Nothing.
+ |
+\*---------------------------------------------------------------------------*/
+
+void HDSP253X_Display::_write(uint8_t address, uint8_t data)
+{
+//    // Switch databus buffer to outputs
+//    _controlbus.busdir(WRITE);        
+//    // Switch databus to outputs
+//    _databus.busdir(WRITE);   
+
+    
+    // Write out the address on to the addressbus and wait
+    _addressbus.write(address);
+//    wait_ms(HDSP253X_1TCY_WAIT_MS);
+
+    // Set CE low and wait
+    _enablebus.chipselect(CS_DISP, LOW);  
+//    wait_ms(HDSP253X_1TCY_WAIT_MS);
+
+    // Write data to the databus
+    _databus.write(data);        
+//    wait_ms(HDSP253X_1TCY_WAIT_MS);
+     
+    // Set WR low, wait, then set high and wait
+    _controlbus.WR(LOW);
+//    wait_ms(HDSP253X_1TCY_WAIT_MS);
+    _controlbus.WR(HIGH);
+//    wait_ms(HDSP253X_1TCY_WAIT_MS);
+
+    // Set CE high and wait
+    _enablebus.chipselect(CS_DISP, HIGH);  
+//    wait_ms(HDSP253X_1TCY_WAIT_MS);
+    
+//    // Switch databus back to inputs
+//    _databus.busdir(READ);        
+//    // Switch databus buffer back to inputs
+//    _controlbus.busdir(READ);  
+
+//    // Set address lines all high to minimise power through pullups
+//    _addressbus.write(HDSP253X_ADDR_LOW_POWER);
+}
+
+/*---------------------------------------------------------------------------*\
+ |
+ |  Function:       HDSP253X_read
+ |
+ |  Description:    Low level data read routine for HDSP253X. Takes in 
+ |                  address (including Flash as top bit) and reads data
+ |                  from the display. For simplicity, entire address byte
+ |                  is written, even though top two bits are unused inputs.
+ |                  After performing the operation, address lines are set
+ |                  all high, in order to eliminate current drain through
+ |                  pullup resistors (0.5mA per pin with 10K pullups)
+ |
+ |  Parameters:     address - full address in bits 0-5 (bit 5 is flash)
+ |
+ |  Returns:        data - data byte read in (Note that D7 is masked out)
+ |
+\*---------------------------------------------------------------------------*/
+
+uint8_t HDSP253X_Display::_read(uint8_t address)
+{
+    uint8_t data = 0;
+
+    // Switch databus to inputs
+    _databus.busdir(READ);        
+    // Switch databus buffer to inputs
+    _controlbus.busdir(READ);      
+       
+    // Write out the address on to the addressbus and wait
+    _addressbus.write(address);
+//    wait_ms(HDSP253X_1TCY_WAIT_MS);
+
+    // Set CE low and wait
+    _enablebus.chipselect(CS_DISP, LOW);
+//    wait_ms(HDSP253X_1TCY_WAIT_MS);
+
+    // Set RD low and wait
+    _controlbus.RD(LOW);
+//    wait_ms(HDSP253X_1TCY_WAIT_MS);
+    
+    // Read the data byte from databus
+    // Mask out the not-readable D7 bit, this mask is needed for my specific targetboard !
+    // Reading the unconnected D7 bit results in 'H' level. A RMW cycle on the Ctrl register
+    // would then always result in a Clearscreen !
+    data = _databus.read() & HDSP253X_CTRL_MASK;
+
+    // set RD high and wait
+    _controlbus.RD(HIGH);
+//    wait_ms(HDSP253X_1TCY_WAIT_MS);
+
+    // Set CE high and wait
+    _enablebus.chipselect(CS_DISP, HIGH);
+//    wait_ms(HDSP253X_1TCY_WAIT_MS);
+
+//    // Set address lines all high to minimise power through pullups
+//    _addressbus.write(HDSP253X_ADDR_LOW_POWER);
+
+    // Switch databus buffer back to outputs
+    _controlbus.busdir(WRITE);        
+    // Switch databus to outputs
+    _databus.busdir(WRITE);   
+    
+    // Return read data to caller
+    return data;
+}
+
+
+/*****************************************************************************/
+/**************  HIGH LEVEL HDSP253X CHARACTER DISPLAY FUNCTIONS  ************/
+/*****************************************************************************/
+
+
+/*---------------------------------------------------------------------------*\
+ |
+ |  Function:       HDSP253X_putudc
+ |
+ |  Description:    Displays specified UDC character on the display at current
+ |                  position. Used defined characters use codes from 128-142.
+ |                  Note that the normal putc write routines can also be used
+ |                  to show UDCs, using ASCII values 128 to 143 inclusive.
+ |
+ |  Parameters:     udc_char_num - UDC character, 16 possible UDC values from 0-15
+ |
+ |  Returns:        Nothing
+ |
+\*---------------------------------------------------------------------------*/
+
+void HDSP253X_Display::putudc (char udc_char_num)
+{
+  putc(HDSP253X_ASCII_UDC_CHARS + udc_char_num);
+}
+
+/*---------------------------------------------------------------------------*\
+ |
+ |  Function:       HDSP253X_printf
+ |
+ |  Description:    Displays specified string on the display at current
+ |                  cursor position. Increments cursor.
+ |
+ |  Parameters:     format - format string
+ |                  args   - data
+ |
+ |  Returns:        Nothing
+ |
+\*---------------------------------------------------------------------------*/
+
+void HDSP253X_Display::printf (char * format, ...) {
+   char display_string[64];
+//   int rv;   
+   int string_len, i;   
+   va_list args;
+   va_start (args, format);
+
+//   rv=vsprintf (display_string, format, args);
+   vsprintf (display_string, format, args);   
+   va_end (args);   
+// printf("printing:'%s'\n", display_string);
+//   writeString (buffer);
+
+   // loop round, writing characters
+   string_len = strlen(display_string);   // obtain length of string
+   for (i = 0; i < string_len; i++) {
+     putc(display_string[i]);
+   };
+
+   // return rv;
+}
+
+
+
+/*---------------------------------------------------------------------------*\
+ |
+ |  Function:       HDSP253X_putc
+ |
+ |  Description:    Displays specified character on the display at current
+ |                  cursor position. Increments cursor.
+ |                  Position on the display (0 to 7, Leftmost = 0)
+ |
+ |  Parameters:     disp_char - single character to display
+ |                    - ASCII characters, 128 values between 0-127
+ |                    - UDC character, 15 possible UDC values from 128-142
+ |
+ |  Returns:        Nothing
+ |
+\*---------------------------------------------------------------------------*/
+void HDSP253X_Display::putc(char disp_char) {
+
+    // Write selected character to display at current position
+   
+    if ((disp_char & HDSP253X_UDC_SEL) == HDSP253X_UDC_SEL) {      
+        // Write UDC character to display, code between 128-143
+        disp_char &= HDSP253X_UDC_MASK;        // mask off unused bits
+        disp_char |= HDSP253X_UDC_SEL;         // add in top bit to specify UDC        
+        _write(HDSP253X_ADDR_CHAR_BASE + _column, disp_char);
+    }
+    else {
+        // Write ASCII character, code between 0-127
+        disp_char &= HDSP253X_CHAR_MASK;        // mask off unused bits
+        _write(HDSP253X_ADDR_CHAR_BASE + _column, disp_char);        
+    }
+    
+    // Incr and wrap around cursorposition
+    _column++; 
+    _column = _column % HDSP253X_NUM_CHARS;    
+}
+
+
+
+#if(0)
+char HDSP253X_Display::getc() {
+  return -1;
+}
+#endif
+
+/*---------------------------------------------------------------------------*\
+ |
+ |  Function:       HDSP253X_locate
+ |
+ |  Description:    Set the cursor address where the next character will be written. 
+ |
+ |  Parameters:     Cursor Column address
+ |
+ |  Returns:        Nothing
+ |
+\*---------------------------------------------------------------------------*/
+
+void HDSP253X_Display::locate(uint8_t column) {
+
+//    _row = row % HDSP253X_NUM_ROWS;
+    _column = column % HDSP253X_NUM_CHARS;
+}
+
+
+/*---------------------------------------------------------------------------*\
+ |
+ |  Function:       HDSP253X_cls
+ |
+ |  Description:    Clears the displayed data and flash RAM, but not the user
+ |                  defined characters. Waits for the preset delay to ensure the 
+ |                  display is ready for operation; with an internal clock,
+ |                  this delay needs to be around 1 millisecond. 
+ |
+ |  Parameters:     None
+ |
+ |  Returns:        Nothing
+ |
+\*---------------------------------------------------------------------------*/
+
+void HDSP253X_Display::cls(void) {
+
+    uint8_t disp_data;
+
+    // Read in control word, modify and write back out
+    disp_data = _read(HDSP253X_ADDR_CTRL_WORD);
+    disp_data |= HDSP253X_CTRL_CLEAR_MASK;
+    _write(HDSP253X_ADDR_CTRL_WORD, disp_data);
+
+    // Wait for the preset delay to allow operation to complete
+    wait_ms(HDSP253X_RST_CLR_DELAY_MS);
+
+    // Reset cursor 
+    locate(0);
+}
+
+
+/*---------------------------------------------------------------------------*\
+ |
+ |  Function:       HDSP253X_set_brightness
+ |
+ |  Description:    Sets the brightness of the HDSP253X display, by performing
+ |                  a read-modify-write on the control register.
+ |
+ |  Parameters:     brightness - 3 bit brightness value
+ |
+ |  Returns:        Nothing
+ |
+\*---------------------------------------------------------------------------*/
+
+void HDSP253X_Display::set_brightness(uint8_t brightness) {
+
+    uint8_t ctrl_data;
+
+    // Read in control word, modify and write back out
+    ctrl_data = _read(HDSP253X_ADDR_CTRL_WORD);
+    ctrl_data &= ~HDSP253X_CTRL_BRIGHT_MASK;
+    ctrl_data |= (brightness & HDSP253X_CTRL_BRIGHT_MASK);
+    _write(HDSP253X_ADDR_CTRL_WORD, ctrl_data);
+}
+
+/*---------------------------------------------------------------------------*\
+ |
+ |  Function:       HDSP253X_start_self_test
+ |
+ |  Description:    Starts the HDSP253X self test, setting the relevant 
+ |                  control word bit. The caller should then wait for 
+ |                  the required number of seconds before checking the result.
+ |                  With the internal display clock, the self test takes 
+ |                  around 5 seconds, so waiting for 6 seconds should
+ |                  be OK. Slower clocks will require longer delays.
+ |
+ |                  Note that some displays such as the Siemens HDSP2111
+ |                  appear to take longer than the official 4.5 seconds
+ |                  so it is advisable to wait for longer (say 6 seconds)
+ |                  before checking the result. Attempting to access the
+ |                  display before it is ready may result in the self test
+ |                  status failing to clear down.
+ |
+ |                  Also note that some display datasheets suggest that
+ |                  the display must be reset BEFORE running the self
+ |                  test routine, so this routine does this.
+ |
+ |  Parameters:     None
+ |
+ |  Returns:        Nothing
+ |
+\*---------------------------------------------------------------------------*/
+
+void HDSP253X_Display::start_self_test(void) {
+
+    // Reset the display to ensure it is ready for the self test
+    reset();
+
+    // Directly write the self test request, as control word is wiped at end
+    _write(HDSP253X_ADDR_CTRL_WORD, HDSP253X_CTRL_SELFTEST_MASK);
+}
+
+/*---------------------------------------------------------------------------*\
+ |
+ |  Function:       HDSP253X_finish_self_test
+ |
+ |  Description:    Reads the control register to determine the self test
+ |                  result. Then issues a display reset to ensure 
+ |                  that it is ready for operation afterwards. While such
+ |                  a reset should not be necessary if an adequate delay
+ |                  occurs between starting the self test and checking the 
+ |                  result, issuing a reset guarantees that the display will 
+ |                  be ready for operation. This also means that this function
+ |                  can be called early to prematurely terminate a self test.
+ |
+ |  Parameters:     None
+ |
+ |  Returns:        True if passed, False if failed
+ |
+\*---------------------------------------------------------------------------*/
+
+bool HDSP253X_Display::finish_self_test(void) {
+    uint8_t ctrl_data;
+    bool result;
+    
+    // Read back control word and obtain self test result
+    ctrl_data = _read(HDSP253X_ADDR_CTRL_WORD);
+    result = ((ctrl_data & HDSP253X_CTRL_STRESULT_MASK) != 0);
+
+    // Reset the display to ensure it is ready for normal operation
+    reset();
+
+    // Indicate the self test result
+    return result;
+}
+
+
+/*---------------------------------------------------------------------------*\
+ |
+ |  Function:       HDSP253X_set_blink_mode
+ |
+ |  Description:    Enables or disables the blinking function on the display.
+ |                  When enabled, blinking will flash the whole display 
+ |                  irrespective of the flash RAM. With the internal clock,
+ |                  the blink rate is 2Hz. Note that blink mode overrides 
+ |                  the normal flashing mode.
+ |
+ |  Parameters:     enable - true to enable, false to disable
+ |
+ |  Returns:        Nothing
+ |
+\*---------------------------------------------------------------------------*/
+
+void HDSP253X_Display::set_blink_mode(bool enable) {
+    uint8_t ctrl_data;
+
+    // read in control word, modify and write back out
+    ctrl_data = _read(HDSP253X_ADDR_CTRL_WORD);
+    if (enable) {
+      ctrl_data |= HDSP253X_CTRL_BLINK_MASK;
+    }
+    else {
+      ctrl_data &= ~HDSP253X_CTRL_BLINK_MASK;
+    }
+    _write(HDSP253X_ADDR_CTRL_WORD, ctrl_data);
+}
+
+/*---------------------------------------------------------------------------*\
+ |
+ |  Function:       HDSP253X_set_flash_mode
+ |
+ |  Description:    Enables or disables the flashing function on the display.
+ |                  When enabled, characters with the flashing bit set in the 
+ |                  RAM will flash. With the internal clock, the flash rate is 2Hz.
+ |
+ |  Parameters:     enable - true to enable, false to disable
+ |
+ |  Returns:        Nothing
+ |
+\*---------------------------------------------------------------------------*/
+
+void HDSP253X_Display::set_flash_mode(bool enable) {
+    uint8_t ctrl_data;
+
+    // read in control word, modify and write back out
+    ctrl_data = _read(HDSP253X_ADDR_CTRL_WORD);
+    if (enable) {
+      ctrl_data |= HDSP253X_CTRL_FLASH_MASK;
+    }
+    else {
+      ctrl_data &= ~HDSP253X_CTRL_FLASH_MASK;
+    }
+    _write(HDSP253X_ADDR_CTRL_WORD, ctrl_data);
+}
+
+/*---------------------------------------------------------------------------*\
+ |
+ |  Function:       HDSP253X_set_all_flash_states
+ |
+ |  Description:    Sets flashing states of all characters in flash RAM, using 
+ |                  supplied bit mask. Each bit corresponds to a character
+ |                  (bit 7 on left, bit 0 on right), and is set to flash and
+ |                  clear for steady operation. NOTE: The overall flashing 
+ |                  enable/disable state is set by the separate set flash 
+ |                  mode function.
+ |
+ |  Parameters:     flash_bits - bitmask containing flash states
+ |
+ |  Returns:        Nothing
+ |
+\*---------------------------------------------------------------------------*/
+
+void HDSP253X_Display::set_all_flash_states(uint8_t flash_bits)
+{
+    int i;
+    uint8_t char_pos;
+
+    // loop round all character positions, extracting each bit in turn
+    for (i = 1; i <= HDSP253X_NUM_CHARS; i++)
+    {
+      // Get state of bottom bit from mask and use to adjust flash state
+      // Note that character address is reversed as we start from right
+      char_pos = HDSP253X_NUM_CHARS - i;
+      _write(HDSP253X_ADDR_FLASH_BASE + char_pos, flash_bits & 0x01);
+
+      // Shift the mask to the right, ready for the next go
+      flash_bits >>= 1;
+    }
+}
+
+/*---------------------------------------------------------------------------*\
+ |
+ |  Function:       HDSP253X_set_char_flash_state
+ |
+ |  Description:    Sets flashing state of one character in flash RAM, using 
+ |                  supplied character position and enable state. NOTE: The 
+ |                  overall flashing enable/disable state is set by the 
+ |                  separate set flash mode function.
+ |
+ |  Parameters:     flash_state - TRUE to flash, FALSE for steady operation
+ |                  char_pos - position on the display (0 to 7)
+ |
+ |  Returns:        Nothing
+ |
+\*---------------------------------------------------------------------------*/
+
+void HDSP253X_Display::set_char_flash_state(bool flash_state, uint8_t char_pos) {
+    // Write out the new flash state to the flash RAM
+    _write(HDSP253X_ADDR_FLASH_BASE + char_pos, flash_state);
+}
+
+/*---------------------------------------------------------------------------*\
+ |
+ |  Function:       HDSP253X_define_user_char
+ |
+ |  Description:    Full definition of UDC, firstly setting the UDC address
+ |                  to specified character, and then loading all 7 data rows.
+ |                  Note that for each row, only the bottom 5 bits are used.
+ |  
+ |  Parameters:     udc_char_num - number of UDC character, from 0 to 15
+ |                  row_data_1 - top row data
+ |                  row_data_2 - second row data
+ |                  row_data_3 - third row data
+ |                  row_data_4 - fourth row data
+ |                  row_data_5 - fifth row data
+ |                  row_data_6 - sixth row data
+ |                  row_data_7 - bottomp row data
+ |  
+ |  Returns:        Nothing
+ |
+\*---------------------------------------------------------------------------*/
+
+void HDSP253X_Display::define_user_char(uint8_t udc_char_num, uint8_t row_data_1, uint8_t row_data_2,
+                                        uint8_t row_data_3, uint8_t row_data_4, uint8_t row_data_5, 
+                                        uint8_t row_data_6, uint8_t row_data_7)
+{
+    // firstly set the UDC character address, by writing to the UDC addr reg
+    _write(HDSP253X_ADDR_UDC_ADDRESS, udc_char_num);
+
+    // now write out the 7 rows to the UDC RAM
+    _write(HDSP253X_ADDR_UDC_ROW_BASE+0, row_data_1);
+    _write(HDSP253X_ADDR_UDC_ROW_BASE+1, row_data_2);
+    _write(HDSP253X_ADDR_UDC_ROW_BASE+2, row_data_3);
+    _write(HDSP253X_ADDR_UDC_ROW_BASE+3, row_data_4);
+    _write(HDSP253X_ADDR_UDC_ROW_BASE+4, row_data_5);
+    _write(HDSP253X_ADDR_UDC_ROW_BASE+5, row_data_6);
+    _write(HDSP253X_ADDR_UDC_ROW_BASE+6, row_data_7);
+}
+
+
+/*****************************************************************************/
+/******************************  END OF FILE  ********************************/
+/*****************************************************************************/
+
diff -r 000000000000 -r b3430a613781 HDSP253X.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HDSP253X.h	Sun Jan 25 17:23:44 2015 +0000
@@ -0,0 +1,223 @@
+/* HDSP253X_Display - Intelligent 8 digit 5x7 LED matrix display
+ *
+ * Copyright (c) 2011 Wim Huiskamp
+ * Modified software based on sourcecode by RAC 06/08/2008
+ *
+ * Released under the MIT License: http://mbed.org/license/mit
+ *
+ * version 0.2 Initial Release
+*/
+#ifndef MBED_HDSP253X_H
+#define MBED_HDSP253X_H
+/*---------------------------------------------------------------------------*\
+ |  Original text by RAC 06/08/2008 has been modified to fix those parts of
+ |  the description which explain hardware or software that has been removed or
+ |  adapted in the new version. 
+ |
+ |  Description: Display driver and demonstrator for HDSP253X series intelligent
+ |            8 character LED display modules. Options include adjusting 
+ |            brightness and message blinking.
+ |            This software drives a single display module using 8 bit databus,
+ |            5 bit addressbus and controlsignals. Note that this software
+ |            will drive all display devices in the series, including HDSP2530 Orange,
+ |            HDSP2531 Yellow, HDSP2532 red and HDSP2533 green devices. It will also
+ |            drive the smaller HDSP21XX series.
+ |
+ |            The peripheral is connected to the following pins:
+ |            HDSP253X
+ |                    - Reset (pin 1) to EnableBus.RESET
+ |                    - Flash (pin 2) to AddressBus.A5
+ |                    - Addr A0 (pin 3) to AddressBus.A0
+ |                    - Addr A1 (pin 4) to AddressBus.A1
+ |                    - Addr A2 (pin 5) to AddressBus.A2
+ |                    - Addr A3 (pin 6) to AddressBus.A3
+ |                    - Addr A4 (pin 10) to AddressBus.A4
+ |                    - Clock select (pin 11) to VCC (Pull Up)
+ |                    - Clock in/out (pin 12) to Not Connected
+ |                    - Write (pin 13) to ControlBus.WR
+ |                    - CE (Pin 14) to EnableBus.CSDISP
+ |                    - VDD 5V (Pin 15)
+ |                    - GND (supply) (Pin 16)
+ |                    - TST (Pin 16) NC
+ |                    - GND (logic) (Pin 18)   
+ |                    - Read (pin 19) to ControlBus.RD
+ |                    - Data D0 (pin 20) to Databus.D0
+ |                    - Data D1 (pin 21) to Databus.D1
+ |                    - Data D2 (pin 25) to Databus.D2
+ |                    - Data D3 (pin 26) to Databus.D3
+ |                    - Data D4 (pin 27) to Databus.D4
+ |                    - Data D5 (pin 28) to Databus.D5
+ |                    - Data D6 (pin 29) to Databus.D6
+ |                    - Data D7 (pin 30) to Databus.D7
+ |
+ |            The peripheral is connected to the following pins:
+ |            HDSP211X
+ |                    - Reset (pin 1) to EnableBus.RESET
+ |                    - Flash (pin 2) to AddressBus.A5
+ |                    - Addr A0 (pin 3) to AddressBus.A0
+ |                    - Addr A1 (pin 4) to AddressBus.A1
+ |                    - Addr A2 (pin 5) to AddressBus.A2
+ |                    - Addr A3 (pin 6) to AddressBus.A3
+ |                    - Addr A4 (pin 10) to AddressBus.A4
+ |                    - Clock select (pin 11) to VCC (Pull Up)
+ |                    - Clock in/out (pin 12) to Not Connected
+ |                    - Write (pin 13) to ControlBus.WR
+ |                    - VDD 5V (Pin 14)
+ |                    - GND (supply) (Pin 15)
+ |                    - GND (logic) (Pin 16)   
+ |                    - CE (Pin 17) to EnableBus.CSDISP
+ |                    - Read (pin 18) to ControlBus.RD
+ |                    - Data D0 (pin 19) to Databus.D0
+ |                    - Data D1 (pin 20) to Databus.D1
+ |                    - Data D2 (pin 23) to Databus.D2
+ |                    - Data D3 (pin 24) to Databus.D3
+ |                    - Data D4 (pin 25) to Databus.D4
+ |                    - Data D5 (pin 26) to Databus.D5
+ |                    - Data D6 (pin 27) to Databus.D6
+ |                    - Data D7 (pin 28) to Databus.D7
+ |
+ |  Details:  All signals to the HDSP253X are pulled up by 10K resistors.
+ |            The device must be reset by pulsing Reset low with Chip Enable
+ |            set high. Other signals are don't cares during a reset. This
+ |            firmware meets these conditions, as long as the pullups are 
+ |            correctly installed.
+ |
+ |            Connecting the clock select and in/out lines to the CPU is optional,
+ |            and may be used for experimentation.
+ |            If using one display, the clock select should normally be pulled
+ |            up high, which results in the clock signal being an output.
+ |            This driver software does not currently control these signals.
+ |
+ |            If using more than one display, the driver software will 
+ |            require modification and extension. Multiple displays should
+ |            have reset, data, address, flash and read/write lines paralleled.
+ |            Each display requires a unique Chip Enable input, and the 
+ |            driver software will need to select which display to access.
+ |            The first display should have clock select high, and its clock
+ |            output connected to the clock inputs on all the other displays;
+ |            these should have clock select low to input the clock signal.
+ |
+ |            Calls to wait_ms() are used to meet the display timing specs
+ |            may need to be modified at higher CPU speeds.
+ |
+ |
+ |  Legalese: This software is FREEWARE, and you can adapt it for any
+ |            purpose whatsoever. I cannot be held responsible for any
+ |            loss, injury, damage or death caused by the use of this 
+ |            software.
+ |
+\*---------------------------------------------------------------------------*/
+
+//Useful stuff to simplify porting of some third party software
+ #include <stdarg.h>
+ //#include "Utils.h"
+
+
+/*****************************************************************************/
+/*********************  DEFINITIONS FOR HDSP253X DISPLAY  ********************/
+/*****************************************************************************/
+
+// Specific delays for display operation, assuming internal clocking
+// This may need to be lengthened if a significantly slower external clock is used
+#define HDSP253X_1TCY_WAIT_MS       1
+//#define HDSP253X_1TCY_WAIT_MS       10
+#define HDSP253X_RST_CLR_DELAY_MS   2       // delay AFTER issuing reset or clear
+#define HDSP253X_SELFTEST_WAIT_MS   6000    // duration of self test operation
+
+// address values and masks for HDSP253X display access
+#define HDSP253X_ADDR_FLASH_BASE    0x00 
+#define HDSP253X_ADDR_UDC_ADDRESS   0x20 
+#define HDSP253X_ADDR_UDC_ROW_BASE  0x28 
+#define HDSP253X_ADDR_CTRL_WORD     0x30 
+#define HDSP253X_ADDR_CHAR_BASE     0x38 
+// minimises address line power consumption through pullups
+#define HDSP253X_ADDR_LOW_POWER     0x3F
+
+// control word masks for HDSP253X display
+#define HDSP253X_CTRL_BRIGHT_MASK   0x07 
+#define HDSP253X_CTRL_FLASH_MASK    0x08 
+#define HDSP253X_CTRL_BLINK_MASK    0x10 
+#define HDSP253X_CTRL_STRESULT_MASK 0x20 
+#define HDSP253X_CTRL_SELFTEST_MASK 0x40 
+#define HDSP253X_CTRL_CLEAR_MASK    0x80 
+
+// Masks for register read, Bit 7 not readable in the target hardware 
+#define HDSP253X_CTRL_MASK          0x7F 
+
+
+// display brightness definitions, indicating percentage brightness
+#define HDSP253X_BRIGHT_100         0x00
+#define HDSP253X_BRIGHT_80          0x01
+#define HDSP253X_BRIGHT_53          0x02
+#define HDSP253X_BRIGHT_40          0x03
+#define HDSP253X_BRIGHT_27          0x04
+#define HDSP253X_BRIGHT_20          0x05
+#define HDSP253X_BRIGHT_13          0x06
+#define HDSP253X_BRIGHT_0           0x07
+
+// miscellaneous definitions for HDSP253X display
+#define HDSP253X_NUM_CHARS          8
+#define HDSP253X_CHAR_MASK          0x7F  
+#define HDSP253X_UDC_SEL            0x80
+#define HDSP253X_UDC_MASK           0x0F
+#define HDSP253X_ASCII_UDC_CHARS    0x80
+
+// default display brightness
+#define HDSP253X_DEF_DISPLAY_BRIGHT HDSP253X_BRIGHT_100
+
+
+/** Create an HDSP253X_Display object connected to the proper busses
+ *
+ * @param  PCF8574_DataBus data databus to connect to 
+ * @param  PCF8574_AddressBus address addressbus to connect to 
+ * @param  PCF8574_EnableBus enable enablebus to connect to 
+ * @param  MBED_ControlBus control controlbus to connect to 
+*/
+class HDSP253X_Display {
+public:
+    HDSP253X_Display(PCF8574_DataBus &databus, PCF8574_AddressBus &addressbus,
+                     PCF8574_EnableBus &enablebus, MBED_ControlBus &controlbus);
+    void cls();                              
+    void putc(char disp_char);
+//    char getc();    
+
+    void printf (char * format, ...);    
+    void locate(uint8_t column);
+    void define_user_char(uint8_t udc_char_num, uint8_t row_data_1, uint8_t row_data_2,
+                          uint8_t row_data_3, uint8_t row_data_4, uint8_t row_data_5, 
+                          uint8_t row_data_6, uint8_t row_data_7);    
+    void putudc(char udc_char_num);
+                          
+    void set_char_flash_state(bool flash_state, uint8_t char_pos);
+    void set_all_flash_states(uint8_t flash_bits);
+    void set_brightness(uint8_t brightness);  
+    void set_blink_mode(bool enable);  
+    void set_flash_mode(bool enable);        
+    void reset();
+    void start_self_test();  
+    bool finish_self_test();  
+    
+protected:
+    PCF8574_DataBus &_databus;
+    PCF8574_AddressBus &_addressbus;
+    PCF8574_EnableBus &_enablebus;
+    MBED_ControlBus &_controlbus;
+
+//    int _row;
+    int _column;
+    void _write(uint8_t address, uint8_t data);
+    uint8_t _read(uint8_t address);
+    void _init(); 
+//    void _display_ascii_char(char ascii_char, uint8_t char_pos);  
+//    void _display_udc_char(char udc_char, uint8_t char_pos);  
+//    void _display_part_string(const char *disp_string, uint8_t start_pos, uint8_t end_pos);  
+//    void _display_fixed_string(const char *disp_string, uint8_t start_pos);
+          
+};
+
+
+#endif
+/*****************************************************************************/
+/******************************  END OF FILE  ********************************/
+/*****************************************************************************/
+