No todo va ser Arduino en ésta vida y Manuel desde MicroPic.es nos informa de una estupenda librería para manejo de pantallas LCD que utiliza tan sólo 3 pines para su control y un bus de datos de 4 bits. La librería es muy sencilla y fué originalmente diseñada utilizando un microcontrolador PIC 16F84.
Código fuente y enlace a continuación...
Gracias Manuel!
Código fuente de la librería:
// flex_lcd_3_pins.c //Modificación de Flex_lcd por Duende_Azul y Akenafab //Trabaja con 3 pines y 74VHC164 //8-Bit Serial-In, Parallel-Out Shift Register //La LCD se usa en modo 4bits //Revisar diagrama de conexion Adjunto //Se ha utilizado a una velocidad de @40MHz sin ningun problema //No esta habilitada la lectura del LCD //RW debe ir a gnd //Definir pines antes de llamar libreria// //#define LCD_E PIN_A0 //#define LCD_CK PIN_A1 //#define LCD_DAT PIN_A2 //======================================== int RS_bit; #define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines #define lcd_line_two 0x40 // LCD RAM address for the 2nd line int8 const LCD_INIT_STRING[4] = { 0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots 0xc, // Display on 1, // Clear display 6 // Increment cursor }; //------------------------------------- void lcd_send_nibble(int8 nibble, int rs_bit) { int x; if(RS_bit==1) nibble=nibble|0x10; for(x=0;x<5;x++){ output_bit(LCD_DAT,shift_right(&nibble,1,0)); delay_cycles(1); output_low(LCD_CK); delay_us(1); output_high(LCD_CK);} output_high(LCD_E); delay_us(2); output_low(LCD_E); } //----------------------------------- //---------------------------------------- // Send a byte to the LCD. void lcd_send_byte(int8 address, int8 n) { //output_low(LCD_RS); RS_bit=0; delay_us(100); if(address) //output_high(LCD_RS); RS_bit=1; else //output_low(LCD_RS); RS_bit=0; delay_cycles(1); output_low(LCD_E); lcd_send_nibble(n >> 4,RS_bit); lcd_send_nibble(n & 0xf,RS_bit); } //---------------------------- void lcd_init(void) { int8 i; //output_low(LCD_RS); RS_bit=0; output_low(LCD_E); delay_ms(20); for(i=0 ;i < 3; i++) { lcd_send_nibble(0x03,RS_bit); delay_ms(5); } lcd_send_nibble(0x02,RS_bit); for(i=0; i < sizeof(LCD_INIT_STRING); i++) { lcd_send_byte(0, LCD_INIT_STRING[i]); delay_ms(5); } } //---------------------------- void lcd_gotoxy(int8 x, int8 y) { int8 address; if(y != 1) address = lcd_line_two; else address=0; address += x-1; lcd_send_byte(0, 0x80 | address); } //----------------------------- void lcd_putc(char c) { switch(c) { case 'f': //limpia pantalla lcd_send_byte(0,1); delay_ms(8); break; case 'n': //cambio de linea lcd_gotoxy(1,2); break; case 'b': //retrocede 1 caracter lcd_send_byte(0,0x10); break; default: lcd_send_byte(1,c); break; } } //------------------------------ void lcd_setcursor_vb(short visible, short blink) { lcd_send_byte(0, 0xC|(visible<<1)|blink); }
Código de ejemplo:
#include <16F88.h> #FUSES INTRC_IO,NOWDT,PUT,MCLR,NOBROWNOUT,NOLVP,NOPROTECT,NODEBUG,CCPB0,NOFCMEN,NOIESO #use delay(Internal=8M) //------------ Pines del LCD ---------------------// #define LCD_E PIN_A0 #define LCD_CK PIN_A1 #define LCD_DAT PIN_A2 //--------------------------------------------------// #include "flex_lcd_3pins.c" // Cargamos libreria del lcd void main(){ delay_ms(100); output_a(0); output_b(0); lcd_init(); // inicializamos el LCD lcd_setcursor_vb(1,1); //cursor visible,papadeo while(1){ printf(lcd_putc,"f-LCD 3 pin Mode-n* !.|.|..|.|.! *"); delay_ms(1000); printf(lcd_putc,"f* Duende_Azul *n * Akenafab *"); delay_ms(1000); }//end while }//end main
Consigue los microcontroladores PIC que necesitas:
Enlace: LCD con sólo 3 pines