ON 20100413@6:01:43 PM at page: On a web page you were interested in at: http://www.piclist.com/techref/member/IMB-yahoo-J86/index.htm#40281.7511805556 Isaac Marino Bavaresco[IMB-yahoo-J86] See also: /techref/member/IMB-yahoo-J86/HD44780-tty.htm ON 20100413@6:02:38 PM at page: On a web page you were interested in at: http://www.piclist.com/techref/member/IMB-yahoo-J86/HD44780-tty.htm#40281.7518171296 Isaac Marino Bavaresco[IMB-yahoo-J86] Code: /techref/member/IMB-yahoo-J86/lcd.c.htm




ON 20100413@6:03:15 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/HD44780-tty.htm#40281.7522453704
Isaac Marino Bavaresco[IMB-yahoo-J86] Code:
/techref/member/IMB-yahoo-J86/lcd.h.htm




ON 20100413@6:04:33 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/lcd.c.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcd.c.htm&version=0



ON 20100413@6:05:20 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/lcd.c.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcd.c.htm&version=1



ON 20100413@6:12:10 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/lcd.h.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcd.h.htm&version=0



ON 20100413@7:00:09 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/lcd.c.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcd.c.htm&version=2



ON 20100413@7:02:44 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/lcd.h.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcd.h.htm&version=1



ON 20100413@7:03:49 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/lcd.c.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcd.c.htm&version=3



ON 20100413@7:12:12 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/HD44780-tty.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\HD44780-tty.htm&version=2



ON 20100413@7:13:36 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/HD44780-tty.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\HD44780-tty.htm&version=3



ON 20100414@8:58:19 AM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/lcd.c.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcd.c.htm&version=4



ON 20100414@10:47:48 AM at page:
On a web page you were interested in at:
http://techref.massmind.org/techref/member/IMB-yahoo-J86/HD44780-tty.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://techref.massmind.org/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\HD44780-tty.htm&version=4



ON 20100414@10:53:59 AM at page:
On a web page you were interested in at:
http://techref.massmind.org/techref/member/IMB-yahoo-J86/HD44780-tty.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://techref.massmind.org/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\HD44780-tty.htm&version=5



ON 20100414@1:36:09 PM at page:
On a web page you were interested in at:
http://techref.massmind.org/techref/member/IMB-yahoo-J86/malloc.c.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://techref.massmind.org/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\malloc.c.htm&version=0



ON 20100414@1:37:56 PM at page:
On a web page you were interested in at:
http://techref.massmind.org/techref/member/IMB-yahoo-J86/malloc.c.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://techref.massmind.org/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\malloc.c.htm&version=1



ON 20100414@1:39:24 PM at page:
On a web page you were interested in at:
http://techref.massmind.org/techref/member/IMB-yahoo-J86/malloc.c.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://techref.massmind.org/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\malloc.c.htm&version=2



ON 20100414@2:52:06 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/free.c.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\free.c.htm&version=0



ON 20100414@2:53:06 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/heap.h.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\heap.h.htm&version=0



ON 20100414@2:54:30 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/__freelist.c.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\__freelist.c.htm&version=0



ON 20100414@2:55:12 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/__heap.c.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\__heap.c.htm&version=0



ON 20100414@2:56:14 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/__reclaim_stack.c.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\__reclaim_stack.c.htm&version=0



ON 20100414@2:57:15 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/main.c.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\main.c.htm&version=0



ON 20100414@2:58:03 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/malloc.asm.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\malloc.asm.htm&version=0



ON 20100414@2:59:05 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/free.asm.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\free.asm.htm&version=0



ON 20100414@3:12:21 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/memcpy.asm.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\memcpy.asm.htm&version=0



ON 20100414@3:16:20 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/SimpleRTOS.c.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\SimpleRTOS.c.htm&version=0



ON 20100414@3:17:54 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/TestMain.c.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\TestMain.c.htm&version=0



ON 20100414@3:19:29 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/TestTasks.c.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\TestTasks.c.htm&version=0



ON 20100414@3:58:23 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/HD44780-tty.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\HD44780-tty.htm&version=6



ON 20100415@4:39:13 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/index.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\index.htm&version=1



ON 20100415@4:40:01 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/index.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\index.htm&version=2



ON 20100419@12:10:07 PM at page:
On a web page you were interested in at:
http://techref.massmind.org/techref/member/IMB-yahoo-J86/HD44780-tty.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://techref.massmind.org/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\HD44780-tty.htm&version=7



ON 20100419@12:11:39 PM at page:
On a web page you were interested in at:
http://techref.massmind.org/techref/member/IMB-yahoo-J86/lcd.h.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://techref.massmind.org/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcd.h.htm&version=2



ON 20100419@12:12:34 PM at page:
On a web page you were interested in at:
http://techref.massmind.org/techref/member/IMB-yahoo-J86/lcd.h.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://techref.massmind.org/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcd.h.htm&version=3



ON 20100419@12:13:17 PM at page:
On a web page you were interested in at:
http://techref.massmind.org/techref/member/IMB-yahoo-J86/lcd.c.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://techref.massmind.org/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcd.c.htm&version=5



