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