Commits

Anonymous committed c40e96a Merge

Merge with default

Comments (0)

Files changed (87)

 82f18d4b8ebca14c59e0f8fc2fef075abb9a5d50 V 1.1.6
 981e5559fab2205d613d3c192a322e16f9a20fb2 V 1.1.7
 df4563d57b5cb8a6f534564f10a5d65935d8ef71 V 1.1.7
+2ec4883f118bb66655dbb4012df70df0a4f75b9b V 1.0.7_RC1
+e1485608a8fcda9e6d3a52380e558005283e2619 V 1.2.0_RC1
+2ec4883f118bb66655dbb4012df70df0a4f75b9b V 1.2.0_RC1
+66821a8054ea8dfacdad6c19397dbf93f6bd7fa5 V 1.0.2_RC1
+e1485608a8fcda9e6d3a52380e558005283e2619 V 1.2.0_RC1
+9a1bd27980a539427b876c5bc9cf76a6e679df25 V 1.2.0_RC1
+e1485608a8fcda9e6d3a52380e558005283e2619 V 1.2.0_RC1
+cdf9b4eb0556635c20da8273dfc1f3204864c0a0 V 1.2.0_RC1
+1cf625ca9242d298a480c655d38ad964cd61ae61 V 1.2.0
 // (https://github.com/chipKIT32/chipKIT32-MAX/blob/master/hardware/pic32/
 //   cores/pic32/wiring_digital.c)
 // ---------------------------------------------------------------------------
-
 #include "FastIO.h"
 
 fio_register fio_pinToOutputRegister(uint8_t pin, uint8_t initial_state)
 #ifdef FIO_FALLBACK
 	digitalWrite(pinBit, value);
 #else
-	if(value == LOW)
+   ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
    {
-		fio_digitalWrite_LOW(pinRegister,pinBit);
-	}
-   else
-   {
-		fio_digitalWrite_HIGH(pinRegister,pinBit);
-	}
+      if(value == LOW)
+      {
+         fio_digitalWrite_LOW(pinRegister,pinBit);
+      }
+      else
+      {
+         fio_digitalWrite_HIGH(pinRegister,pinBit);
+      }
+   }
 #endif
 }
 
 #endif
 }
 
-void fio_shiftOut ( fio_register dataRegister, fio_bit dataBit, fio_register clockRegister, 
-                    fio_bit clockBit, uint8_t value, uint8_t bitOrder)
+void fio_shiftOut ( fio_register dataRegister, fio_bit dataBit, 
+                    fio_register clockRegister, fio_bit clockBit, 
+                    uint8_t value, uint8_t bitOrder)
 {
 	// # disable interrupts
-	// uint8_t oldSREG = SREG;
-	// cli();
 	int8_t i;
 
-	for(i = 0; i < 8; i++)
+   ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
    {
-		if (bitOrder == LSBFIRST)
+      for(i = 0; i < 8; i++)
       {
-			fio_digitalWrite(dataRegister, dataBit, !!(value & (1 << i)));
-		}
-      else
-      {
-			fio_digitalWrite(dataRegister, dataBit, !!(value & (1 << (7 - i))));
-		}
-		fio_digitalWrite_HIGH (clockRegister, clockBit);
-		// Switching is a little bit faster
-		fio_digitalWrite_SWITCH (clockRegister,clockBit);
-	}
-	// # enable interrupts
-	// SREG = oldSREG;
+         if (bitOrder == LSBFIRST)
+         {
+            fio_digitalWrite(dataRegister, dataBit, !!(value & (1 << i)));
+         }
+         else
+         {
+            fio_digitalWrite(dataRegister, dataBit, !!(value & (1 << (7 - i))));
+         }
+         fio_digitalWrite_HIGH (clockRegister, clockBit);
+         
+         // Switching is a little bit faster
+         fio_digitalWrite_SWITCH (clockRegister,clockBit);
+      }
+   } // end critical section
 }
 
-void fio_shiftOut(fio_register dataRegister, uint8_t dataBit, fio_register clockRegister, uint8_t clockBit)
+void fio_shiftOut(fio_register dataRegister, uint8_t dataBit, 
+                  fio_register clockRegister, uint8_t clockBit)
 {
-	// shift out 0x0 (B00000000) fast, byte order is irrelevant
-	fio_digitalWrite_LOW (dataRegister, dataBit);
+   ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+   {
+      // shift out 0x0 (B00000000) fast, byte order is irrelevant
+      fio_digitalWrite_LOW (dataRegister, dataBit);
 
-	for(uint8_t i = 0; i<8; ++i)
-   {
-		fio_digitalWrite_HIGH (clockRegister, clockBit);
-		fio_digitalWrite_SWITCH (clockRegister, clockBit);
-	}
+      for(uint8_t i = 0; i<8; ++i)
+      {
+         fio_digitalWrite_HIGH (clockRegister, clockBit);
+         fio_digitalWrite_SWITCH (clockRegister, clockBit);
+      }
+   }
 }
 void fio_shiftOut1_init(uint8_t pin)
 {
 	fio_digitalWrite(shift1Register,shift1Bit,HIGH);
 	delayMicroseconds(300);
 }
-void fio_shiftOut1(fio_register shift1Register, fio_bit shift1Bit, uint8_t value, boolean noLatch)
+void fio_shiftOut1(fio_register shift1Register, fio_bit shift1Bit, uint8_t value, 
+                   boolean noLatch)
 {
 	// disable interrupts since timing is going to be critical
 	uint8_t oldSREG;
 void fio_shiftOut1_rb(fio_register shift1Register, fio_bit shift1Bit, uint8_t value, boolean noLatch)
 {
    /*
-    * this function are based on Shif1 protocol developed by Roman Black (http://www.romanblack.com/shift1.htm)
+	 * this function are based on Shif1 protocol developed by Roman Black 
+    *    (http://www.romanblack.com/shift1.htm)
     *
     * test sketches:
     *    http://pastebin.com/raw.php?i=2hnC9v2Z
     *                   arduino-one-wire-shift-register-prototype)
     *    7HC595N
     */
-   // disable interrupts since timing is going to be critical
-   uint8_t oldSREG;
-   oldSREG = SREG;
-   cli();
 
    // iterate but ignore last bit (is it correct now?)
    for(int8_t i = 7; i>=0; --i)
    {
 
-      // assume that pin is HIGH (smokin' pot all day... :) - requires initialization
-      if(LOW==!!(value & (1 << i)))
+		// assume that pin is HIGH (smokin' pot all day... :) - requires 
+      // initialization
+		if(value & _BV(i))
       {
-         // LOW = 0 Bit
-         fio_digitalWrite_SWITCHTO(shift1Register,shift1Bit,LOW);
-         // hold pin LOW for 15us
+         ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+         {
+            // HIGH = 1 Bit
+            fio_digitalWrite_SWITCHTO(shift1Register,shift1Bit,LOW);
+            //hold pin LOW for 1us - done! :)
+            fio_digitalWrite_SWITCHTO(shift1Register,shift1Bit,HIGH);
+            //hold pin HIGH for 15us
+         } // end critical section
          delayMicroseconds(15);
-         fio_digitalWrite_SWITCHTO(shift1Register,shift1Bit,HIGH);
-         // hold pin HIGH for 30us
-         delayMicroseconds(30);
-      }
+		}
       else
       {
-         // HIGH = 1 Bit
-         fio_digitalWrite_SWITCHTO(shift1Register,shift1Bit,LOW);
-         //hold pin LOW for 1us - done! :)
-         fio_digitalWrite_SWITCHTO(shift1Register,shift1Bit,HIGH);
-         //hold pin HIGH for 15us
-         delayMicroseconds(15);
+         ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+         {
+            // LOW = 0 Bit
+            fio_digitalWrite_SWITCHTO(shift1Register,shift1Bit,LOW);
+            // hold pin LOW for 15us
+            delayMicroseconds(15);
+            fio_digitalWrite_SWITCHTO(shift1Register,shift1Bit,HIGH);
+         } // end critical section
+         // hold pin HIGH for 30us
+         delayMicroseconds(30);         
       }
       if(!noLatch && i==1)
       {
 
    if(!noLatch)
    {
-      // send last bit (=LOW) and Latch command
-      fio_digitalWrite_SWITCHTO(shift1Register,shift1Bit,LOW);
-      // Hold pin low for 200us
-      delayMicroseconds(210);
-      fio_digitalWrite_HIGH(shift1Register,shift1Bit);
-      // Hold pin high for 300us and leave it that way - using explicit HIGH here, just in case.
-      delayMicroseconds(300);
+      ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+      {
+         // send last bit (=LOW) and Latch command
+         fio_digitalWrite_SWITCHTO(shift1Register,shift1Bit,LOW);
+      } // end critical section
+      delayMicroseconds(199); 		// Hold pin low for 200us
+
+      ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+      {
+         fio_digitalWrite_HIGH(shift1Register,shift1Bit);
+      } // end critical section
+		delayMicroseconds(299);   // Hold pin high for 300us and leave it that 
+                                // way - using explicit HIGH here, just in case.
    }
 
-   // enable interrupts
-   SREG = oldSREG;
 }
 
 #include <pins_arduino.h> // pleasing sanguino core
 #include <inttypes.h>
-#include <util/delay.h>
+
 
 /*!
  @defined 
  */
 #ifndef __AVR__
 #define FIO_FALLBACK
+#define ATOMIC_BLOCK
+#define ATOMIC_RESTORESTATE
+#else
+#include <util/atomic.h> // for critical section management
 #endif
 
 // PUBLIC CONSTANTS DEFINITIONS
 
 
 #ifndef FIO_FALLBACK
-typedef volatile uint8_t * fio_register;
+typedef volatile uint8_t *fio_register;
 #else
 // remove volatile to give optimizer a chance
 typedef uint8_t fio_register;
 // read and write uint8_t operations and basic pin level routines to set or read
 // a particular IO port.
 //
-// This library is only compatible with Arduino's SDK version 1.0
 //
 // @version API 1.0.0
 //
 // read and write uint8_t operations and basic pin level routines to set or read
 // a particular IO port.
 //
-// This library is only compatible with Arduino's SDK version 1.0
-//
 // @version API 1.0.0
 //
 // @author F. Malpartida - fmalpartida@gmail.com
 // backpacks such as the I2CLCDextraIO using the PCF8574* I2C IO Expander ASIC.
 //
 //
-// @version API 1.0.0
+// @version API 1.1.0
 //
 // @author F. Malpartida - fmalpartida@gmail.com
 // ---------------------------------------------------------------------------
    // before sending commands. Arduino can turn on way before 4.5V so we'll wait 
    // 50
    // ---------------------------------------------------------------------------
-   delayMicroseconds(50000); 
+   delay (100); // 100ms delay
       
    //put the LCD into 4 bit or 8 bit mode
    // -------------------------------------
    command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT);
 }
 