ON 20100419@12:14:34 PM at page:
On a web page you were interested in at:
http://techref.massmind.org/techref/member/IMB-yahoo-J86/lcd.c.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://techref.massmind.org/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcd.c.htm&version=6



ON 20100419@12:17:31 PM at page:
On a web page you were interested in at:
http://techref.massmind.org/techref/member/IMB-yahoo-J86/lcd.h.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://techref.massmind.org/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcd.h.htm&version=4



ON 20100419@12:18:03 PM at page:
On a web page you were interested in at:
http://techref.massmind.org/techref/member/IMB-yahoo-J86/lcd.c.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://techref.massmind.org/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcd.c.htm&version=7



ON 20100424@9:41:44 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/HD44780-tty.htm#
Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference:
http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\HD44780-tty.htm&version=8



ON 20100424@9:44:03 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/HD44780-tty.htm#40292.9055787037
Isaac Marino Bavaresco[IMB-yahoo-J86] Code:
/techref/member/IMB-yahoo-J86/lcdcfg-lite.h.htm




ON 20100424@9:44:29 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/lcdcfg-lite.h.htm#40292.9058912037
Isaac Marino Bavaresco[IMB-yahoo-J86] Says

//==============================================================================
// Copyright (c) 2005-2010, Isaac Marino Bavaresco
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//     * Redistributions of source code must retain the above copyright
//       notice, this list of conditions and the following disclaimer.
//     * Neither the name of the author nor the
//       names of its contributors may be used to endorse or promote products
//       derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//==============================================================================
// isaacbavaresco@yahoo.com.br
//==============================================================================
// Set TAB width to 4 characters
//==============================================================================
#if         !defined __LCD_CFG_H__
#define     __LCD_CFG_H__
//==============================================================================

//##############################################################################
//#                                                                            #
//#                   THIS FILE IS HEAVILY HARDWARE-DEPENDANT                  #
//#                                                                            #
//#          IT MUST BE CHANGED TO FIT YOUR BOARD'S CIRCUIT AND CLOCK          #
//#                                                                            #
//##############################################################################

// This version is taylored for my board at 8MHz and Hi-Tech PICC.
// Change this file for your own needs.

//==============================================================================
//
//                           PIC16F648A
//
//              +-----------------U-----------------+
//              |                                   |
// LCD_DI <-  ==|  1 RA2/AN2/Vref        AN1/RA1 18 |==  -> LCD_D4
//              |                                   |
//  LCD_E <-  ==|  2 RA3/AN3/CMP1        AN0/RA0 15 |==  -> LCD_D5
//              |                                   |
//  PWRON <-  ==|  3 RA4/T0CKI/CMP2     OSC1/RA7 16 |==  -> LCD_D6
//              |                                   |
//  RIGHT  -> ==|  4 RA5/!MCLR          OSC2/RA6 15 |==  -> LCD_D7
//              |                                   |
//            ==|  5 GND                     VCC 14 |==
//              |                                   |
//        <-  ==|  6 RB0/INT           T1OSI/RB7 13 |== <-  UP
//              |                                   |
//    RXD  -> ==|  7 RB1/RX/DT   T1CKI/T1OSO/RB6 12 |== <-  DOWN
//              |                                   |
//    TXD <-  ==|  8 RB2/TX/CK               RB5 11 |==  ->
//              |                                   |
//   LEFT  -> ==|  9 RB3/CCP1                RB4 10 |==  ->
//              |                                   |
//              +-----------------------------------+
//
//
//==============================================================================

#include <pic.h>

//==============================================================================

// Define this macro if your board uses the LCD R/!W pin.

//#define   USE_READ_PIN

// Define this macro if you want to detect when the LCD is not connected or is
// damaged. Works only if using the R/!W pin.

//#define   DETECT_FAILURE

// Number of repetitions before signailng a defective display.

//#define   NUMBER_OF_READS_TIMEOUT     2000

// Define this macro if your board uses four bit interface.

#define USE_FOUR_BIT_INTERFACE

//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================

// Helper macros. Depend on your board.

#define DATAPORT_OUT    PORTA
#define DATAPORT_IN     PORTA
#define DATAPORT_DIR    TRISA

#define LCD_D4          RA1
#define LCD_D5          RA0
#define LCD_D6          RA7
#define LCD_D7          RA6

#define LCD_E           RA3
#define LCD_E_DIR       TRISA3

#if         defined USE_READ_PIN

#define LCD_RW          RB6
#define LCD_RW_DIR      TRISB6

#endif  //  defined USE_READ_PIN

#define LCD_DI          RA2
#define LCD_DI_DIR      TRISA2

//==============================================================================

// These macros depend on the model of your LCD module.

// The size your screen will have at startup.

#define INITIAL_MAXX    16
#define INITIAL_MAXY     2

// The maximum size your screen may have. Larger sizes will use more RAM if your
// board doesn't use the R/!W pin, because a screen-buffer is kept in RAM to
// allow scroll operations.

#define MAXIMUM_MAXX    16
#define MAXIMUM_MAXY     2

// The usual is 8, but 4 is more useful for such a narrow display.

#define TAB_WIDTH        4

//==============================================================================

// Interrupt-related macros
// If you don't need to disable interrupts, just define them all as empty macros

