Commits

F Malpartida committed 1cf625c Merge

Release 1.2.0 merged to default branch.

Comments (0)

Files changed (93)

 82f18d4b8ebca14c59e0f8fc2fef075abb9a5d50 V 1.1.6
 981e5559fab2205d613d3c192a322e16f9a20fb2 V 1.1.7
 df4563d57b5cb8a6f534564f10a5d65935d8ef71 V 1.1.7
-7631ac7cc81ea943964ba671fefcbdc9f2765e4d V 1.1.7.1
+2ec4883f118bb66655dbb4012df70df0a4f75b9b V 1.0.7_RC1
+e1485608a8fcda9e6d3a52380e558005283e2619 V 1.2.0_RC1
+2ec4883f118bb66655dbb4012df70df0a4f75b9b V 1.2.0_RC1
 66821a8054ea8dfacdad6c19397dbf93f6bd7fa5 V 1.0.2_RC1
-0000000000000000000000000000000000000000 V 1.0.2_RC1
-2ec4883f118bb66655dbb4012df70df0a4f75b9b V 1.0.7_RC1
-0000000000000000000000000000000000000000 V 1.0.7_RC1
-0000000000000000000000000000000000000000 V 1.2.0_RC1
-27d0969ed231f95419c6b3a16969db8c87d7338c V 1.2.0_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
 // This software is furnished "as is", without technical support, and with no
 // warranty, express or implied, as to its usefulness for any purpose.
 // ---------------------------------------------------------------------------
-// fio_shiftOut1 functions are based on Shif1 protocol developed by Roman Black (http://www.romanblack.com/shift1.htm)
+// fio_shiftOut1 functions are based on Shif1 protocol developed by Roman Black 
+// (http://www.romanblack.com/shift1.htm)
 //
-// TODO:
-//  support chipkit (https://github.com/chipKIT32/chipKIT32-MAX/blob/master/hardware/pic32/cores/pic32/wiring_digital.c)
-// maybe improve fio_digitalRead
+// Thread Safe: No
+// Extendable: Yes
+//
+// @file FastIO.h
+// This file implements basic fast IO routines.
+// 
+// @brief 
+//
+// @version API 1.0.0
+//
+// @author Florian Fida -
+//
+// @todo:
+//  support chipkit:
+// (https://github.com/chipKIT32/chipKIT32-MAX/blob/master/hardware/pic32/
+//   cores/pic32/wiring_digital.c)
+// ---------------------------------------------------------------------------
 
-#include <FastIO.h>
+#include "FastIO.h"
 