-void LCD::scrollDisplayRight(void) {
+void LCD::scrollDisplayRight(void) 
+{
    command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT);
 }
 
    command(LCD_ENTRYMODESET | _displaymode);
 }
 
+// This method moves the cursor one space to the right
+void LCD::moveCursorRight(void)
+{
+   command(LCD_CURSORSHIFT | LCD_CURSORMOVE | LCD_MOVERIGHT);
+}
+
+// This method moves the cursor one space to the left
+void LCD::moveCursorLeft(void)
+{
+   command(LCD_CURSORSHIFT | LCD_CURSORMOVE | LCD_MOVELEFT);
+}
+
+
 // This will 'right justify' text from the cursor
 void LCD::autoscroll(void) 
 {
    for (int i=0; i<8; i++) 
    {
       write(charmap[i]);      // call the virtual write method
-      delayMicroseconds(30);
+      delayMicroseconds(40);
    }
 }
 
+void LCD::backlight ( void )
+{
+   setBacklight(255);
+}
+
+void LCD::noBacklight ( void )
+{
+   setBacklight(0);
+}
+
 // General LCD commands - generic methods used by the rest of the commands
 // ---------------------------------------------------------------------------
 void LCD::command(uint8_t value) 
 // it has been extended to drive 4 and 8 bit mode control, LCDs and I2C extension
 // backpacks such as the I2CLCDextraIO using the PCF8574* I2C IO Expander ASIC.
 //
-// @version API 1.0.0
+// The functionality provided by this class and its base class is identical
+// to the original functionality of the Arduino LiquidCrystal library.
+//
+// @version API 1.1.0
 //
 //
 // @author F. Malpartida - fmalpartida@gmail.com
 #define DATA                    1
 
 /*!
-    @defined 
-    @abstract   Defines the duration of the home and clear commands
-    @discussion This constant defines the time it takes for the home and clear
-          commands in the LCD - Time in microseconds.
-*/
+ @defined 
+ @abstract   Defines the duration of the home and clear commands
+ @discussion This constant defines the time it takes for the home and clear
+ commands in the LCD - Time in microseconds.
+ */
 #define HOME_CLEAR_EXEC      2000
 
 class LCD : public Print 
     initializes the LCD, therefore, it MUST be called prior to using any other
     method from this class.
     
-    This method is pure abstract, it is dependent on each derived class from
-    this base class to implement the internals of how the LCD is initialized
-    and configured.
+    This method is abstract, a base implementation is available common to all LCD
+    drivers. Should it not be compatible with some other LCD driver, a derived
+    implementation should be done on the driver specif class.
     
     @param      cols[in] the number of columns that the display has
     @param      rows[in] the number of rows that the display has
     */
    virtual void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS);
-  
+   
    /*!
     @function
     @abstract   Clears the LCD.
    
    /*!
     @function
+    @abstract   Moves the cursor one space to the left.
+    @discussion 
+    @param      none
+    */   
+   void moveCursorLeft();
+
+   
+   /*!
+    @function
+    @abstract   Moves the cursor one space to the right.
+    
+    @param      none
+    */
+   void moveCursorRight();
+   
+   /*!
+    @function
     @abstract   Turns on automatic scrolling of the LCD.
     @discussion Turns on automatic scrolling of the LCD. This causes each 
     character output to the display to push previous characters over by one 
     @param      row[in] LCD row - line.
     */
    void setCursor(uint8_t col, uint8_t row);
-   
+
    
    /*!
     @function
     */
    void command(uint8_t value);
    
+   //
+   // virtual class methods
+   // --------------------------------------------------------------------------
+   /*!
+    @function
+    @abstract   Sets the pin to control the backlight.
+    @discussion Sets the pin in the device to control the backlight.
+    This method is device dependent and can be programmed on each subclass. An 
+    empty function call is provided that does nothing.
+    
+    @param      mode: backlight mode (HIGH|LOW)
+    */
+   virtual void setBacklightPin ( uint8_t value ) { };
+   
+   /*!
+    @function
+    @abstract   Sets the pin to control the backlight.
+    @discussion Sets the pin in the device to control the backlight. The behaviour
+    of this method is very dependent on the device. Some controllers support
+    dimming some don't. Please read the actual header file for each individual
+    device. The setBacklightPin method has to be called before setting the backlight.
+    @see setBacklightPin.
+    
+    NOTE: The prefered methods to control the backlight are "backlight" and
+    "noBacklight".
+    
+    @param      0..255 - the value is very dependent on the LCD, however, 0
+    will be interpreted as off.
+    */
+   virtual void setBacklight ( uint8_t value ) { };
+   
+   /*!
+    @function
+    @abstract   Switch-on the LCD backlight.
+    @discussion Switch-on the LCD backlight.
+    The setBacklightPin has to be called before setting the backlight for
+    this method to work. @see setBacklightPin. 
+   */
+   void backlight ( void );
+
+   /*!
+    @function
+    @abstract   Switch-off the LCD backlight.
+    @discussion Switch-off the LCD backlight.
+    The setBacklightPin has to be called before setting the backlight for
+    this method to work. @see setBacklightPin. 
+    */   
+   void noBacklight ( void );
+   
    /*!
     @function
     @abstract   Writes to the LCD.
    // Internal LCD variables to control the LCD shared between all derived
    // classes.
    uint8_t _displayfunction;  // LCD_5x10DOTS or LCD_5x8DOTS, LCD_4BITMODE or 
-   // LCD_8BITMODE, LCD_1LINE or LCD_2LINE
+                              // LCD_8BITMODE, LCD_1LINE or LCD_2LINE
    uint8_t _displaycontrol;   // LCD base control command LCD on/off, blink, cursor
-   // all commands are "ored" to its contents.
+                              // all commands are "ored" to its contents.
    uint8_t _displaymode;      // Text entry mode to the LCD
    uint8_t _numlines;         // Number of lines of the LCD, initialized with begin()
    uint8_t _cols;             // Number of columns in the LCD

LiquidCrystal.cpp

 // Created by Francisco Malpartida on 20/08/11.
 // Copyright 2011 - Under creative commons license 3.0:
 //        Attribution-ShareAlike CC BY-SA
-//LiquidCrystal
+//
 // This software is furnished "as is", without technical support, and with no 
 // warranty, express or implied, as to its usefulness for any purpose.
 //
 // to the original functionality of the Arduino LiquidCrystal library.
 //
 //
-// This library is only compatible with Arduino's SDK version 1.0
-//
-//
 // @author F. Malpartida - fmalpartida@gmail.com
 // ---------------------------------------------------------------------------
 #include <stdio.h>
 #endif
 #include "LiquidCrystal.h"
 
+// CONSTANT  definitions
+// ---------------------------------------------------------------------------
+#define LCD_NOBACKLIGHT 0xFF
+
 // STATIC helper functions
 // ---------------------------------------------------------------------------
 
    init(LCD_4BIT, rs, 255, enable, d0, d1, d2, d3, 0, 0, 0, 0);
 }
 
+
+
+// PUBLIC METHODS
+// ---------------------------------------------------------------------------
+
+/************ low level data pushing commands **********/
+
+// send
+void LiquidCrystal::send(uint8_t value, uint8_t mode) 
+{
+   digitalWrite( _rs_pin, mode );
+   
+   // if there is a RW pin indicated, set it low to Write
+   // ---------------------------------------------------
+   if (_rw_pin != 255) 
+   { 
+      digitalWrite(_rw_pin, LOW);
+   }
+   
+   if (_displayfunction & LCD_8BITMODE)
+   {
+      writeNbits(value, 8); 
+   } 
+   else 
+   {
+      writeNbits ( value >> 4, 4 );
+      writeNbits ( value, 4 );
+   }
+   waitUsec ( EXEC_TIME ); // wait for the command to execute by the LCD
+}
+
+//
+// setBacklightPin
+void LiquidCrystal::setBacklightPin ( uint8_t pin )
+{
+   pinMode ( pin, OUTPUT ); // Difine the backlight pin as output
+   _backlightPin = pin;
+}
+
+//
+// setBackligh
+void LiquidCrystal::setBacklight ( uint8_t value )
+{
+   if ( _backlightPin != LCD_NOBACKLIGHT )
+   {
+      analogWrite ( _backlightPin, value );
+   }
+}
+
 // PRIVATE METHODS
 // ---------------------------------------------------------------------------
 
    { 
       digitalWrite(_rw_pin, LOW);
    }