// The macro 'DeclareIntSaveVar' must declare 's' with a type suitable to hold
// the CPU's current interrupts (enabled/disabled) state
#define DeclareIntSaveVar( s )      unsigned char s

// The macro 'SaveInterruptsState' must save the current interrupts state to 's'
#define SaveInterruptsState( s )    (( s ) = INTCON & 0xc0 )

// The macro 'RestoreInterruptsState' must restore the previous interrupts state
// from 's'
#define RestoreInterruptsState( s ) ( INTCON = INTCON | ( s ))

// The macro 'DisableInterrupts' must disable all interrupts that may interfere
// with the LCD interface (for instance, an interrupt that uses the LCD interface
// pins to scan a keyboard)
#define DisableInterrupts()         ( INTCON = INTCON & 0x3f )

//==============================================================================

// Data port manipulation macros

// The macro 'SetDataPortAsInputs' must set the data port bits (4 or 8,
// depending on the used mode) as inputs

#if         defined USE_READ_PIN

#define SetDataPortAsInputs()       ( DATAPORT_DIR |= 0xc3 )

#else   //  defined USE_READ_PIN

#define SetDataPortAsInputs()

#endif  //  defined USE_READ_PIN

// The macro 'SetDataPortAsOutputs' must set the data port bits (4 or 8,
// depending on the used mode) as outputs
#define SetDataPortAsOutputs()      ( DATAPORT_DIR &= 0x3c )

// In 8-bit mode, the macro 'ReadDataPortValue' must read all 8 bits of the
// data port to 's', in 4-bit mode it must read the 4 bits of the data
// port to the higher 4 bits of 's'
#define ReadDataPortValue( s )          do                                  \
                                            {                               \
                                            s    = 0;                       \
                                            if( LCD_D7 ) s  |= 0x80;        \
                                            if( LCD_D6 ) s  |= 0x40;        \
                                            if( LCD_D5 ) s  |= 0x20;        \
                                            if( LCD_D4 ) s  |= 0x10;        \
                                            }                               \
                                        while( 0 )

// In 8-bit mode, the macro 'SetDataPortValue' must output all the 8 bits of 's'
// to the data port, in 4-bit mode it must output the higher 4 bits of 's' to the
// data port
#define SetDataPortValue( s )           do                                  \
                                            {                               \
                                            char t;                         \
                                            t    = DATAPORT_OUT & 0x3c;     \
                                            if( s & 0x80 ) t    |= 0x40;    \
                                            if( s & 0x40 ) t    |= 0x80;    \
                                            if( s & 0x20 ) t    |= 0x01;    \
                                            if( s & 0x10 ) t    |= 0x02;    \
                                            DATAPORT_OUT    = t;            \
                                            }                               \
                                        while( 0 )
//( DATAPORT_OUT = DATAPORT_OUT & 0xf0 | ((( s ) >> 4 ) & 0x0f ))

// The following macros are only needed if you are using 4-bit interface

#if         defined USE_FOUR_BIT_INTERFACE

    // The macro 'ReadDataPortValueLow' must read the 4 bits of the data
    // port to the lower 4 bits of 's' without disturbing its 4 higher bits.
    #define ReadDataPortValueLow( s )   do                                  \
                                            {                               \
                                            if( LCD_D7 ) s  |= 0x08;        \
                                            if( LCD_D6 ) s  |= 0x04;        \
                                            if( LCD_D5 ) s  |= 0x02;        \
                                            if( LCD_D4 ) s  |= 0x01;        \
                                            }                               \
                                        while( 0 )

    // The macro 'SetDataPortValueLow' must output the lower 4 bits of 's' to
    // the data port.
    #define SetDataPortValueLow( s )    do                                  \
                                            {                               \
                                            char t;                         \
                                            t    = DATAPORT_OUT & 0x3c;     \
                                            if( s & 0x08 ) t    |= 0x40;    \
                                            if( s & 0x04 ) t    |= 0x80;    \
                                            if( s & 0x02 ) t    |= 0x01;    \
                                            if( s & 0x01 ) t    |= 0x02;    \
                                            DATAPORT_OUT    = t;            \
                                            }                               \
                                        while( 0 )

#endif  //  defined USE_FOUR_BIT_INTERFACE

//==============================================================================

// Control pins manipulation macros

#if         defined USE_READ_PIN

    #define SetRWAsRead()           ( LCD_RW = 1 )
    #define SetRWAsWrite()          ( LCD_RW = 0 )
    #define SetRWAsOutput()         ( LCD_RW_DIR = 0 )

#else   //  defined USE_READ_PIN

    #define SetRWAsRead()
    #define SetRWAsWrite()
    #define SetRWAsOutput()

#endif  //  defined USE_READ_PIN

#define SetDIValue( s )             ( LCD_DI = ( s ))
#define SetDIAsData()               ( LCD_DI = 1 )
#define SetDIAsInstruction()        ( LCD_DI = 0 )
#define SetDIAsOutput()             ( LCD_DI_DIR = 0 )

#define SetEAsEnabled()             ( LCD_E = 1 )
#define SetEAsDisabled()            ( LCD_E = 0 )
#define SetEAsOutput()              ( LCD_E_DIR = 0 )

//==============================================================================