-fio_register fio_pinToOutputRegister(uint8_t pin, uint8_t initial_state){
+fio_register fio_pinToOutputRegister(uint8_t pin, uint8_t initial_state)
+{
 	pinMode(pin, OUTPUT);
-	if(initial_state != SKIP) digitalWrite(pin, initial_state); // also turns off pwm timer
+   
+	if(initial_state != SKIP) 
+   {
+      digitalWrite(pin, initial_state); // also turns off pwm timer
+   }
 #ifdef FIO_FALLBACK
 	//  just wasting memory if not using fast io...
 	return 0;
 #endif
 }
 
-fio_register fio_pinToInputRegister(uint8_t pin){
+fio_register fio_pinToInputRegister(uint8_t pin)
+{
 	pinMode(pin, INPUT);
 	digitalWrite(pin, LOW); // also turns off pwm timer and pullup
 #ifdef FIO_FALLBACK
 #endif
 }
 
-uint8_t fio_pinToBit(uint8_t pin){
+uint8_t fio_pinToBit(uint8_t pin)
+{
 #ifdef FIO_FALLBACK
 	// (ab)use the bit variable to store the pin
 	return pin;
 #endif
 }
 
-void fio_digitalWrite(fio_register pinRegister, uint8_t pinBit, uint8_t value) {
+void fio_digitalWrite(fio_register pinRegister, uint8_t pinBit, uint8_t value) 
+{
 #ifdef FIO_FALLBACK
 	digitalWrite(pinBit, value);
 #else
-	if(value == LOW){
+	if(value == LOW)
+   {
 		fio_digitalWrite_LOW(pinRegister,pinBit);
-	}else{
+	}
+   else
+   {
 		fio_digitalWrite_HIGH(pinRegister,pinBit);
 	}
 #endif
 }
 
-int fio_digitalRead(fio_register pinRegister, uint8_t pinBit){
+int fio_digitalRead(fio_register pinRegister, uint8_t pinBit)
+{
 #ifdef FIO_FALLBACK
-	return digitalRead(pinBit);
+	return digitalRead (pinBit);
 #else
-	if (*pinRegister & pinBit) return HIGH;
+	if (*pinRegister & pinBit)
+   {
+      return HIGH;
+   }
 	return LOW;
 #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++){
-		if (bitOrder == LSBFIRST){
+	for(i = 0; i < 8; i++)
+   {
+		if (bitOrder == LSBFIRST)
+      {
 			fio_digitalWrite(dataRegister, dataBit, !!(value & (1 << i)));
-		}else{
+		}
+      else
+      {
 			fio_digitalWrite(dataRegister, dataBit, !!(value & (1 << (7 - i))));
 		}
-		fio_digitalWrite_HIGH(clockRegister, clockBit);
+		fio_digitalWrite_HIGH (clockRegister, clockBit);
 		// Switching is a little bit faster
-		fio_digitalWrite_SWITCH(clockRegister,clockBit);
+		fio_digitalWrite_SWITCH (clockRegister,clockBit);
 	}
-
 	// # enable interrupts
 	// SREG = oldSREG;
 }
 
-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);
-	for(uint8_t i = 0; i<8; ++i){
-		fio_digitalWrite_HIGH(clockRegister, clockBit);
-		fio_digitalWrite_SWITCH(clockRegister,clockBit);
+	fio_digitalWrite_LOW (dataRegister, dataBit);
+
+	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){
+void fio_shiftOut1_init(uint8_t pin)
+{
 	fio_shiftOut1_init(fio_pinToOutputRegister(pin,HIGH),fio_pinToBit(pin));
 }
-void fio_shiftOut1_init(fio_register shift1Register, fio_bit shift1Bit){
+
+void fio_shiftOut1_init(fio_register shift1Register, fio_bit shift1Bit)
+{
 	// Make sure that capacitors are charged
 	// 300us is an educated guess...
 	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)
+{
 	/*
 	 * this function are based on Shif1 protocol developed by Roman Black (http://www.romanblack.com/shift1.htm)
 	 *
 	 * 	http://pastebin.com/raw.php?i=2hnC9v2Z
 	 * 	http://pastebin.com/raw.php?i=bGg4DhXQ
 	 * 	http://pastebin.com/raw.php?i=tg1ZFiM5
-	 *  http://pastebin.com/raw.php?i=93ExPDD3 - cascading
+	 *    http://pastebin.com/raw.php?i=93ExPDD3 - cascading
 	 * tested with:
-	 * 	TPIC6595N - seems to work fine (circuit: http://www.3guys1laser.com/arduino-one-wire-shift-register-prototype)
+	 * 	TPIC6595N - seems to work fine (circuit: http://www.3guys1laser.com/
+    *                   arduino-one-wire-shift-register-prototype)
 	 * 	7HC595N
 	 */
 	// disable interrupts since timing is going to be critical
 	cli();
 
 	// iterate but ignore last bit (is it correct now?)
-	for(int8_t i = 7; i>=0; --i){
+	for(int8_t i = 7; i>=0; --i)
+   {
 
 		// assume that pin is HIGH (smokin' pot all day... :) - requires initialization
-		if(LOW==!!(value & (1 << i))){
+		if(LOW==!!(value & (1 << i)))
+      {
 			// LOW = 0 Bit
 			fio_digitalWrite_SWITCHTO(shift1Register,shift1Bit,LOW);
 			// hold pin LOW for 15us
 			fio_digitalWrite_SWITCHTO(shift1Register,shift1Bit,HIGH);
 			// hold pin HIGH for 30us
 			delayMicroseconds(30);
-		}else{
+		}
+      else
+      {
 			// HIGH = 1 Bit
 			fio_digitalWrite_SWITCHTO(shift1Register,shift1Bit,LOW);
 			//hold pin LOW for 1us - done! :)
 			//hold pin HIGH for 15us
 			delayMicroseconds(15);
 		}
-		if(!noLatch && i==1) break;
+		if(!noLatch && i==1)
+      {
+         break;
+      }
 	}
-	if(!noLatch){
+   
+	if(!noLatch)
+   {
 		// send last bit (=LOW) and Latch command
 		fio_digitalWrite_SWITCHTO(shift1Register,shift1Bit,LOW);
 		// Hold pin low for 200us
 	SREG = oldSREG;
 
 }
-void fio_shiftOut1(uint8_t pin, uint8_t value, boolean noLatch){
+void fio_shiftOut1(uint8_t pin, uint8_t value, boolean noLatch)
+{
 	fio_shiftOut1(fio_pinToOutputRegister(pin, SKIP),fio_pinToBit(pin),value, noLatch);
 }
 // This software is furnished "as is", without technical support, and with no
 // warranty, express or implied, as to its usefulness for any purpose.
 // ---------------------------------------------------------------------------
-// fio_shiftOut1 functions are based on Shif1 protocol developed by Roman Black (http://www.romanblack.com/shift1.htm)
+// fio_shiftOut1 functions are based on Shif1 protocol developed by Roman Black 
+// (http://www.romanblack.com/shift1.htm)
 //
-// TODO:
-//  support chipkit (https://github.com/chipKIT32/chipKIT32-MAX/blob/master/hardware/pic32/cores/pic32/wiring_digital.c)
-
+// Thread Safe: No
+// Extendable: Yes
+//
+// @file FastIO.h
+// This file implements basic fast IO routines.
+// 
+// @brief 
+//
+// @version API 1.0.0
+//
+// @author Florian Fida -
+//
+// @todo:
+//  support chipkit:
+// (https://github.com/chipKIT32/chipKIT32-MAX/blob/master/hardware/pic32/
+//   cores/pic32/wiring_digital.c)
+// ---------------------------------------------------------------------------
 #ifndef FAST_IO_H
 #define FAST_IO_H
 
 #include <inttypes.h>
 #include <util/delay.h>
 
+/*!
+ @defined 
+ @abstract   Enables IO digitalRead/digitalWrite fall back for non-AVR
+             architectures.
+ */
 #ifndef __AVR__
 #define FIO_FALLBACK
 #endif
 
-typedef uint8_t fio_bit;
+// PUBLIC CONSTANTS DEFINITIONS
+// ---------------------------------------------------------------------------
+/*!
+ @defined 
+ @abstract   Skip setting IO outputs during IO configuration or when getting
+             the output register associated to an IO pin.k
+ */
 #define SKIP 0x23
 
-#ifndef FALLBACK
+// PUBLIC TYPE DEFINITIONS
+// ---------------------------------------------------------------------------
+typedef uint8_t fio_bit;
+
+
+#ifndef FIO_FALLBACK
 typedef volatile uint8_t * fio_register;
 #else
 // remove volatile to give optimizer a chance
  @param value[in] desired output
  */
 // __attribute__ ((always_inline)) /* let the optimizer decide that for now */
-void fio_digitalWrite(fio_register pinRegister, fio_bit pinBit,uint8_t value);
+void fio_digitalWrite ( fio_register pinRegister, fio_bit pinBit, uint8_t value );
 
 /**
  * This is where the magic happens that makes things fast.
  @param pinBit[in] Bit - Pin if fast io is disabled
  @result Value read from pin
  */
-int fio_digitalRead(fio_register pinRegister, fio_bit pinBit);
+int fio_digitalRead ( fio_register pinRegister, fio_bit pinBit );
 
 /*!
  @method
  @param clockBit[in] Bit of data pin - Pin if fast digital write is disabled
  @param bitOrder[in] bit order
  */
-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 );
 
 /*!
  @method
 // 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
 //
 #endif
 
 #include <inttypes.h>
-#include <../Wire/Wire.h>
+#include "../Wire/Wire.h"
 
 #include "I2CIO.h"
 
 // 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
 // Thread Safe: No
 // Extendable: Yes
 //
-// @file HD44780.h
+// @file LCD.cpp
 // This file implements a basic liquid crystal library that comes as standard
 // in the Arduino SDK.
 // 
 // This is a basic implementation of the HD44780 library of the
 // Arduino SDK. This library is a refactored version of the one supplied
 // in the Arduino SDK in such a way that it simplifies its extension
-// to support other mechanism to communicate to LCDs such as I2C, Serial.
+// to support other mechanism to communicate to LCDs such as I2C, Serial, SR, ...
 // The original library has been reworked in such a way that this will be
 // the base class implementing all generic methods to command an LCD based
 // on the Hitachi HD44780 and compatible chipsets.
    // before sending commands. Arduino can turn on way before 4.5V so we'll wait 
    // 50
    // ---------------------------------------------------------------------------
-   delayMicroseconds(50000); 
+   delayMicroseconds(100000); 
       
    //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);
    }
 }
 
 // Thread Safe: No
 // Extendable: Yes
 //
-// @file LiquidCrystal.h
+// @file LCD.h
 // This file implements a basic liquid crystal library that comes as standard
 // in the Arduino SDK.
 // 
 // This is a basic implementation of the LiquidCrystal library of the
 // Arduino SDK. This library is a refactored version of the one supplied
 // in the Arduino SDK in such a way that it simplifies its extension
-// to support other mechanism to communicate to LCDs such as I2C, Serial.
+// to support other mechanism to communicate to LCDs such as I2C, Serial, SR, 
 // The original library has been reworked in such a way that this will be
 // the base class implementing all generic methods to command an LCD based
 // on the Hitachi HD44780 and compatible chipsets.
 // 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.1.0
 //
 //
 #include <inttypes.h>
 #include <Print.h>
 
+
 /*!
  @defined 
  @abstract   Enables disables fast waits for write operations for LCD
 #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 
     @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   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. 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 setBacklight ( uint8_t mode ) { };
+   
+   /*!
+    @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 pin ) { };
+   
    /*!
     @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>
 #else
 #include <Arduino.h>
 #endif
-#include "LiquidCrystal.h"
+#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
+}
+
+//
+// setBackligh
+void LiquidCrystal::setBacklight ( uint8_t mode )
+{
+   if ( _backlightPin != LCD_NOBACKLIGHT )
+   {
+      digitalWrite ( _backlightPin, mode );
+   }
+}
+
+//
+// setBacklightPin
+void LiquidCrystal::setBacklightPin ( uint8_t pin )
+{
+   pinMode ( pin, OUTPUT ); // Difine the backlight pin as output
+   _backlightPin = pin;
+}
+
 // 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();
 }
+
+
 // 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_4bit_h
     */
    virtual void send(uint8_t value, uint8_t mode);
    
+   /*!
+    @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 );
+   
+   /*!
+    @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 );
+   
    
 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;
+   _backlightPin  = 0x0;
+   _backlightMask = 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;
+   _backlightPin  = 0;
+   _backlightMask = LCD_NOBACKLIGHT;
+   
    _En = ( 1 << En );
    _Rw = ( 1 << Rw );
    _Rs = ( 1 << Rs );
 {
    _Addr = lcd_Addr;
    
-   _backlightval = LCD_NOBACKLIGHT;
+   _backlightPin  = 0;
+   _backlightMask = 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
+//
+// setBacklight
+void LiquidCrystal_I2C::setBacklight( uint8_t mode ) 
+{
+   if ( mode == HIGH )
+   {
+      _backlightMask = _backlightPin & LCD_BACKLIGHT;
+      
+   }
+   else 
+   {
+      _backlightMask = _backlightPin & LCD_NOBACKLIGHT;
+   }
+   _i2cio.write( _backlightMask );
+}
+
+//
+// setBacklightPin
+void LiquidCrystal_I2C::setBacklightPin ( uint8_t pin )
+{
+   _backlightPin = ( 1 << pin );
+}
+
 // 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 | _backlightMask;
+   _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   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 noBacklight();
+   void setBacklight ( uint8_t mode );
    
    /*!
     @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   Sets the pin to control the backlight.
+    @discussion Sets the pin in the device to control the backlight.
     
-    @param      none
+    @param      mode: backlight mode (HIGH|LOW)
     */
-   void backlight();
+   void setBacklightPin ( uint8_t pin );
    
    
 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 _backlightPin;     // Backlight IO pin
+   uint8_t _backlightMask;    // 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

 //
 //
 // History
-// 2012.01.16  flo - faster digitalWrite/shiftOut
+// 2012.01.16  Florian Fida - faster digitalWrite/shiftOut
 // 2011.10.29  fmalpartida - adaption of the library to the LCD class hierarchy.
 // 2011.07.02  Fixed a minor flaw in setCursor function. No functional change, 
 //             just a bit more memory efficient.
 //             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>
 #else
 #include <Arduino.h>
 #endif
-#include <LiquidCrystal_SR.h>
+#include "LiquidCrystal_SR.h"
 
 #include "FastIO.h"
 
 
 //
 // 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;
+   _two_wire = 0;
 
    _srDataRegister = fio_pinToOutputRegister(srdata);
    _srDataBit = fio_pinToBit(srdata);
 
    if (enable == TWO_WIRE)
    {
-      _two_wire   = 1;
+      _two_wire = 1;
       _srEnableRegister = _srDataRegister;
       _srEnableBit = _srDataBit;
    }
    _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x10DOTS;
 }
 
-// PUBLIC METHODS
-// ---------------------------------------------------------------------------
+// shiftIt
+void LiquidCrystal_SR::shiftIt(uint8_t val)
+{
+   if (_two_wire)
+   {
+      // Clear to get Enable LOW
+      fio_shiftOut(_srDataRegister, _srDataBit, _srClockRegister, _srClockBit);
+   }
+   fio_shiftOut(_srDataRegister, _srDataBit, _srClockRegister, _srClockBit, val, MSBFIRST);
 
-
-/************ low level data pushing commands **********/
-
-// send
-void LiquidCrystal_SR::send(uint8_t value, uint8_t mode) 
-{
-   uint8_t val1, val2;
-   
-   // If _two_wire - clear the shiftregister first.
-   // ----------------------------------------------
-   if ( _two_wire ) 
-   {
-	   // clear fast
-	   fio_shiftOut(_srDataRegister, _srDataBit, _srClockRegister, _srClockBit);
-   }
-   
-   // Divide byte in two nibbles (val1 and val2), include the RS signal
-   // and format it for shiftregister output wiring to the LCD
-   mode = mode ? SR_RS_BIT : 0; // RS bit; LOW: command.  HIGH: character.
-   val1 = mode | SR_EN_BIT | ((value >> 1) & 0x78); // upper nibble
-   val2 = mode | SR_EN_BIT | ((value << 3) & 0x78); // lower nibble
-   
-   fio_shiftOut(_srDataRegister, _srDataBit, _srClockRegister, _srClockBit, val1, MSBFIRST);
-   
    // LCD ENABLE PULSE
    //
    // While this library is written with a shift register without an output
    // 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 (1);         // enable pulse must be >450ns               
+   fio_digitalWrite_SWITCHTO(_srEnableRegister, _srEnableBit, LOW);
+   waitUsec ( 37 );      // commands need > 37us to settle
+}
 
-   // clear shiftregister
-   // ---------------------------
-   if ( _two_wire ) 
-   {
-	   // Clear fast
-	   fio_shiftOut(_srDataRegister, _srDataBit, _srClockRegister, _srClockBit);
-   }
-   fio_shiftOut(_srDataRegister, _srDataBit, _srClockRegister, _srClockBit, val2, MSBFIRST);
-   
-   // LCD ENABLE PULSE, se above comment
-   fio_digitalWrite_SWITCHTO(_srEnableRegister, _srEnableBit,HIGH);
-   waitUsec( 1 );                 // enable pulse must be >450ns
-   fio_digitalWrite_SWITCHTO(_srEnableRegister, _srEnableBit,LOW);
-   waitUsec( 40 );                // commands need > 37us to settle
+// PUBLIC METHODS
+// ---------------------------------------------------------------------------
+
+
+/************ low level data pushing commands **********/
+
+// send
+void LiquidCrystal_SR::send(uint8_t value, uint8_t mode)
+{
+   // Divide byte in two nibbles include the RS signal
+   // and format it for shiftregister output wiring to the LCD
+   mode = mode ? SR_RS_BIT : 0; // RS bit; LOW: command.  HIGH: character.
+   shiftIt(mode | SR_EN_BIT | ((value >> 1) & 0x78)); // upper nibble
+   shiftIt(mode | SR_EN_BIT | ((value << 3) & 0x78)); // lower nibble
 }
 
 //
-// write4bits
-void LiquidCrystal_SR::write4bits(uint8_t value) 
-{
-   uint8_t val1;
-   
-   // clear shiftregister
-   // --------------------------
-   if ( _two_wire ) 
-   {
-	   // clear fast
-	   fio_shiftOut(_srDataRegister, _srDataBit, _srClockRegister, _srClockBit);
-   }
-   fio_digitalWrite(_srEnableRegister, _srEnableBit, LOW);
+// setBacklight
+void LiquidCrystal_SR::setBacklight ( uint8_t mode ) 
+{ }
 
-   // Discard lower nibble
-   // and format it for shiftregister output wiring to the LCD
-   val1 = SR_EN_BIT | ((value >> 1) & 0x78);
-   fio_shiftOut(_srDataRegister, _srDataBit, _srClockRegister, _srClockBit, val1, MSBFIRST);
 
-   // LCD ENABLE PULSE
-   //
-   // While this library is written with a shift register without an output
-   // latch in mind, it can work in 3-wire mode with a shiftregister with a
-   // 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(_srEnableRegister, _srEnableBit, HIGH);
-
-   waitUsec( 1 );                 // enable pulse must be >450ns
-   fio_digitalWrite(_srEnableRegister, _srEnableBit, LOW);
-   
-   waitUsec( 40 );               // commands need > 37us to settle
-}
+void LiquidCrystal_SR::setBacklightPin ( uint8_t pin )
+{ }

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   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 );
+   
+   /*!
+    @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 );
+   
+   
    
 private:
    
     */
    void init ( uint8_t srdata, uint8_t srclock, uint8_t enable, uint8_t lines, 
               uint8_t font );
+   
    /*!
-    @method     
-    @abstract   For sending data when initializing the display to 4-bit
-    @discussion Initializes the LCD pin allocation and configuration.
+    * @method
+    * @abstract takes care of shifting and the enable pulse
     */
-   void write4bits ( uint8_t );
-   
-   uint8_t _srdata_pin;  // Serial Data pin
-   uint8_t _srclock_pin; // Clock Pin
+   void shiftIt (uint8_t val);
+
    uint8_t _enable_pin;  // Enable Pin
    uint8_t _two_wire;    // two wire mode
 

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

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_

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>