-}
-
-// PUBLIC METHODS
-// ---------------------------------------------------------------------------
-
-/************ low level data pushing commands **********/
-
-// send
-void LiquidCrystal::send(uint8_t value, uint8_t mode) 
-{
-   digitalWrite( _rs_pin, mode );
    
-   // if there is a RW pin indicated, set it low to Write
-   // ---------------------------------------------------
-   if (_rw_pin != 255) 
-   { 
-      digitalWrite(_rw_pin, LOW);
-   }
-   
-   if (_displayfunction & LCD_8BITMODE)
-   {
-      writeNbits(value, 8); 
-   } 
-   else 
-   {
-      writeNbits ( value >> 4, 4 );
-      writeNbits ( value, 4 );
-   }
-   waitUsec ( EXEC_TIME ); // wait for the command to execute by the LCD
+   // Initialise the backlight pin no nothing
+   _backlightPin = LCD_NOBACKLIGHT;
 }
 
 //
    }
    pulseEnable();
 }
+
+
 // on the Hitachi HD44780 and compatible chipsets using the parallel port of
 // the LCD (4 bit and 8 bit).
 //
-// The functionality provided by this class and its base class is identical
-// to the original functionality of the Arduino LiquidCrystal library.
-//
-//
-// This library is only compatible with Arduino's SDK version 1.0
 //
 //
 // @author F. Malpartida - fmalpartida@gmail.com
     */
    virtual void send(uint8_t value, uint8_t mode);
    
+   /*!
+    @function
+    @abstract   Sets the pin to control the backlight.
+    @discussion Sets the pin in the device to control the backlight.
+    
+    @param      pin: pin assigned to the backlight
+    */
+   void setBacklightPin ( uint8_t pin );
+      
+   /*!
+    @function
+    @abstract   Switch-on/off the LCD backlight.
+    @discussion Switch-on/off the LCD backlight.
+    The setBacklightPin has to be called before setting the backlight for
+    this method to work. @see setBacklightPin. For dimming control of the
+    backlight, the configuration pin must be a PWM output pin. Dim control
+    is achieved by passing a value from 1 to 255 as a parameter. If the
+    pin configured when calling the setBacklightPin does not support PWM,
+    then: (0..127) backlight off, (128..255) backlight on.
+    
+    @param      value: backlight value. 0: off, 1..255: dim control of the 
+    backlight. For negative logic 255: off, 254..0: dim control.
+    For non PWM pins: 0..127 - backligh off, 128..255 - backlight on.
+    */
+   void setBacklight ( uint8_t value );
    
 private:
    
    uint8_t _rw_pin;       // LOW: write to LCD.  HIGH: read from LCD.
    uint8_t _enable_pin;   // activated by a HIGH pulse.
    uint8_t _data_pins[8]; // Data pins.
+   uint8_t _backlightPin; // Pin associated to control the LCD backlight
 };
 
 #endif

LiquidCrystal_I2C.cpp

 // to the original functionality of the Arduino LiquidCrystal library.
 //
 //
-// This library is only compatible with Arduino's SDK version 1.0
-//
 //
 // @author F. Malpartida - fmalpartida@gmail.com
 // ---------------------------------------------------------------------------
 #include "I2CIO.h"
 #include "LiquidCrystal_I2C.h"
 
+// CONSTANT  definitions
+// ---------------------------------------------------------------------------
+
+// flags for backlight control
+#define LCD_NOBACKLIGHT 0x00
+#define LCD_BACKLIGHT   0xFF
+
 
 // CONSTRUCTORS
 // ---------------------------------------------------------------------------
 {
    _Addr = lcd_Addr;
    
-   _backlightval = LCD_NOBACKLIGHT;
+   _backlightPinMask = 0x0;
+   _backlightStsMask = LCD_NOBACKLIGHT;
+   
    _En = EN;
    _Rw = RW;
    _Rs = RS;
 }
 
 LiquidCrystal_I2C::LiquidCrystal_I2C( uint8_t lcd_Addr, uint8_t En, uint8_t Rw,
-                                     uint8_t Rs)
+                                      uint8_t Rs)
 {
    _Addr = lcd_Addr;
    
-   _backlightval = LCD_NOBACKLIGHT;
+   _backlightPinMask = 0;
+   _backlightStsMask = LCD_NOBACKLIGHT;
+   
    _En = ( 1 << En );
    _Rw = ( 1 << Rw );
    _Rs = ( 1 << Rs );
 {
    _Addr = lcd_Addr;
    
-   _backlightval = LCD_NOBACKLIGHT;
+   _backlightPinMask = 0;
+   _backlightStsMask = LCD_NOBACKLIGHT;
+
    _En = ( 1 << En );
    _Rw = ( 1 << Rw );
    _Rs = ( 1 << Rs );
    _data_pins[3] = ( 1 << d3 );
 }
 
+// PUBLIC METHODS
+// ---------------------------------------------------------------------------
+
+//
+// begin
+void LiquidCrystal_I2C::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) 
+{
+   
+   init();     // Initialise the I2C expander interface
+   LCD::begin ( cols, lines, dotsize );   
+}
+
+
+// User commands - users can expand this section
+//----------------------------------------------------------------------------
+// Turn the (optional) backlight off/on
+
+//
+// setBacklightPin
+void LiquidCrystal_I2C::setBacklightPin ( uint8_t pin )
+{
+   _backlightPinMask = ( 1 << pin );
+}
+
+//
+// setBacklight
+void LiquidCrystal_I2C::setBacklight( uint8_t value ) 
+{
+   if ( value > 0 )
+   {
+      _backlightStsMask = _backlightPinMask & LCD_BACKLIGHT;
+      
+   }
+   else 
+   {
+      _backlightStsMask = _backlightPinMask & LCD_NOBACKLIGHT;
+   }
+   _i2cio.write( _backlightStsMask );
+}
+
+
 // PRIVATE METHODS
 // ---------------------------------------------------------------------------
 
       _i2cio.portMode ( OUTPUT );  // Set the entire IO extender to OUTPUT
       _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;
       status = 1;
+      _i2cio.write(0);  // Set the entire port to LOW
    }
    return ( status );
 }
 
-
-// PUBLIC METHODS
-// ---------------------------------------------------------------------------
-
-//
-// begin
-void LiquidCrystal_I2C::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) 
-{
-   
-   init();     // Initialise the I2C expander interface
-   LCD::begin ( cols, lines, dotsize );   
-}
-
-
-// User commands - users can expand this section
-//----------------------------------------------------------------------------
-
-// Turn the (optional) backlight off/on
-void LiquidCrystal_I2C::noBacklight(void) 
-{
-   _backlightval=LCD_NOBACKLIGHT;
-   expanderWrite(0);
-}
-
-void LiquidCrystal_I2C::backlight(void) 
-{
-   _backlightval=LCD_BACKLIGHT;
-   expanderWrite(0);
-}
-
-// PRIVATE METHODS
-// ---------------------------------------------------------------------------
-
 // low level data pushing commands
 //----------------------------------------------------------------------------
 
       mode = _Rs;
    }
    
-   expanderWrite ( pinMapValue | mode );
-   pulseEnable ( pinMapValue | mode );
+   pinMapValue |= mode | _backlightStsMask;
+   _i2cio.write ( pinMapValue );
+   pulseEnable ( pinMapValue );
 }
 
 //