void Delay_10us( unsigned short t );

// Delay macros.

#define Delay500ns()                asm( "nop" )


// This macro is defined this way (without calling a function) to save call-stack
// levels, because it is used in the deepest function of the package.

// NOTE: The last "nop" is important to prevent the optimizer to optimize the sequence.

#define Delay37us()                 do                          \
                                        {                       \
                                        asm( "movlw       9" ); \
                                        asm( "addlw      -1" ); \
                                        asm( "btfss     3,2" ); \
                                        asm( "goto      $-2" ); \
                                        asm( "nop          " ); \
                                        }                       \
                                    while( 0 )

#define Delay100us()                Delay_10us( 10 )

// This macro is defined this way (without calling a function) to save call-stack
// levels, because it is used in the deepest function of the package.

// NOTE: The last "nop" is important to prevent the optimizer to optimize the sequence.

#define Delay1520us()               do                          \
                                        {                       \
                                        asm( "movlw     254" ); \
                                        asm( "nop          " ); \
                                        asm( "nop          " ); \
                                        asm( "addlw      -1" ); \
                                        asm( "btfss     3,2" ); \
                                        asm( "goto      $-4" ); \
                                        asm( "nop          " ); \
                                        }                       \
                                    while( 0 )

#define Delay4100us()               Delay_10us( 410 )
#define Delay15ms()                 Delay_10us( 1500 )

//==============================================================================

// Macro or prototype for the function 'Beep'. Define it as an empty macro if
// your board doesn't have a buzzer or the like.

#define Beep()

//==============================================================================

// This macro defines the name that your 'putc' function must have to be linked
// with the library functions ('printf', etc).
// For MPLAB-C18 it is '_user_putc', for Hi-Tech PICC it is 'putch'.

#define LCD_PUTC                    putch

//==============================================================================
#endif  //  !defined __LCD_CFG_H__
//==============================================================================
ON 20100424@9:45:22 PM at page: On a web page you were interested in at: http://www.piclist.com/techref/member/IMB-yahoo-J86/HD44780-tty.htm#40292.9065046296 Isaac Marino Bavaresco[IMB-yahoo-J86] Code: /techref/member/IMB-yahoo-J86/lcd-lite.c.htm




ON 20100424@9:46:02 PM at page:
On a web page you were interested in at:
http://www.piclist.com/techref/member/IMB-yahoo-J86/lcd-lite.c.htm#40292.9069675926
Isaac Marino Bavaresco[IMB-yahoo-J86] Says

//==============================================================================
// Copyright (c) 2005-2010, Isaac Marino Bavaresco
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//     * Redistributions of source code must retain the above copyright
//       notice, this list of conditions and the following disclaimer.
//     * Neither the name of the author nor the
//       names of its contributors may be used to endorse or promote products
//       derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//==============================================================================
// isaacbavaresco@yahoo.com.br
//==============================================================================
// Set TAB width to 4 characters
//==============================================================================
#include "LCDcfg-lite.h"
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================

#if         defined USE_READ_PIN && defined DETECT_FAILURE

// Flag to indicate that the display is defective.
unsigned char               displayfailed   = 0;

#endif  //  defined USE_READ_PIN && defined DETECT_FAILURE

//==============================================================================
#define LCDWriteCmd(c)  LCDWrite((c),0)
#define LCDWriteData(c) LCDWrite((c),1)

#define CMD_CLEAR_DISPLAY       0x01
#define CMD_SET_DDRAM_ADDRESS   0x80
//==============================================================================
// Writes a character or command to the display.
// Arguments:
//      c       The character or command to be written
//      di      Type of write: 0 = command, 1 = character

static void LCDWrite( unsigned char c, unsigned char di )
    {
    // Variable to save the interrupts state at function entry.
    DeclareIntSaveVar( Aux );

#if         defined USE_READ_PIN
    unsigned char       s;

#if         defined DETECT_FAILURE
    unsigned short      n   = NUMBER_OF_READS_TIMEOUT;

    // The display has failed previously...
    if( displayfailed )
        // ... so we will not even try to access it
        return;
#endif  //  defined DETECT_FAILURE

#endif  //  defined USE_READ_PIN

    SaveInterruptsState( Aux );

#if         defined USE_READ_PIN

    // Repeat while bit BUSY == 1
    do
        {
        RestoreInterruptsState( Aux );

        // At this point a pending interrupt may be serviced, so we don't
        // block the system for too long. On return, no assumption is
        // made about the state of the LCD interface pins, an interrupt
        // routine may change the value or direction of any pin, except
        // of the ENABLE pin.

        DisableInterrupts();

        SetDataPortAsInputs();
        // Set READ/!WRITE pin as read (1)
        SetRWAsRead();
        // Set DATA/!INSTRUCTION pin as instruction (0)
        SetDIAsInstruction();

        // Effectivate the data transfer.
        SetEAsEnabled();
        // Wait for the minimum 'tHIGH'.
        Delay500ns();
        // Read the status byte (only high nibble if in 4-bit mode).
        ReadDataPortValue( s );
        // Low half of the trasfer cycle.
        SetEAsDisabled();
        // Wait for the minimum 'tLOW'.
        Delay500ns();

#if         defined USE_FOUR_BIT_INTERFACE

        // When using a 4-bit interface we need to do a dummy read

        // Effectivate the data transfer.
        SetEAsEnabled();
        // Wait for the minimum 'tHIGH'.
        Delay500ns();
        // Low half of the trasfer cycle.
        SetEAsDisabled();
        // Wait for the minimum 'tLOW'.
        Delay500ns();

#endif  //  defined USE_FOUR_BIT_INTERFACE

        // Set READ/!WRITE pin as write (0)
        SetRWAsWrite();
        }
#if         !defined DETECT_FAILURE

    // Repeat until the BUSY bit is zero
    while( s & 0x80 );

#else   //  !defined DETECT_FAILURE

    // Repeat until the BUSY bit is zero or until the maximum number of repetitions.
    while(( s & 0x80 ) && ( --n != 0u ));

    // We tried the maximum number of times...
    if( n == 0u )
        // ... so we flag the display as failed
        displayfailed   = 1;

#endif  //  !defined DETECT_FAILURE

#else   //  defined USE_READ_PIN

    DisableInterrupts();

#endif  //  defined USE_READ_PIN

    //--------------------------------------------------------------------------
    // Now we may send the data.
    //--------------------------------------------------------------------------

    // Set READ/!WRITE pin as write (0)
    SetRWAsWrite();
    // Set DATA/!INSTRUCTION pin as data (1).
    SetDIValue( di );
    // The data (only high nibble if in 4-bit mode) is output to the data port.
    SetDataPortValue( c );
    SetDataPortAsOutputs();
    // Effectivate the data transfer.
    SetEAsEnabled();
    // Wait for the minimum 'tHIGH'.
    Delay500ns();
    // Low half of the trasfer cycle.
    SetEAsDisabled();
    // Wait for the minimum 'tLOW'.
    Delay500ns();

#if         defined USE_FOUR_BIT_INTERFACE
    // The low nibble is output to the data port.
    SetDataPortValueLow( c );
    // Effectivate the data transfer.
    SetEAsEnabled();
    // Wait for the minimum 'tHIGH'.
    Delay500ns();
    // Low half of the trasfer cycle.
    SetEAsDisabled();
    // Wait for the minimum 'tLOW'.
    Delay500ns();
#endif  //  defined USE_FOUR_BIT_INTERFACE


    SetDataPortAsInputs();
    RestoreInterruptsState( Aux );

#if         !defined USE_READ_PIN

    // If we are not reading the busy flag, then we must wait at least for
    // the worst-case execution time before any other command ca be executed.

    // This write is a "clear screen" or a "home cursor" command...
    if( di == 0 && c <= 3 )
        // ... that takes up to 1.52ms to execute.
        Delay1520us();
    // For all other writes...
    else
        // ... the execution time is no more than 37us.
        Delay37us();

#endif  //  !defined USE_READ_PIN

    }
//==============================================================================
// Reads one data byte from the LCD.

#if         defined USE_READ_PIN
static unsigned char LCDReadData( void )
    {
    // Variable to save the interrupts state at function entry.
    DeclareIntSaveVar( Aux );
    // Variable to temporarily hold the value read.
    unsigned char       s;

#if         defined DETECT_FAILURE
    // Variable to count the number of busy flag reads before an error is signaled.
    unsigned short      n   = NUMBER_OF_READS_TIMEOUT;

    // If the display failed previously...
    if( displayfailed )
        // ... we are not using it until some routine clears the error flag.
        return 0x00;
#endif  //  defined DETECT_FAILURE

    SaveInterruptsState( Aux );

    // Repeat while busy flag == 1
    do
        {
        RestoreInterruptsState( Aux );

        // At this point a pending interrupt may be serviced, so we don't
        // block the system for too long. On return, no assumption is
        // made about the state of the LCD interface pins, an interrupt
        // routine may change the value or direction of any pin, except
        // of the ENABLE pin.

        DisableInterrupts();

        SetDataPortAsInputs();
        // Set the READ/!WRITE pin as read (1)
        SetRWAsRead();
        // Set DATA/!INSTRUCTION pin as instruction (0)
        SetDIAsInstruction();

        // Effectivate the data transfer.
        SetEAsEnabled();
        // Wait for the minimum 'tHIGH'.
        Delay500ns();
        // Read the status byte (only high nibble if in 4-bit mode).
        ReadDataPortValue( s );
        // Low half of the trasfer cycle.
        SetEAsDisabled();
        // Wait for the minimum 'tLOW'.
        Delay500ns();

#if         defined USE_FOUR_BIT_INTERFACE

        // When using a 4-bit interface we need to do a dummy read

        // Effectivate the data transfer.
        SetEAsEnabled();
        // Wait for the minimum 'tHIGH'.
        Delay500ns();
        // Low half of the trasfer cycle.
        SetEAsDisabled();
        // Wait for the minimum 'tLOW'.
        Delay500ns();

#endif  //  defined USE_FOUR_BIT_INTERFACE

        // Set READ/!WRITE pin as write (0)
        SetRWAsWrite();
        }
    // Test the LCD's BUSY flag.
#if         !defined DETECT_FAILURE
    while( s & 0x80 );
#else   //  !defined DETECT_FAILURE
    while(( s & 0x80 ) && ( --n != 0u ));

    if( n == 0u )
        displayfailed   = 1;
#endif  //  !defined DETECT_FAILURE


    //--------------------------------------------------------------------------
    // Now we can read the data.
    //--------------------------------------------------------------------------

    // Set READ/!WRITE pin as read (1)
    SetRWAsRead();
    // Set DATA/!INSTRUCTION pin as data (1).
    SetDIAsData();
    // Effectivate the data transfer.
    SetEAsEnabled();
    // Wait for the minimum 'tHIGH'.
    Delay500ns();
    // Read the data byte (only high nibble if in 4-bit mode).
    ReadDataPortValue( s );
    // Low half of the trasfer cycle.
    SetEAsDisabled();
    // Wait for the minimum 'tLOW'.
    Delay500ns();

#if         defined USE_FOUR_BIT_INTERFACE

    // Effectivate the data transfer.
    SetEAsEnabled();
    // Wait for the minimum 'tHIGH'.
    Delay500ns();
    // Read the data byte (low nibble only).
    ReadDataPortValueLow( s );
    // Low half of the trasfer cycle.
    SetEAsDisabled();
    // Wait for the minimum 'tLOW'.
    Delay500ns();

#endif  //  defined USE_FOUR_BIT_INTERFACE

    // Set READ/!WRITE pin as write (0)
    SetRWAsWrite();

    RestoreInterruptsState( Aux );

    // Return the read data.
    return s;
    }