-// write4bits
+// pulseEnable
 void LiquidCrystal_I2C::pulseEnable (uint8_t _data)
 {
-   expanderWrite (_data | _En);   // En HIGH
-   expanderWrite(_data & ~_En);   // En LOW
-} 
-
-//
-// expanderWrite
-void LiquidCrystal_I2C::expanderWrite(uint8_t _data)
-{                                        
-   _i2cio.write ( _data );
-}
-
-
-
-
+   _i2cio.write (_data | _En);   // En HIGH
+   _i2cio.write (_data & ~_En);  // En LOW
+}

LiquidCrystal_I2C.h

 // to the original functionality of the Arduino LiquidCrystal library.
 //
 //
-// This library is only compatible with Arduino's SDK version 1.0
-//
-//
 // @author F. Malpartida - fmalpartida@gmail.com
 // ---------------------------------------------------------------------------
 #ifndef LiquidCrystal_I2C_h
 #include "I2CIO.h"
 #include "LCD.h"
 
-// flags for backlight control
-#define LCD_BACKLIGHT   0x00
-#define LCD_NOBACKLIGHT 0x80
-
-/*!
- @warning These definitions will have to be changed should the IOExpander be 
- connected differently to this default.
- */
-
+// Default library configuration parameters used by class constructor with
+// only the I2C address field.
+// ---------------------------------------------------------------------------
 /*!
  @defined 
  @abstract   Enable bit of the LCD
    
    /*!
     @function
-    @abstract   Switch-off the LCD backlight.
-    @discussion Switch-off the LCD backlight, this method is not supported by
-    the I2CLCDextraIO, it needs an extra IO pin to drive the LCD backlight
+    @abstract   Sets the pin to control the backlight.
+    @discussion Sets the pin in the device to control the backlight. This device
+    doesn't support dimming backlight capability.
     
-    @param      none
+    @param      0: backlight off, 1..255: backlight on.
     */
-   void noBacklight();
+   void setBacklightPin ( uint8_t value );
    
    /*!
     @function
-    @abstract   Switch-on the LCD backlight.
-    @discussion Switch-on the LCD backlight, this method is not supported by
-    the I2CLCDextraIO, it needs an extra IO pin to drive the LCD backlight
+    @abstract   Switch-on/off the LCD backlight.
+    @discussion Switch-on/off the LCD backlight.
+    The setBacklightPin has to be called before setting the backlight for
+    this method to work. @see setBacklightPin.
     
-    @param      none
+    @param      mode: backlight mode (HIGH|LOW)
     */
-   void backlight();
-   
+   void setBacklight ( uint8_t mode );
    
 private:
    
     */
    void pulseEnable(uint8_t);
    
-   /*!
-    @method     
-    @abstract   Writes to the expansion module.
-    @discussion Writes a byte to the IO expansion module. This will be applied
-    to all its outputs.
-    */ 
-   void expanderWrite(uint8_t);
    
-   uint8_t _Addr;           // I2C Address of the IO expander
-   uint8_t _backlightval;   // Backlight shadow value
-   I2CIO   _i2cio;          // I2CIO PCF8574* expansion module driver I2CLCDextraIO
-   uint8_t _En;             // LCD expander word for enable pin
-   uint8_t _Rw;             // LCD expander word for R/W pin
-   uint8_t _Rs;             // LCD expander word for Register Select pin
-   uint8_t _data_pins[4];   // LCD data lines
+   uint8_t _Addr;             // I2C Address of the IO expander
+   uint8_t _backlightPinMask; // Backlight IO pin mask
+   uint8_t _backlightStsMask; // Backlight status mask
+   I2CIO   _i2cio;            // I2CIO PCF8574* expansion module driver I2CLCDextraIO
+   uint8_t _En;               // LCD expander word for enable pin
+   uint8_t _Rw;               // LCD expander word for R/W pin
+   uint8_t _Rs;               // LCD expander word for Register Select pin
+   uint8_t _data_pins[4];     // LCD data lines
    
 };
 

LiquidCrystal_SR.cpp

 //             on the "official" LiquidCrystal library.
 //
 //
-// This library is only compatible with Arduino's SDK version 1.0
-//
-//
 // @author F. Malpartida - fmalpartida@gmail.com
 // ---------------------------------------------------------------------------
 #include <stdio.h>
 // CONSTRUCTORS
 // ---------------------------------------------------------------------------
 // Assuming 1 line 8 pixel high font
-LiquidCrystal_SR::LiquidCrystal_SR ( uint8_t srdata, uint8_t srclock, 
-                                     uint8_t enable ) 
+LiquidCrystal_SR::LiquidCrystal_SR (uint8_t srdata, uint8_t srclock, 
+                                    uint8_t enable ) 
 {
 	init ( srdata, srclock, enable, 1, 0 );
 }
 
 //
 // init
-void LiquidCrystal_SR::init(uint8_t srdata, uint8_t srclock, uint8_t enable, uint8_t lines, uint8_t font)
+void LiquidCrystal_SR::init(uint8_t srdata, uint8_t srclock, uint8_t enable, 
+                            uint8_t lines, uint8_t font)
 {
    // Initialise private variables
    _two_wire = 0;
-
+   
    _srDataRegister = fio_pinToOutputRegister(srdata);
    _srDataBit = fio_pinToBit(srdata);
    _srClockRegister = fio_pinToOutputRegister(srclock);
    _srClockBit = fio_pinToBit(srclock);
-
+   
    if (enable == TWO_WIRE)
    {
       _two_wire = 1;
       _srEnableRegister = fio_pinToOutputRegister(enable);
       _srEnableBit = fio_pinToBit(enable);
    }
-
+   
    // Configure control pins as outputs
    // ------------------------------------------------------------------------
-
+   
    _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x10DOTS;
 }
 
+//
 // shiftIt
 void LiquidCrystal_SR::shiftIt(uint8_t val)
 {
       fio_shiftOut(_srDataRegister, _srDataBit, _srClockRegister, _srClockBit);
    }
    fio_shiftOut(_srDataRegister, _srDataBit, _srClockRegister, _srClockBit, val, MSBFIRST);
-
+   
    // LCD ENABLE PULSE
    //
    // While this library is written with a shift register without an output
    // latch. The shiftregister latch pin (STR, RCL or similar) is then
    // connected to the LCD enable pin. The LCD is (very likely) slower
    // to read the Enable pulse, and then reads the new contents of the SR.
-
-   fio_digitalWrite_HIGH(_srEnableRegister, _srEnableBit);
-   waitUsec(1);                 // enable pulse must be >450ns
-   fio_digitalWrite_SWITCHTO(_srEnableRegister, _srEnableBit, LOW);
-   waitUsec(40);                // commands need > 37us to settle
+   ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+   {
+      fio_digitalWrite_HIGH(_srEnableRegister, _srEnableBit);
+      waitUsec (1);         // enable pulse must be >450ns               
+      fio_digitalWrite_SWITCHTO(_srEnableRegister, _srEnableBit, LOW);
+   } // end critical section
+   waitUsec ( 37 );      // commands need > 37us to settle
 }
 
 // PUBLIC METHODS
 
 
 /************ low level data pushing commands **********/
-
+//
 // send
 void LiquidCrystal_SR::send(uint8_t value, uint8_t mode)
 {
    shiftIt(mode | SR_EN_BIT | ((value >> 1) & 0x78)); // upper nibble
    shiftIt(mode | SR_EN_BIT | ((value << 3) & 0x78)); // lower nibble
 }
+
+//
+// setBacklightPin
+void LiquidCrystal_SR::setBacklightPin ( uint8_t pin )
+{ }
+
+//
+// setBacklight
+void LiquidCrystal_SR::setBacklight ( uint8_t mode ) 
+{ }
+

LiquidCrystal_SR.h

 //             on the "official" LiquidCrystal library.
 //
 //
-// This library is only compatible with Arduino's SDK version 1.0
-//
 //
 // @author F. Malpartida - fmalpartida@gmail.com
 // ---------------------------------------------------------------------------
    virtual void send(uint8_t value, uint8_t mode);
    
    
+   /*!
+    @function
+    @abstract   Sets the pin to control the backlight.
+    @discussion Sets the pin in the device to control the backlight.
+    
+    @param      mode: backlight mode (HIGH|LOW)
+    */
+   void setBacklightPin ( uint8_t pin );
+   
+   /*!
+    @function
+    @abstract   Switch-on/off the LCD backlight.
+    @discussion Switch-on/off the LCD backlight.
+    The setBacklightPin has to be called before setting the backlight for
+    this method to work. @see setBacklightPin.
+    
+    @param      mode: backlight mode (HIGH|LOW)
+    */
+   void setBacklight ( uint8_t mode );
+   
 private:
    
    /*!
     * @abstract takes care of shifting and the enable pulse
     */
    void shiftIt (uint8_t val);
-
+   
    uint8_t _enable_pin;  // Enable Pin
    uint8_t _two_wire;    // two wire mode