#endif  //  defined USE_READ_PIN

//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//
//
// Hardware-independent part
//
//
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================


//==============================================================================

// Current coordinates of the cursor.
static unsigned char    cursorx         = 0,    cursory = 0;

// Number of columns and lines of the screen.
static unsigned char    maxx            = INITIAL_MAXX, maxy    = INITIAL_MAXY;

//==============================================================================
unsigned char getmaxx( void )
    {
    return maxx;
    }
//==============================================================================
unsigned char getmaxy( void )
    {
    return maxy;
    }
//==============================================================================
unsigned char getcursorx( void )
    {
    return cursorx + 1;
    }
//==============================================================================
unsigned char getcursory( void )
    {
    return cursory + 1;
    }
//==============================================================================

void clrscr( void )
    {
//  interruptstate_t    Aux;
//
//  SaveInterruptsState( Aux );
//  DisableInterrupts();

    // Locate the cursor at the top-left corner of the screen
    cursorx = 0;
    cursory = 0;
    // Send the clear screen command to the LCD controller
    LCDWriteCmd( CMD_CLEAR_DISPLAY );

//  RestoreInterruptsState( Aux );
    }

//==============================================================================

void gotoxy( unsigned char x, unsigned char y )
    {
//  interruptstate_t    Aux;
//
//  SaveInterruptsState( Aux );
//  DisableInterrupts();

    // If the coordinates are valid...
    if( x <= maxx && y <= maxy )
        {
        // If the column is different than zero...
        if( x != 0u )
            // ... change the current column to it.
            cursorx = x - 1;
        // If the line is different than zero...
        if( y != 0u )
            // ... change the current line to it.
            cursory = y - 1;

        // We need to positon the hardware cursor to the right place.
        LCDWriteCmd( CMD_SET_DDRAM_ADDRESS | (( cursory << 6 ) & 0x40 ) | ( cursorx & 0x3f ) + ( cursory & 0x02 ? maxx : 0 ));
        }

//  RestoreInterruptsState( Aux );
    }

//==============================================================================
// This routine's real name is defined in the file 'LCDcfg-lite.h'.
// The name must be chosen to allow the library routines (printf, etc.) to link
// to it.

void LCD_PUTC( char c )
    {
//  interruptstate_t    Aux;
//
//  SaveInterruptsState( Aux );
//  DisableInterrupts();

    switch( c )
        {

        //----------------------------------------------------------------------
        // '\a' = BELL

        case '\a':
            Beep();
//          RestoreInterruptsState( Aux );
            return /*0*/;

        //----------------------------------------------------------------------
        // '\b' = BACKSPACE

        case '\b':
            // The cursor is not on the first column, ...
            if( cursorx > 0u )
                // ... decrement the column.
                cursorx--;
            // The cursor is on the first column but it is not on the first line, ...
            else if( cursory > 0u )
                {
                // ... position the cursor at the end of the previous line.
                cursory--;
                cursorx = maxx - 1;
                }
            // The LCD must be updated with the correct cursor coordinates.
            LCDWriteCmd( 0x80 | (( cursory << 6 ) & 0x40 ) | ( cursorx & 0x0f ) + ( cursory & 0x02 ? maxx : 0 ));
            // ... finished.
//          RestoreInterruptsState( Aux );
            return /*0*/;

        //----------------------------------------------------------------------
        // '\f' = FORMFEED

        case '\f':
            // Clear the screen.

            // Locate the cursor at the top-left corner of the screen
            cursorx = 0;
            cursory = 0;
            // Send the clear screen command to the LCD controller
            LCDWriteCmd( CMD_CLEAR_DISPLAY );

//          RestoreInterruptsState( Aux );
            return /*0*/;
        //----------------------------------------------------------------------
        // '\n' = NEWLINE

        case '\n':
            // Return the cursor to the beginning of the line.
            cursorx = 0;
            // Fall-through to 'VTAB', to increment the line

        //----------------------------------------------------------------------
        // '\v' = VTAB

        case '\v':
            // Increment the line number.
            cursory++;
            // Outside the 'switch' we will check if a wrap-around is needed.
            break;

        //----------------------------------------------------------------------
        // '\r' = CR (carriage return)

        case '\r':
            // Return the cursor to the beginning of the line.
            cursorx = 0;
            // The LCD must be updated with the correct cursor coordinates.
            LCDWriteCmd( 0x80 | (( cursory << 6 ) & 0x40 ) | ( cursorx & 0x0f ) + ( cursory & 0x02 ? maxx : 0 ));
            // Fim
//          RestoreInterruptsState( Aux );
            return /*0*/;

        //----------------------------------------------------------------------
        // Aqui tratamos do caractere tabulação ('\t' = TAB)

        case '\t':
            {
            // We need a temporary variable.
            unsigned char   Temp;
            // Calculate the column of the next tabulation.
            Temp = ( cursorx + TAB_WIDTH ) & ~( TAB_WIDTH - 1 );
            // The cursor will be beyond the column after the last, ...
            if( Temp > maxx )
                // ... restrict the cursor to the column after the last.
                Temp = maxx;
            // Calculate how many spaces must be inserted.
            Temp    -= cursorx;
            // Advance the column to its final position.
            cursorx += Temp;
            // Print as many spaces as needed to reach the final position
            for( ; Temp; Temp-- )
                LCDWriteData( ' ' );

            // The cursor ended beyond the last column, ...
            if( cursorx >= maxx )
                {
                // ... position the cursor to the beginning of the next line.
                cursorx = 0;
                cursory++;
                // Outside the 'switch' we will check if a wrap-around is needed.
                break;
                }

            // The cursor is yet on the same line, we may return right now.
//          RestoreInterruptsState( Aux );
            return /*0*/;
            }
        //----------------------------------------------------------------------
        // Here we cope with the printable characters.

        default:
            // Print the character.
            LCDWriteData( c );
            // Increment the column.
            cursorx++;

            // The cursor ended beyond the last column, ...
            if( cursorx >= maxx )
                {
                // ... position the cursor to the beginning of the next line.
                cursorx = 0;
                cursory++;
                // Outside the 'switch' we will check if a wrap-around is needed.
                break;
                }
            // The cursor is yet on the same line, we may return right now.
//          RestoreInterruptsState( Aux );
            return /*0*/;
        }
    //--------------------------------------------------------------------------
    // The cursor is beyond the last line, ...
    if( cursory >= maxy )
        // ... position it on the last line...
        cursory = 0;

    // We must position the LCD cursor on the right place.
    LCDWriteCmd( 0x80 | (( cursory << 6 ) & 0x40 ) | ( cursorx & 0x0f ) + ( cursory & 0x02 ? maxx : 0 ));
    //--------------------------------------------------------------------------
//  RestoreInterruptsState( Aux );
    return /*0*/;
    }
//==============================================================================
/*
void LCDControlCursor( unsigned char Mode )
    {
    LCDWriteCmd(( Mode & 0x03 ) | 0x0c );
    }
//==============================================================================
void LCDDefineChar( unsigned char Char, const unsigned char *Pattern )
    {
    unsigned char c;

    LCDWriteCmd((( Char << 3 ) & 0x38 ) | 0x40 );
    for( c = 8; c; c-- )
        LCDWriteData( *Pattern++ );
    LCDWriteCmd( 0x80 | (( cursory << 6 ) & 0x40 ) | ( cursorx & 0x3f ) + ( cursory & 0x02 ? maxx : 0 ));
    }
*/
//==============================================================================
void LCDInit( void )
    {
    // Initialize the LCD data interface.

    // The initial value of the LCD's ENABLE pin is 0 (disabled).
    SetEAsDisabled();
    // The LCD's ENABLE pin is an output.
    SetEAsOutput();

    // The initial value of the LCD's READ/!WRITE pin is 0 (write).
    SetRWAsWrite();
    // The LCD's READ/!WRITE pin is an output.
    SetRWAsOutput();

    // The initial value of the LCD's DATA/!INSTRUCTION pin is 0 (data).
    SetDIAsInstruction();
    // The LCD's DATA/!INSTRUCTION pin is an output.
    SetDIAsOutput();

    // Chip initialization, following data-sheet procedure.

    // Delay mandated by the data-sheet

    // "Wait for more than 15 ms after VCC rises to 4.5 V."
    // or
    // "Wait for more than 40 ms after VCC rises to 2.7 V."

    Delay15ms();

    // Value to set the LCD interface to 8 bits, irrespective of the real board
    // interface length.
    SetDataPortValue( 0x30 );

    SetDataPortAsOutputs();

    // The command to change the interface to 8 bits must be issued 3 times.

    // Issue the command (first time).
    SetEAsEnabled();
    // Wait for the minimum 'tHIGH'.
    Delay500ns();
    // Low half of the trasfer cycle.
    SetEAsDisabled();

    // Delay mandated by the data-sheet

    // "Wait for more than 4.1 ms."
    Delay4100us();

    // Issue the command (second time).
    SetEAsEnabled();
    // Wait for the minimum 'tHIGH'.
    Delay500ns();
    // Low half of the trasfer cycle.
    SetEAsDisabled();

    // Delay mandated by the data-sheet

    // "Wait for more than 100 µs."
    Delay100us();

    // Issue the command (third time).
    SetEAsEnabled();
    // Wait for the minimum 'tHIGH'.
    Delay500ns();
    // Low half of the trasfer cycle.
    SetEAsDisabled();

#if         !defined USE_READ_PIN
    // Wait for the execution time.
    Delay37us();
#endif  //  !defined USE_READ_PIN

    // Set the correct interface length
#if         defined USE_FOUR_BIT_INTERFACE

    // "Function set (Set interface to be 4 bits long.) Interface is 8 bits in length."
    LCDWriteCmd( 0x28 );

#else   //  defined USE_FOUR_BIT_INTERFACE

    // "Function set (Interface is 8 bits long.)"
    LCDWriteCmd( 0x38 );

#endif  //  defined USE_FOUR_BIT_INTERFACE

    // Turn display on
    LCDWriteCmd( 0x0c );
    // Clear display
    LCDWriteCmd( CMD_CLEAR_DISPLAY );
    }