-
+   
    fio_register _srDataRegister; // Serial Data pin
    fio_bit _srDataBit;
    fio_register _srClockRegister; // Clock Pin
    fio_bit _srClockBit;
    fio_register _srEnableRegister; // Enable Pin
    fio_bit _srEnableBit;
-
+   
 };
 
 #endif

LiquidCrystal_SR_LCD3.cpp

 // Extendable: Yes
 //
 // @file LiquidCrystal_SR_LCD3.h
+//
 //  Connects an LCD using 3 pins from the Arduino, via an 8-bit 
 //  ShiftRegister (SR from now on).
+//  The original port source for this module is https://github.com/marcmerlin/NewLiquidCrystal
+//  The 'FastIO' merge has madethis code 4 times faster.
 // 
 // @brief 
 // This is a port of the ShiftRegLCD library from raron and ported to the
 // Shiftregister connection description:
 // MC14094 input:  Arduino digital pin 2=Clock, pin 3=Data, pin 4=Strobe
 // MC14094 output: Q8=DB4, Q7=DB5, Q6=DB6, Q5=DB7, Q4=E, Q3=RW, Q2=RS, Q1=None
-// http://www.ee.mut.ac.th/datasheet/MC14094.pdf
 //
 //   +--------------------------------------------+
 //   |    Arduino (ATMega 168 or 328)             |
 // - The pinout used here is same saner (the 4 bits for the LCD are all in one 
 //   nibble of the shift register, not spread across 2 like in the
 //   LiquidCrystal_SR pinout)
+//
+// Note however that LiquidCrystal_SR while a bit more complex wiring and code
+// wise, supports non latching shift registers and it a few percent faster than
+// this code since it can address the LCD enable pin without having to send 
+// a pulse through the shift register like the LCD3Wires setup requires.
 //  
 // This code makes sure to properly follow the specifications when talking
 // to the LCD while using minimal delays (it's faster than the LCD3wire and aiko
 // ---------------------------------------------------------------------------
 // Assuming 1 line 8 pixel high font
 LiquidCrystal_SR_LCD3::LiquidCrystal_SR_LCD3 ( uint8_t srdata, uint8_t srclock, 
-                                               uint8_t strobe )
+                                              uint8_t strobe )
 {
 	init ( srdata, srclock, strobe, 1, 0 );
 }
 //
 // init
 void LiquidCrystal_SR_LCD3::init( uint8_t srdata, uint8_t srclock, uint8_t strobe, 
-                                  uint8_t lines, uint8_t font )
+                                 uint8_t lines, uint8_t font )
 {
 	// Initialise private variables
 	// translate all pins to bits and registers
 	// pinMode to OUTPUT, Output LOW
-
+   
    _srdata_bit = fio_pinToBit(srdata);
    _srdata_register = fio_pinToOutputRegister(srdata);
    _srclock_bit = fio_pinToBit(srclock);
    
    // Little trick to force a pulse of the LCD enable bit and make sure it is
    // low before we start further writes since this is assumed.
-
+   
    write4bits(0);
    
    _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x10DOTS;
    fio_shiftOut(_srdata_register, _srdata_bit, _srclock_register, _srclock_bit, nibble, LSBFIRST);
    
    // Make new data active.
-   fio_digitalWrite_HIGH(_strobe_register, _strobe_bit);
-   waitUsec( 1 ); // strobe pulse must be >450ns (old code had 10ms)
-   fio_digitalWrite_SWITCHTO(_strobe_register, _strobe_bit,LOW);
+   ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+   {
+      fio_digitalWrite_HIGH(_strobe_register, _strobe_bit);
+      waitUsec( 1 ); // strobe pulse must be >450ns (old code had 10ms)
+      fio_digitalWrite_SWITCHTO(_strobe_register, _strobe_bit,LOW);
+   }
    waitUsec( 40 ); // commands need > 37us to settle
 }

LiquidCrystal_SR_LCD3.h

 // Copyright 2011 - Under creative commons license 3.0:
 //        Attribution-ShareAlike CC BY-SA
 //
-// This module is by Marc MERLIN <marc_soft<at>merlins.org>
+// This module is a port by Marc MERLIN <marc_soft<at>merlins.org>
 // See .cpp file for hardware details.
 // ---------------------------------------------------------------------------
 #ifndef _LIQUIDCRYSTAL_SR_LCD3_
     */
    void write4bits ( uint8_t );
    void _pushOut ( uint8_t );
-
+   
    // Serial Data pin
    fio_bit _srdata_bit;
    fio_register _srdata_register;
-
+   
    // Clock Pin
    fio_bit _srclock_bit;
    fio_register _srclock_register;

docs/html/_fast_i_o_8cpp.html

+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>LCD Library: /Users/fmalpartida/development/ardWorkspace/LiquidCrystal_I2C/LiquiCrystal_I2C/FastIO.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<!-- Generated by Doxygen 1.7.4 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div id="top">
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logoGoogle.jpg"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">LCD Library&#160;<span id="projectnumber">1.2.0</span></div>
+   <div id="projectbrief">LCD Library - LCD control class hierarchy library. Drop in replacement for the LiquidCrystal Library.</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&#160;List</span></a></li>
+      <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">/Users/fmalpartida/development/ardWorkspace/LiquidCrystal_I2C/LiquiCrystal_I2C/FastIO.cpp File Reference</div>  </div>
+</div>
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="_fast_i_o_8h_source.html">FastIO.h</a>&quot;</code><br/>
+</div>
+<p><a href="_fast_i_o_8cpp_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="_fast_i_o_8cpp.html#a83fc2fdc19ab3f9aade9e1a2f39e81a6">fio_digitalRead</a> (<a class="el" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a> pinRegister, uint8_t pinBit)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="_fast_i_o_8cpp.html#a19962d1b3fc351693779f633a36105a8">fio_digitalWrite</a> (<a class="el" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a> pinRegister, uint8_t pinBit, uint8_t value)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="_fast_i_o_8cpp.html#abe64155b836ffa8a137eb17d17995f84">fio_pinToBit</a> (uint8_t pin)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="_fast_i_o_8cpp.html#afb934fc0ded94cbb5ed8ed14e2a123ed">fio_pinToInputRegister</a> (uint8_t pin)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="_fast_i_o_8cpp.html#a04210cc785c3b4a11c86f794949c327f">fio_pinToOutputRegister</a> (uint8_t pin, uint8_t initial_state)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="_fast_i_o_8cpp.html#a8869ccb957fe8d64b1dc55fdd7fe342b">fio_shiftOut</a> (<a class="el" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a> dataRegister, uint8_t dataBit, <a class="el" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a> clockRegister, uint8_t clockBit)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="_fast_i_o_8cpp.html#a56c72b9f00680662229895ab22aaa743">fio_shiftOut</a> (<a class="el" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a> dataRegister, <a class="el" href="_fast_i_o_8h.html#a0a595a88b29bcfd1540b6fac75787937">fio_bit</a> dataBit, <a class="el" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a> clockRegister, <a class="el" href="_fast_i_o_8h.html#a0a595a88b29bcfd1540b6fac75787937">fio_bit</a> clockBit, uint8_t value, uint8_t bitOrder)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="_fast_i_o_8cpp.html#a7ac8b242e7e3cacf175e481889e047dd">fio_shiftOut1</a> (uint8_t pin, uint8_t value, boolean noLatch)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="_fast_i_o_8cpp.html#a5b4d1684030dc620938b7c2fbdf5ced8">fio_shiftOut1</a> (<a class="el" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a> shift1Register, <a class="el" href="_fast_i_o_8h.html#a0a595a88b29bcfd1540b6fac75787937">fio_bit</a> shift1Bit, uint8_t value, boolean noLatch)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="_fast_i_o_8cpp.html#a2d0e4495eb12504255bbd3f82405b17b">fio_shiftOut1_init</a> (<a class="el" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a> shift1Register, <a class="el" href="_fast_i_o_8h.html#a0a595a88b29bcfd1540b6fac75787937">fio_bit</a> shift1Bit)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="_fast_i_o_8cpp.html#ae4b2e099f8ade9ee674d1565669e870a">fio_shiftOut1_init</a> (uint8_t pin)</td></tr>
+</table>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="a83fc2fdc19ab3f9aade9e1a2f39e81a6"></a><!-- doxytag: member="FastIO.cpp::fio_digitalRead" ref="a83fc2fdc19ab3f9aade9e1a2f39e81a6" args="(fio_register pinRegister, uint8_t pinBit)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int fio_digitalRead </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a>&#160;</td>
+          <td class="paramname"><em>pinRegister</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="_fast_i_o_8h.html#a0a595a88b29bcfd1540b6fac75787937">fio_bit</a>&#160;</td>
+          <td class="paramname"><em>pinBit</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>direct digital read  without any checks  falls back to normal digitalRead if fast io is disabled </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pinRegister[in]</td><td>Register - ignored if fast io is disabled </td></tr>
+    <tr><td class="paramname">pinBit[in]</td><td>Bit - Pin if fast io is disabled </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>Value read from pin </dd></dl>
+
+<p>Definition at line <a class="el" href="_fast_i_o_8cpp_source.html#l00087">87</a> of file <a class="el" href="_fast_i_o_8cpp_source.html">FastIO.cpp</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a19962d1b3fc351693779f633a36105a8"></a><!-- doxytag: member="FastIO.cpp::fio_digitalWrite" ref="a19962d1b3fc351693779f633a36105a8" args="(fio_register pinRegister, uint8_t pinBit, uint8_t value)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void fio_digitalWrite </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a>&#160;</td>
+          <td class="paramname"><em>pinRegister</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="_fast_i_o_8h.html#a0a595a88b29bcfd1540b6fac75787937">fio_bit</a>&#160;</td>
+          <td class="paramname"><em>pinBit</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">uint8_t&#160;</td>
+          <td class="paramname"><em>value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>direct digital write  without any checks  falls back to normal digitalWrite if fast io is disabled </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pinRegister[in]</td><td>Register - ignored if fast digital write is disabled </td></tr>
+    <tr><td class="paramname">pinBit[in]</td><td>Bit - Pin if fast digital write is disabled </td></tr>
+    <tr><td class="paramname">value[in]</td><td>desired output </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="_fast_i_o_8cpp_source.html#l00071">71</a> of file <a class="el" href="_fast_i_o_8cpp_source.html">FastIO.cpp</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abe64155b836ffa8a137eb17d17995f84"></a><!-- doxytag: member="FastIO.cpp::fio_pinToBit" ref="abe64155b836ffa8a137eb17d17995f84" args="(uint8_t pin)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">uint8_t fio_pinToBit </td>
+          <td>(</td>
+          <td class="paramtype">uint8_t&#160;</td>
+          <td class="paramname"><em>pin</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Find the bit which belongs to specified pin  if fast digitalWrite is disabled this function returns the pin </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pin[in]</td><td>Number of a digital pin </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>Bit </dd></dl>
+
+<p>Definition at line <a class="el" href="_fast_i_o_8cpp_source.html#l00061">61</a> of file <a class="el" href="_fast_i_o_8cpp_source.html">FastIO.cpp</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afb934fc0ded94cbb5ed8ed14e2a123ed"></a><!-- doxytag: member="FastIO.cpp::fio_pinToInputRegister" ref="afb934fc0ded94cbb5ed8ed14e2a123ed" args="(uint8_t pin)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a> fio_pinToInputRegister </td>
+          <td>(</td>
+          <td class="paramtype">uint8_t&#160;</td>
+          <td class="paramname"><em>pin</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Get the input register for specified pin.  if fast digital IO is disabled this function returns NULL </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pin[in]</td><td>Number of a digital pin </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>Register </dd></dl>
+
+<p>Definition at line <a class="el" href="_fast_i_o_8cpp_source.html#l00049">49</a> of file <a class="el" href="_fast_i_o_8cpp_source.html">FastIO.cpp</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a04210cc785c3b4a11c86f794949c327f"></a><!-- doxytag: member="FastIO.cpp::fio_pinToOutputRegister" ref="a04210cc785c3b4a11c86f794949c327f" args="(uint8_t pin, uint8_t initial_state)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a> fio_pinToOutputRegister </td>
+          <td>(</td>
+          <td class="paramtype">uint8_t&#160;</td>
+          <td class="paramname"><em>pin</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">uint8_t&#160;</td>
+          <td class="paramname"><em>initial_state</em> = <code>LOW</code>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Get the output register for specified pin.  if fast digital IO is disabled this function returns NULL </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pin[in]</td><td>Number of a digital pin </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>Register </dd></dl>
+
+<p>Definition at line <a class="el" href="_fast_i_o_8cpp_source.html#l00033">33</a> of file <a class="el" href="_fast_i_o_8cpp_source.html">FastIO.cpp</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8869ccb957fe8d64b1dc55fdd7fe342b"></a><!-- doxytag: member="FastIO.cpp::fio_shiftOut" ref="a8869ccb957fe8d64b1dc55fdd7fe342b" args="(fio_register dataRegister, uint8_t dataBit, fio_register clockRegister, uint8_t clockBit)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void fio_shiftOut </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a>&#160;</td>
+          <td class="paramname"><em>dataRegister</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="_fast_i_o_8h.html#a0a595a88b29bcfd1540b6fac75787937">fio_bit</a>&#160;</td>
+          <td class="paramname"><em>dataBit</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a>&#160;</td>
+          <td class="paramname"><em>clockRegister</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="_fast_i_o_8h.html#a0a595a88b29bcfd1540b6fac75787937">fio_bit</a>&#160;</td>
+          <td class="paramname"><em>clockBit</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>faster shift out clear  using fast digital write  falls back to normal digitalWrite if fastio is disabled </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table class="params">
+    <tr><td class="paramname">dataRegister[in]</td><td>Register of data pin - ignored if fast digital write is disabled </td></tr>
+    <tr><td class="paramname">dataBit[in]</td><td>Bit of data pin - Pin if fast digital write is disabled </td></tr>
+    <tr><td class="paramname">clockRegister[in]</td><td>Register of data pin - ignored if fast digital write is disabled </td></tr>
+    <tr><td class="paramname">clockBit[in]</td><td>Bit of data pin - Pin if fast digital write is disabled </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="_fast_i_o_8cpp_source.html#l00126">126</a> of file <a class="el" href="_fast_i_o_8cpp_source.html">FastIO.cpp</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a56c72b9f00680662229895ab22aaa743"></a><!-- doxytag: member="FastIO.cpp::fio_shiftOut" ref="a56c72b9f00680662229895ab22aaa743" args="(fio_register dataRegister, fio_bit dataBit, fio_register clockRegister, fio_bit clockBit, uint8_t value, uint8_t bitOrder)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void fio_shiftOut </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a>&#160;</td>
+          <td class="paramname"><em>dataRegister</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="_fast_i_o_8h.html#a0a595a88b29bcfd1540b6fac75787937">fio_bit</a>&#160;</td>
+          <td class="paramname"><em>dataBit</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a>&#160;</td>
+          <td class="paramname"><em>clockRegister</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="_fast_i_o_8h.html#a0a595a88b29bcfd1540b6fac75787937">fio_bit</a>&#160;</td>
+          <td class="paramname"><em>clockBit</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">uint8_t&#160;</td>
+          <td class="paramname"><em>value</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">uint8_t&#160;</td>
+          <td class="paramname"><em>bitOrder</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>faster shift out  using fast digital write  falls back to normal digitalWrite if fastio is disabled </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table class="params">
+    <tr><td class="paramname">dataRegister[in]</td><td>Register of data pin - ignored if fast digital write is disabled </td></tr>
+    <tr><td class="paramname">dataBit[in]</td><td>Bit of data pin - Pin if fast digital write is disabled </td></tr>
+    <tr><td class="paramname">clockRegister[in]</td><td>Register of data pin - ignored if fast digital write is disabled </td></tr>
+    <tr><td class="paramname">clockBit[in]</td><td>Bit of data pin - Pin if fast digital write is disabled </td></tr>
+    <tr><td class="paramname">bitOrder[in]</td><td>bit order </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="_fast_i_o_8cpp_source.html#l00100">100</a> of file <a class="el" href="_fast_i_o_8cpp_source.html">FastIO.cpp</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7ac8b242e7e3cacf175e481889e047dd"></a><!-- doxytag: member="FastIO.cpp::fio_shiftOut1" ref="a7ac8b242e7e3cacf175e481889e047dd" args="(uint8_t pin, uint8_t value, boolean noLatch)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void fio_shiftOut1 </td>
+          <td>(</td>
+          <td class="paramtype">uint8_t&#160;</td>
+          <td class="paramname"><em>pin</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">uint8_t&#160;</td>
+          <td class="paramname"><em>value</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">boolean&#160;</td>
+          <td class="paramname"><em>noLatch</em> = <code>false</code>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>one wire shift out  protocol needs initialisation (fio_shiftOut1_init) </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pin[in]</td><td>digital pin </td></tr>
+    <tr><td class="paramname">value[in]</td><td>value to shift out, last byte is ignored and always shifted out LOW </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="_fast_i_o_8cpp_source.html#l00214">214</a> of file <a class="el" href="_fast_i_o_8cpp_source.html">FastIO.cpp</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5b4d1684030dc620938b7c2fbdf5ced8"></a><!-- doxytag: member="FastIO.cpp::fio_shiftOut1" ref="a5b4d1684030dc620938b7c2fbdf5ced8" args="(fio_register shift1Register, fio_bit shift1Bit, uint8_t value, boolean noLatch)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void fio_shiftOut1 </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a>&#160;</td>
+          <td class="paramname"><em>shift1Register</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="_fast_i_o_8h.html#a0a595a88b29bcfd1540b6fac75787937">fio_bit</a>&#160;</td>
+          <td class="paramname"><em>shift1Bit</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">uint8_t&#160;</td>
+          <td class="paramname"><em>value</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">boolean&#160;</td>
+          <td class="paramname"><em>noLatch</em> = <code>false</code>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>one wire shift out  protocol needs initialisation (fio_shiftOut1_init) </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table class="params">
+    <tr><td class="paramname">shift1Register[in]</td><td>pins register </td></tr>
+    <tr><td class="paramname">shift1Bit[in]</td><td>pins bit </td></tr>
+    <tr><td class="paramname">value[in]</td><td>value to shift out, last byte is ignored and always shifted out LOW </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="_fast_i_o_8cpp_source.html#l00149">149</a> of file <a class="el" href="_fast_i_o_8cpp_source.html">FastIO.cpp</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2d0e4495eb12504255bbd3f82405b17b"></a><!-- doxytag: member="FastIO.cpp::fio_shiftOut1_init" ref="a2d0e4495eb12504255bbd3f82405b17b" args="(fio_register shift1Register, fio_bit shift1Bit)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void fio_shiftOut1_init </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a>&#160;</td>
+          <td class="paramname"><em>shift1Register</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="_fast_i_o_8h.html#a0a595a88b29bcfd1540b6fac75787937">fio_bit</a>&#160;</td>
+          <td class="paramname"><em>shift1Bit</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>initializes one wire shift out protocol  Puts pin to HIGH state and delays until Capacitors are charged. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table class="params">
+    <tr><td class="paramname">shift1Register[in]</td><td>pins register </td></tr>
+    <tr><td class="paramname">shift1Bit[in]</td><td>pins bit </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="_fast_i_o_8cpp_source.html#l00142">142</a> of file <a class="el" href="_fast_i_o_8cpp_source.html">FastIO.cpp</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae4b2e099f8ade9ee674d1565669e870a"></a><!-- doxytag: member="FastIO.cpp::fio_shiftOut1_init" ref="ae4b2e099f8ade9ee674d1565669e870a" args="(uint8_t pin)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void fio_shiftOut1_init </td>
+          <td>(</td>
+          <td class="paramtype">uint8_t&#160;</td>
+          <td class="paramname"><em>pin</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>initializes one wire shift out protocol  Puts pin to HIGH state and delays until Capacitors are charged. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pin[in]</td><td>digital pin </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="_fast_i_o_8cpp_source.html#l00137">137</a> of file <a class="el" href="_fast_i_o_8cpp_source.html">FastIO.cpp</a>.</p>
+
+</div>
+</div>
+</div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Defines</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Feb 28 2012 19:52:02 for LCD Library by&#160;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
+</body>
+</html>

docs/html/_fast_i_o_8cpp_source.html

+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>LCD Library: /Users/fmalpartida/development/ardWorkspace/LiquidCrystal_I2C/LiquiCrystal_I2C/FastIO.cpp Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<!-- Generated by Doxygen 1.7.4 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div id="top">
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logoGoogle.jpg"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">LCD Library&#160;<span id="projectnumber">1.2.0</span></div>
+   <div id="projectbrief">LCD Library - LCD control class hierarchy library. Drop in replacement for the LiquidCrystal Library.</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&#160;List</span></a></li>
+      <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<div class="title">/Users/fmalpartida/development/ardWorkspace/LiquidCrystal_I2C/LiquiCrystal_I2C/FastIO.cpp</div>  </div>
+</div>
+<div class="contents">
+<a href="_fast_i_o_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// ---------------------------------------------------------------------------</span>
+<a name="l00002"></a>00002 <span class="comment">// Created by Florian Fida on 20/01/12</span>
+<a name="l00003"></a>00003 <span class="comment">// Copyright 2012 - Under creative commons license 3.0:</span>
+<a name="l00004"></a>00004 <span class="comment">//        Attribution-ShareAlike CC BY-SA</span>
+<a name="l00005"></a>00005 <span class="comment">//        http://creativecommons.org/licenses/by-sa/3.0/</span>
+<a name="l00006"></a>00006 <span class="comment">//</span>
+<a name="l00007"></a>00007 <span class="comment">// This software is furnished &quot;as is&quot;, without technical support, and with no</span>
+<a name="l00008"></a>00008 <span class="comment">// warranty, express or implied, as to its usefulness for any purpose.</span>
+<a name="l00009"></a>00009 <span class="comment">// ---------------------------------------------------------------------------</span>
+<a name="l00010"></a>00010 <span class="comment">// fio_shiftOut1 functions are based on Shif1 protocol developed by Roman Black </span>
+<a name="l00011"></a>00011 <span class="comment">// (http://www.romanblack.com/shift1.htm)</span>
+<a name="l00012"></a>00012 <span class="comment">//</span>
+<a name="l00013"></a>00013 <span class="comment">// Thread Safe: No</span>
+<a name="l00014"></a>00014 <span class="comment">// Extendable: Yes</span>
+<a name="l00015"></a>00015 <span class="comment">//</span>
+<a name="l00016"></a>00016 <span class="comment">// @file FastIO.h</span>
+<a name="l00017"></a>00017 <span class="comment">// This file implements basic fast IO routines.</span>
+<a name="l00018"></a>00018 <span class="comment">// </span>
+<a name="l00019"></a>00019 <span class="comment">// @brief </span>
+<a name="l00020"></a>00020 <span class="comment">//</span>
+<a name="l00021"></a>00021 <span class="comment">// @version API 1.0.0</span>
+<a name="l00022"></a>00022 <span class="comment">//</span>
+<a name="l00023"></a>00023 <span class="comment">// @author Florian Fida -</span>
+<a name="l00024"></a>00024 <span class="comment">//</span>
+<a name="l00025"></a>00025 <span class="comment">// @todo:</span>
+<a name="l00026"></a>00026 <span class="comment">//  support chipkit:</span>
+<a name="l00027"></a>00027 <span class="comment">// (https://github.com/chipKIT32/chipKIT32-MAX/blob/master/hardware/pic32/</span>
+<a name="l00028"></a>00028 <span class="comment">//   cores/pic32/wiring_digital.c)</span>
+<a name="l00029"></a>00029 <span class="comment">// ---------------------------------------------------------------------------</span>
+<a name="l00030"></a>00030 
+<a name="l00031"></a>00031 <span class="preprocessor">#include &quot;<a class="code" href="_fast_i_o_8h.html">FastIO.h</a>&quot;</span>
+<a name="l00032"></a>00032 
+<a name="l00033"></a><a class="code" href="_fast_i_o_8h.html#a385ae40d960c1a57e86818332476a802">00033</a> <a class="code" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a> <a class="code" href="_fast_i_o_8cpp.html#a04210cc785c3b4a11c86f794949c327f">fio_pinToOutputRegister</a>(uint8_t pin, uint8_t initial_state)
+<a name="l00034"></a>00034 {
+<a name="l00035"></a>00035         pinMode(pin, OUTPUT);
+<a name="l00036"></a>00036    
+<a name="l00037"></a>00037         <span class="keywordflow">if</span>(initial_state != <a class="code" href="_fast_i_o_8h.html#a688a4adbb87520a2b68681bd6bfb199e">SKIP</a>) 
+<a name="l00038"></a>00038    {
+<a name="l00039"></a>00039       digitalWrite(pin, initial_state); <span class="comment">// also turns off pwm timer</span>
+<a name="l00040"></a>00040    }
+<a name="l00041"></a>00041 <span class="preprocessor">#ifdef FIO_FALLBACK</span>
+<a name="l00042"></a>00042 <span class="preprocessor"></span>        <span class="comment">//  just wasting memory if not using fast io...</span>
+<a name="l00043"></a>00043         <span class="keywordflow">return</span> 0;
+<a name="l00044"></a>00044 <span class="preprocessor">#else</span>
+<a name="l00045"></a>00045 <span class="preprocessor"></span>        <span class="keywordflow">return</span> portOutputRegister(digitalPinToPort(pin));
+<a name="l00046"></a>00046 <span class="preprocessor">#endif</span>
+<a name="l00047"></a>00047 <span class="preprocessor"></span>}
+<a name="l00048"></a>00048 
+<a name="l00049"></a><a class="code" href="_fast_i_o_8h.html#afb934fc0ded94cbb5ed8ed14e2a123ed">00049</a> <a class="code" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a> <a class="code" href="_fast_i_o_8cpp.html#afb934fc0ded94cbb5ed8ed14e2a123ed">fio_pinToInputRegister</a>(uint8_t pin)
+<a name="l00050"></a>00050 {
+<a name="l00051"></a>00051         pinMode(pin, INPUT);
+<a name="l00052"></a>00052         digitalWrite(pin, LOW); <span class="comment">// also turns off pwm timer and pullup</span>
+<a name="l00053"></a>00053 <span class="preprocessor">#ifdef FIO_FALLBACK</span>
+<a name="l00054"></a>00054 <span class="preprocessor"></span>        <span class="comment">//  just wasting memory if not using fast io...</span>
+<a name="l00055"></a>00055         <span class="keywordflow">return</span> 0;
+<a name="l00056"></a>00056 <span class="preprocessor">#else</span>
+<a name="l00057"></a>00057 <span class="preprocessor"></span>        <span class="keywordflow">return</span> portInputRegister(digitalPinToPort(pin));
+<a name="l00058"></a>00058 <span class="preprocessor">#endif</span>
+<a name="l00059"></a>00059 <span class="preprocessor"></span>}
+<a name="l00060"></a>00060 
+<a name="l00061"></a><a class="code" href="_fast_i_o_8h.html#a07a19dfbdca1afaca5d666bdaa3be7d5">00061</a> uint8_t <a class="code" href="_fast_i_o_8cpp.html#abe64155b836ffa8a137eb17d17995f84">fio_pinToBit</a>(uint8_t pin)
+<a name="l00062"></a>00062 {
+<a name="l00063"></a>00063 <span class="preprocessor">#ifdef FIO_FALLBACK</span>
+<a name="l00064"></a>00064 <span class="preprocessor"></span>        <span class="comment">// (ab)use the bit variable to store the pin</span>
+<a name="l00065"></a>00065         <span class="keywordflow">return</span> pin;
+<a name="l00066"></a>00066 <span class="preprocessor">#else</span>
+<a name="l00067"></a>00067 <span class="preprocessor"></span>        <span class="keywordflow">return</span> digitalPinToBitMask(pin);
+<a name="l00068"></a>00068 <span class="preprocessor">#endif</span>
+<a name="l00069"></a>00069 <span class="preprocessor"></span>}
+<a name="l00070"></a>00070 
+<a name="l00071"></a><a class="code" href="_fast_i_o_8h.html#ae91bbe682b02a5842c291055c0e998b5">00071</a> <span class="keywordtype">void</span> <a class="code" href="_fast_i_o_8cpp.html#a19962d1b3fc351693779f633a36105a8">fio_digitalWrite</a>(<a class="code" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a> pinRegister, uint8_t pinBit, uint8_t value) 
+<a name="l00072"></a>00072 {
+<a name="l00073"></a>00073 <span class="preprocessor">#ifdef FIO_FALLBACK</span>
+<a name="l00074"></a>00074 <span class="preprocessor"></span>        digitalWrite(pinBit, value);
+<a name="l00075"></a>00075 <span class="preprocessor">#else</span>
+<a name="l00076"></a>00076 <span class="preprocessor"></span>        <span class="keywordflow">if</span>(value == LOW)
+<a name="l00077"></a>00077    {
+<a name="l00078"></a>00078                 <a class="code" href="_fast_i_o_8h.html#ac8f00a1bccb98109531b88fbb6e91478">fio_digitalWrite_LOW</a>(pinRegister,pinBit);
+<a name="l00079"></a>00079         }
+<a name="l00080"></a>00080    <span class="keywordflow">else</span>
+<a name="l00081"></a>00081    {
+<a name="l00082"></a>00082                 <a class="code" href="_fast_i_o_8h.html#a89e1c62276052100c62b6c82a2e95622">fio_digitalWrite_HIGH</a>(pinRegister,pinBit);
+<a name="l00083"></a>00083         }
+<a name="l00084"></a>00084 <span class="preprocessor">#endif</span>
+<a name="l00085"></a>00085 <span class="preprocessor"></span>}
+<a name="l00086"></a>00086 
+<a name="l00087"></a><a class="code" href="_fast_i_o_8h.html#a197336e47e1c3f929056ce3abbbc7e8d">00087</a> <span class="keywordtype">int</span> <a class="code" href="_fast_i_o_8cpp.html#a83fc2fdc19ab3f9aade9e1a2f39e81a6">fio_digitalRead</a>(<a class="code" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a> pinRegister, uint8_t pinBit)
+<a name="l00088"></a>00088 {
+<a name="l00089"></a>00089 <span class="preprocessor">#ifdef FIO_FALLBACK</span>
+<a name="l00090"></a>00090 <span class="preprocessor"></span>        <span class="keywordflow">return</span> digitalRead (pinBit);
+<a name="l00091"></a>00091 <span class="preprocessor">#else</span>
+<a name="l00092"></a>00092 <span class="preprocessor"></span>        <span class="keywordflow">if</span> (*pinRegister &amp; pinBit)
+<a name="l00093"></a>00093    {
+<a name="l00094"></a>00094       <span class="keywordflow">return</span> HIGH;
+<a name="l00095"></a>00095    }
+<a name="l00096"></a>00096         <span class="keywordflow">return</span> LOW;
+<a name="l00097"></a>00097 <span class="preprocessor">#endif</span>
+<a name="l00098"></a>00098 <span class="preprocessor"></span>}
+<a name="l00099"></a>00099 
+<a name="l00100"></a><a class="code" href="_fast_i_o_8h.html#a56c72b9f00680662229895ab22aaa743">00100</a> <span class="keywordtype">void</span> <a class="code" href="_fast_i_o_8cpp.html#a56c72b9f00680662229895ab22aaa743">fio_shiftOut</a> ( <a class="code" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a> dataRegister, <a class="code" href="_fast_i_o_8h.html#a0a595a88b29bcfd1540b6fac75787937">fio_bit</a> dataBit, <a class="code" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a> clockRegister, 
+<a name="l00101"></a>00101                     <a class="code" href="_fast_i_o_8h.html#a0a595a88b29bcfd1540b6fac75787937">fio_bit</a> clockBit, uint8_t value, uint8_t bitOrder)
+<a name="l00102"></a>00102 {
+<a name="l00103"></a>00103         <span class="comment">// # disable interrupts</span>
+<a name="l00104"></a>00104         <span class="comment">// uint8_t oldSREG = SREG;</span>
+<a name="l00105"></a>00105         <span class="comment">// cli();</span>
+<a name="l00106"></a>00106         int8_t i;
+<a name="l00107"></a>00107 
+<a name="l00108"></a>00108         <span class="keywordflow">for</span>(i = 0; i &lt; 8; i++)
+<a name="l00109"></a>00109    {
+<a name="l00110"></a>00110                 <span class="keywordflow">if</span> (bitOrder == LSBFIRST)
+<a name="l00111"></a>00111       {
+<a name="l00112"></a>00112                         <a class="code" href="_fast_i_o_8cpp.html#a19962d1b3fc351693779f633a36105a8">fio_digitalWrite</a>(dataRegister, dataBit, !!(value &amp; (1 &lt;&lt; i)));
+<a name="l00113"></a>00113                 }
+<a name="l00114"></a>00114       <span class="keywordflow">else</span>
+<a name="l00115"></a>00115       {
+<a name="l00116"></a>00116                         <a class="code" href="_fast_i_o_8cpp.html#a19962d1b3fc351693779f633a36105a8">fio_digitalWrite</a>(dataRegister, dataBit, !!(value &amp; (1 &lt;&lt; (7 - i))));
+<a name="l00117"></a>00117                 }
+<a name="l00118"></a>00118                 <a class="code" href="_fast_i_o_8h.html#a89e1c62276052100c62b6c82a2e95622">fio_digitalWrite_HIGH</a> (clockRegister, clockBit);
+<a name="l00119"></a>00119                 <span class="comment">// Switching is a little bit faster</span>
+<a name="l00120"></a>00120                 <a class="code" href="_fast_i_o_8h.html#a6d1dffed7f0c8f28f6c88146315f7832">fio_digitalWrite_SWITCH</a> (clockRegister,clockBit);
+<a name="l00121"></a>00121         }
+<a name="l00122"></a>00122         <span class="comment">// # enable interrupts</span>
+<a name="l00123"></a>00123         <span class="comment">// SREG = oldSREG;</span>
+<a name="l00124"></a>00124 }
+<a name="l00125"></a>00125 
+<a name="l00126"></a><a class="code" href="_fast_i_o_8h.html#a5d8d5977294d614d15bda19f75d6b787">00126</a> <span class="keywordtype">void</span> <a class="code" href="_fast_i_o_8cpp.html#a56c72b9f00680662229895ab22aaa743">fio_shiftOut</a>(<a class="code" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a> dataRegister, uint8_t dataBit, <a class="code" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a> clockRegister, uint8_t clockBit)
+<a name="l00127"></a>00127 {
+<a name="l00128"></a>00128         <span class="comment">// shift out 0x0 (B00000000) fast, byte order is irrelevant</span>
+<a name="l00129"></a>00129         <a class="code" href="_fast_i_o_8h.html#ac8f00a1bccb98109531b88fbb6e91478">fio_digitalWrite_LOW</a> (dataRegister, dataBit);