//==============================================================================
ON 20100424@9:46:41 PM at page: On a web page you were interested in at: http://www.piclist.com/techref/member/IMB-yahoo-J86/HD44780-tty.htm# Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference: http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\HD44780-tty.htm&version=11 ON 20100424@9:47:42 PM at page: On a web page you were interested in at: http://www.piclist.com/techref/member/IMB-yahoo-J86/lcdcfg-lite.h.htm# Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference: http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcdcfg-lite.h.htm&version=1 ON 20100424@9:48:37 PM at page: On a web page you were interested in at: http://www.piclist.com/techref/member/IMB-yahoo-J86/HD44780-tty.htm# Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference: http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\HD44780-tty.htm&version=12 ON 20100424@9:49:28 PM at page: On a web page you were interested in at: http://www.piclist.com/techref/member/IMB-yahoo-J86/HD44780-tty.htm# Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference: http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\HD44780-tty.htm&version=13 ON 20100424@9:50:29 PM at page: On a web page you were interested in at: http://www.piclist.com/techref/member/IMB-yahoo-J86/lcdcfg-lite.h.htm# Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference: http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcdcfg-lite.h.htm&version=2 ON 20100424@9:52:26 PM at page: On a web page you were interested in at: http://www.piclist.com/techref/member/IMB-yahoo-J86/lcd-lite.c.htm# Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference: http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcd-lite.c.htm&version=1 ON 20100424@9:57:06 PM at page: On a web page you were interested in at: http://www.piclist.com/techref/member/IMB-yahoo-J86/lcdcfg-lite.h.htm# Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference: http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcdcfg-lite.h.htm&version=3 ON 20100424@10:01:19 PM at page: On a web page you were interested in at: http://www.piclist.com/techref/member/IMB-yahoo-J86/lcdcfg-lite.h.htm# Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference: http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcdcfg-lite.h.htm&version=4 ON 20100424@10:02:08 PM at page: On a web page you were interested in at: http://www.piclist.com/techref/member/IMB-yahoo-J86/lcdcfg-lite.h.htm# Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference: http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcdcfg-lite.h.htm&version=5 ON 20100424@10:02:41 PM at page: On a web page you were interested in at: http://www.piclist.com/techref/member/IMB-yahoo-J86/lcdcfg-lite.h.htm# Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference: http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcdcfg-lite.h.htm&version=6 ON 20100424@10:03:05 PM at page: On a web page you were interested in at: http://www.piclist.com/techref/member/IMB-yahoo-J86/lcd-lite.c.htm# Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference: http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcd-lite.c.htm&version=2 ON 20100424@10:05:07 PM at page: On a web page you were interested in at: http://www.piclist.com/techref/member/IMB-yahoo-J86/lcd-lite.c.htm# Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference: http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcd-lite.c.htm&version=3 ON 20100424@10:06:18 PM at page: On a web page you were interested in at: http://www.piclist.com/techref/member/IMB-yahoo-J86/lcd-lite.c.htm# Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference: http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcd-lite.c.htm&version=4 ON 20100425@6:36:41 PM at page: On a web page you were interested in at: http://www.piclist.com/techref/member/IMB-yahoo-J86/lcdcfg-lite.h.htm# Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference: http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcdcfg-lite.h.htm&version=7 ON 20100425@6:37:21 PM at page: On a web page you were interested in at: http://www.piclist.com/techref/member/IMB-yahoo-J86/lcd-lite.c.htm# Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference: http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcd-lite.c.htm&version=5 ON 20100428@5:24:28 PM at page: On a web page you were interested in at: http://www.piclist.com/techref/member/IMB-yahoo-J86/lcd-lite.c.htm# Isaac Marino Bavaresco[IMB-yahoo-J86] edited the page. Difference: http://www.piclist.com/techref/diff.asp?url=H:\techref\member\IMB-yahoo-J86\lcd-lite.c.htm&version=0