# Cambio de pantalla lcd 16x2



## opaitopepe (Sep 19, 2008)

Hola amigos:

de entre todo lo que he buscado no he visto ningun .asm que me permita ver varias pantallas en un mismo lcd.
¿Teneis algo que me pueda orientar para simularlo en proteus?
gracias de antemano.


----------



## El nombre (Sep 19, 2008)

Para simularlo con el proteus tienes que variar la rutina normal. Cuando se queda esperando el retorno del display (bit 7 si no recuerdo mal) tienes que eliminar ese bucle y poner una temporización. Empieza por 20ms y ves quitandole.
Ahh y si funciona bien con dos lcd´s
(te pegaria la rutina pero no la tengo)


----------



## opaitopepe (Sep 20, 2008)

hola "el nombre" gracias por responder.
El asunto está en poner un pulsador para ver en el mismo lcd (2 lineas 16 caracters) varias pantallas, e ir pasando de una otra.
si la simulación funciona, espero ponerla en el foro como aportacion.
saludos.


----------



## El nombre (Sep 22, 2008)

no entendi lo que pedias. 
eso es facil de hacer. tienes que jugar con el enable de cada lcd. con un demultiplexor puedes ir jugando.
Saludos

Otra cosa. Me pillas mas cerca que Fogonazo, asi que si quieres tomamos una birras por murcia. Nos tomamos las que le debo y le ponemos alguna a cuenta.


----------



## opaitopepe (Sep 23, 2008)

Gracias tio: no lo tengo muy claro pero investigare tu hilo.
si alguien tuviera un ejemplo grafico estaria bien. 
saludos.


----------



## El nombre (Sep 23, 2008)

Me explico mejor.

La Patilla 6 del LCD (E) es la habilita o no el móculo. Si la pones a nivel bajo el módulo LCD queda desconectado en estado de alta impedancia. En esta situación todas las lineas pueden ser empleadas por otros periféricos, como puedan ser otros LCD.
El LCD tiene memoria. Lo que hayas hecho en el permanece independientemente del estado de la entrada 6 (E)
Saludos


----------



## opaitopepe (Sep 24, 2008)

Hola :
os pongo un fichero que hace lo que yo quiero, pero en C. 
es de otro compradre murciano. os podeis bajar la documentacion completa aqui:

http://www.hobbypic.com/index.php?option=com_content&task=view&id=20&Itemid=39

se trata de un terrario. por cierto que no he podido simularlo, se resetea el micro constantemente...

sigo buscando el .asm
saludos.
--------------------

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////              MENU CON 3 BOTONES (T.OK, T.MAS, T.MENOS)               /////
/////                                                                      /////
///// En este programa se muestra el funcionamiento de un menú controlable /////
///// mediante tres pulsadores, tecla ok, tecla mas, tecla menos;Se accede /////
///// al menú atraves de la interrupción en la pata RB0(T.OK), y se sale   /////
///// de el seleccionando la opción 0, o habiendo transcurridos 5 segundos /////
///// sin pulsar ninguna tecla.Se acompaña de una simulación en Proteus    /////
///// para mostrar su funcionamiento, en condiciones normales no haría     /////
///// falta utilizar el WDT, pero si para su correcto funcionamiento en    /////
///// Proteus                                                              /////
/////                                                                      /////
///// por: Jaime Fernández-Caro Belmonte                                   /////
/////                                                                      /////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#include <18F2520.h>

#fuses WDT1024, XT, NOPROTECT, BROWNOUT, BORV45, NOPUT, NOCPD
#fuses NOSTVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOIESO, NOFCMEN, NOPBADEN
#fuses NOWRTC, NOWRTB, NOEBTR, NOEBTRB, NOCPB, NOLPT1OSC, MCLR, NOXINST

#use delay(clock=4000000)

#byte pb       =0xF81
#bit t_ok      =pb.0		// RB0, pin21
#bit t_mas 	   =pb.1		// RB1, pin22
#bit t_mns 	   =pb.2		// RB2, pin23

#byte intcon   =0xFF2
#bit  intf     =intcon.1

#include <lcd420.h>
#include <menu.h>

void main()
{
   port_b_pullups(true);
   setup_adc_ports(NO_ANALOGS);

   setup_wdt(WDT_ON);

   lcd_init();

   intf=0;
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);

   while(true)
   {
      restart_wdt();

      lcd_gotoxy(1,1);
      printf(lcd_putc,"Prueba Menu");
   }
}


----------



## narcisolara_21 (Sep 24, 2008)

opaitopepe usa el flowcode es muy facil de usar aqui te dejo una imagen del lcd 16x4 en proteus y una del diagrama de flowcode


----------



## narcisolara_21 (Sep 24, 2008)

Te envie la de 16x2 el flowcode trabaja con diagramas de flujo, programando en C, en asm, y tambien compila en C, en ASM, en Hex, en Code, y por supuesto te graba el Pic , todo en uno.

CODIGO EN C:

#define MX_PIC

//Definiciones para el microcontrolador
#define P16F648A
#define MX_EE
#define MX_EE_TYPE1
#define MX_EE_SIZE 256
#define MX_UART
#define MX_UART_B
#define MX_UART_TX 2
#define MX_UART_RX 1
#define MX_PWM
#define MX_PWM_CNT 1
#define MX_PWM_TRIS1 trisb
#define MX_PWM_1 3

//Funciones
#include <system.h>
#pragma CLOCK_FREQ 4000000

//Datos de configuración

//Funciones internas
#include "C:\Archivos de programa\Matrix Multimedia\Flowcode V3\FCD\internals.h"

//Macro function declarations


//Variable declarations




//LCDDisplay0: //Macro function declarations

void FCD_LCDDisplay0_GetDefines();
void FCD_LCDDisplay0_Start();
void FCD_LCDDisplay0_Clear();
void FCD_LCDDisplay0_PrintASCII(char Character);
void FCD_LCDDisplay0_Command(char in);
void FCD_LCDDisplay0_RawSend(char in, char mask);
void FCD_LCDDisplay0_Cursor(char x, char y);
void FCD_LCDDisplay0_PrintNumber(short Number);
void FCD_LCDDisplay0_PrintString(char* String, char MSZ_String);

//Definiciones suplementarias


//Macro implementations



//LCDDisplay0: //Macro implementations


void FCD_LCDDisplay0_GetDefines()
{

	}  //Dummy end of function to allow defines to be added correctly

	//component connections
	#define LCD_262826_PORT    portb
	#define LCD_262826_TRIS    trisb
	#define LCD_262826_BIT0    0
	#define LCD_262826_BIT1    1
	#define LCD_262826_BIT2    2
	#define LCD_262826_BIT3    3
	#define LCD_262826_RS      4
	#define LCD_262826_E       5

	#ifdef _BOOSTC
	  #define LCD_262826_DELAY   delay_10us(10)
	#endif
	#ifdef _C2C_
	  #define LCD_262826_DELAY   delay_us(100)
	#endif
	#ifndef LCD_262826_DELAY
	  #define LCD_262826_DELAY   delay_us(100)
	#endif



	//internal function prototypes
	void LCD_262826_RawSend(char nIn, char nMask);

	//internal function implementations
	void LCD_262826_RawSend(char nIn, char nMask)
	{
		unsigned char pt;
		unsigned char outVal;
		outVal = LCD_262826_PORT;
		clear_bit(outVal, LCD_262826_BIT0);
		clear_bit(outVal, LCD_262826_BIT1);
		clear_bit(outVal, LCD_262826_BIT2);
		clear_bit(outVal, LCD_262826_BIT3);
		clear_bit(outVal, LCD_262826_RS);
		clear_bit(outVal, LCD_262826_E);
		pt = ((nIn >> 4) & 0x0f);
		if (pt & 0x01)
		    set_bit(outVal, LCD_262826_BIT0);
		if (pt & 0x02)
		    set_bit(outVal, LCD_262826_BIT1);
		if (pt & 0x04)
		    set_bit(outVal, LCD_262826_BIT2);
		if (pt & 0x08)
		    set_bit(outVal, LCD_262826_BIT3);
		if (nMask)
		    set_bit(outVal, LCD_262826_RS);
		LCD_262826_PORT = outVal;
		LCD_262826_DELAY;
		set_bit (LCD_262826_PORT, LCD_262826_E);
		LCD_262826_DELAY;
		clear_bit (LCD_262826_PORT, LCD_262826_E);
		pt = (nIn & 0x0f);
		LCD_262826_DELAY;
		outVal = LCD_262826_PORT;
		clear_bit(outVal, LCD_262826_BIT0);
		clear_bit(outVal, LCD_262826_BIT1);
		clear_bit(outVal, LCD_262826_BIT2);
		clear_bit(outVal, LCD_262826_BIT3);
		clear_bit(outVal, LCD_262826_RS);
		clear_bit(outVal, LCD_262826_E);
		if (pt & 0x01)
		    set_bit(outVal, LCD_262826_BIT0);
		if (pt & 0x02)
		    set_bit(outVal, LCD_262826_BIT1);
		if (pt & 0x04)
		    set_bit(outVal, LCD_262826_BIT2);
		if (pt & 0x08)
		    set_bit(outVal, LCD_262826_BIT3);
		if (nMask)
		    set_bit(outVal, LCD_262826_RS);
		LCD_262826_PORT = outVal;
		LCD_262826_DELAY;
		set_bit (LCD_262826_PORT, LCD_262826_E);
		LCD_262826_DELAY;
		clear_bit (LCD_262826_PORT, LCD_262826_E);
		LCD_262826_DELAY;
	}

	// Dummy function to close the defines section off
	void LCD_262826_Dummy_Function();
	void LCD_262826_Dummy_Function()
	{

}

void FCD_LCDDisplay0_Start()
{

		clear_bit(LCD_262826_TRIS, LCD_262826_BIT0);
		clear_bit(LCD_262826_TRIS, LCD_262826_BIT1);
		clear_bit(LCD_262826_TRIS, LCD_262826_BIT2);
		clear_bit(LCD_262826_TRIS, LCD_262826_BIT3);
		clear_bit(LCD_262826_TRIS, LCD_262826_RS);
		clear_bit(LCD_262826_TRIS, LCD_262826_E);

		delay_ms(12);

		LCD_262826_RawSend(0x33, 0);
		delay_ms(2);
		LCD_262826_RawSend(0x32, 0);
		delay_ms(2);
		LCD_262826_RawSend(0x2c, 0);
		delay_ms(2);
		LCD_262826_RawSend(0x06, 0);
		delay_ms(2);
		LCD_262826_RawSend(0x0c, 0);
		delay_ms(2);

		//clear the display
		LCD_262826_RawSend(0x01, 0);
		delay_ms(2);
		LCD_262826_RawSend(0x02, 0);
		delay_ms(2);

}

void FCD_LCDDisplay0_Clear()
{

		LCD_262826_RawSend(0x01, 0);
		delay_ms(2);
		LCD_262826_RawSend(0x02, 0);
		delay_ms(2);

}

void FCD_LCDDisplay0_PrintASCII(char Character)
{

		LCD_262826_RawSend(Character, 0x10);

}

void FCD_LCDDisplay0_Command(char in)
{

		LCD_262826_RawSend(in, 0);
		delay_ms(2);

}

void FCD_LCDDisplay0_RawSend(char in, char mask)
{
	//Error Reading Code For LCD Display::Macro_RawSend

}

void FCD_LCDDisplay0_Cursor(char x, char y)
{

	  #if (2 == 1)
	    y=0x80;
	  #endif

	  #if (2 == 2)
		if (y==0)
			y=0x80;
		else
			y=0xc0;
	  #endif

	  #if (2 == 4)
		if (y==0)
			y=0x80;
		else if (y==1)
			y=0xc0;
		else if (y==2)
			y=0x94;
		else
			y=0xd4;
	  #endif

		LCD_262826_RawSend(y+x, 0);
		delay_ms(2);

}

void FCD_LCDDisplay0_PrintNumber(short Number)
{

		short tmp_int;
		char tmp_byte;
		if (Number < 0)
		{
			LCD_262826_RawSend('-', 0x10);
			Number = 0 - Number;
		}

		tmp_int = Number;
		if (Number >= 10000)
		{
			tmp_byte = tmp_int / 10000;
			LCD_262826_RawSend('0' + tmp_byte, 0x10);

			while (tmp_byte > 0)
			{
				tmp_int = tmp_int - 10000;
				tmp_byte--;
			}
		}
		if (Number >= 1000)
		{
			tmp_byte = tmp_int / 1000;
			LCD_262826_RawSend('0' + tmp_byte, 0x10);

			while (tmp_byte > 0)
			{
				tmp_int = tmp_int - 1000;
				tmp_byte--;
			}
		}
		if (Number >= 100)
		{
			tmp_byte = tmp_int / 100;
			LCD_262826_RawSend('0' + tmp_byte, 0x10);

			while (tmp_byte > 0)
			{
				tmp_int = tmp_int - 100;
				tmp_byte--;
			}
		}
		if (Number >= 10)
		{
			tmp_byte = tmp_int / 10;
			LCD_262826_RawSend('0' + tmp_byte, 0x10);

			while (tmp_byte > 0)
			{
				tmp_int = tmp_int - 10;
				tmp_byte--;
			}
		}
		LCD_262826_RawSend('0' + tmp_int, 0x10);

}

void FCD_LCDDisplay0_PrintString(char* String, char MSZ_String)
{

		char idx;
		for (idx=0; idx<MSZ_String; idx++)
		{
			if (String[idx]==0)
			{
				break;
			}
			LCD_262826_RawSend(String[idx], 0x10);
		}

}

//Implementaciones suplementarias


void main()
{

	//Inicialización
	cmcon = 0x07;


	//Inicialización del Código de Interrupción
	option_reg = 0xC0;


	//Llamar a Macro de Componente
	//Llamar a Macro de Componente: LCDDisplay(0)::Start
	FCD_LCDDisplay0_Start();


	//Bucle
	//Bucle: Mientras 1
	while( 1 )
	{
		//Llamar a Macro de Componente
		//Llamar a Macro de Componente: LCDDisplay(0)::Cursor(3, 0)
		FCD_LCDDisplay0_Cursor(3, 0);


		//Llamar a Macro de Componente
		//Llamar a Macro de Componente: LCDDisplay(0):rintASCII("Opaitopepe")
		FCD_LCDDisplay0_PrintASCII('O');
		FCD_LCDDisplay0_PrintASCII('p');
		FCD_LCDDisplay0_PrintASCII('a');
		FCD_LCDDisplay0_PrintASCII('i');
		FCD_LCDDisplay0_PrintASCII('t');
		FCD_LCDDisplay0_PrintASCII('o');
		FCD_LCDDisplay0_PrintASCII('p');
		FCD_LCDDisplay0_PrintASCII('e');
		FCD_LCDDisplay0_PrintASCII('p');
		FCD_LCDDisplay0_PrintASCII('e');


		//Llamar a Macro de Componente
		//Llamar a Macro de Componente: LCDDisplay(0)::Cursor(4, 1)
		FCD_LCDDisplay0_Cursor(4, 1);


		//Llamar a Macro de Componente
		//Llamar a Macro de Componente: LCDDisplay(0):rintASCII("LCD 16X2")
		FCD_LCDDisplay0_PrintASCII('L');
		FCD_LCDDisplay0_PrintASCII('C');
		FCD_LCDDisplay0_PrintASCII('D');
		FCD_LCDDisplay0_PrintASCII(' ');
		FCD_LCDDisplay0_PrintASCII('1');
		FCD_LCDDisplay0_PrintASCII('6');
		FCD_LCDDisplay0_PrintASCII('X');
		FCD_LCDDisplay0_PrintASCII('2');


	}


	mainendloop: goto mainendloop;
}

void interrupt(void)
{
}


----------



## opaitopepe (Sep 25, 2008)

ggggracias narciso.
habia oido hablar de él. pero nunca me picó la curiosidad.
me he bajado el manual y la demo. veremos a ver...


----------



## Meta (Sep 25, 2008)

¿Y en ensamblador?


----------



## opaitopepe (Sep 26, 2008)

Hola amigos:
bonito juguete el flowcode. he trasteado y tambien se puede meter codigo en ensamblador. Aunque la demo es muy limitada se pueden hacer cosas... pero pocas.
genera un chorizo de codigo que me parece exagerado. sin embargo todavia no he podido simular lo que quiero:
cambiar de pantallas en un mismo lcd. seguire trasteando. (basicamente porque la demo no me deja meter mas sentencias.
gracias por vuestro interés.
saludos.


----------



## narcisolara_21 (Sep 26, 2008)

no entiendo como de cambiar pantalla, si te refieres a mover lo que esta en la primera linea a la segunda o mover el texto por toda las lineas es facil, yo tengo el flowcode full si lo quieres me avisas para subirlo a Rapid.[/img]


----------



## FRYCK (Sep 26, 2008)

hola opaitopepe    que  es  lo  que  necesitas   hacer  corrimientos  de  los  cracteres  o cambiar  los  mensajes  que  se  despliegan  en  el  lcd  o  puedes ser  mas  expicito  para ver  si te  puedo  halludar cualquier  cosa  me  comentas  yo  te  paso   unas  librerias   en  c  o  en  asembler


----------



## opaitopepe (Sep 27, 2008)

Hola compañeros:
intente explicarme bien desde el principio, pero en fin...
lo que necesito es cambiar los mensajes que se despliegan y, ya puestos, introducir valores que se vallan pidiendo.
gracias, estaremos atentos..


----------



## opaitopepe (Sep 27, 2008)

oye narciso ¿que full tienes del flowcode".  la demo de la 3.3 tiene un lcd grafico muy "apañao" que no viene en la 3,2.
saludos.


----------



## narcisolara_21 (Sep 27, 2008)

la version v.3, 
haber si te sirve este ejemplo: yo estoy haciendo un termometro digital y la temperatura que son 3 digitos la muestro en el decimo segmento de la seguna linea de la pantalla y se actualiza cada 100 milisegundos los demas segmentos quedan igual. Tiene la opcion de modificar la temperatura max o min para activar cualquier dispositivo por ejemplo un ventilador. ahi te dejo una imagen de proteus para que la veas...


----------



## opaitopepe (Sep 28, 2008)

bueno, utilizas dos lcd´s y dos micros. la idea es como esa pero con un solo lcd y un micro. para conectar 4 lm35 con max y min.
ya nos acercamos...
ayer, trasteando con el flow me dí cuenta que al generar el .hex tambien crea un .asm
el tuto31 está interesante. ¡el asm tenia 1700 lineas! si lo pasas al microlab te dice que no puede terminar de compilarlo porque el micro está lleno. Otra cosa que he visto es que si le metes interrupciones en C. no la reconoce, aunque le pongas los mismos comandos que él genera cuando la haces por flujo. pero bien, siempre se aprende algo.
saludos.


----------



## narcisolara_21 (Sep 28, 2008)

No es un solo micro y un LCD lo que pasa es que saque dos imagenes una mostrando la temp. y otra cuando oprimo enter modifico la tem max o min. no lo he terminado pero hay te lo subo


----------



## narcisolara_21 (Sep 28, 2008)

oprime enter mas o menos por 1 segundo no lo he terminado porque estoy haciendo un sensor de flujo para una bomba de agua


----------



## opaitopepe (Sep 29, 2008)

Muy bueno narciso. Gracias por currartelo. voy a pasarlo al proteus a ver que se cuenta.


----------



## narcisolara_21 (Sep 29, 2008)

En proteus tienes que poner la salida  de la pantalla por ejemplo si utilizas el puerto b de salida lo pones asi: 

PIC                LCD

RB0------------>D4
RB1------------>D5
RB2------------>D6
RB3------------>D7
RB4------------>RS
RB5------------>E
                      RW----->a masa

No se porque hay que ponerlo asi, pero en la vida real hay que ponerlo como lo explica la ayuda del flowcode (RB0---->D0, etc) hay muchas personas que no han podido simular un LCD en proteus por el mismo problema yo lo descubri intentando esto y WUA me sirvio, Tambien hay otro problema que por ejemplo si quieres mostrar 255 en bit proteus te muestra 77 o si quieres mostrar 1023 en INT proteus te muestra 308 esto se arregla aplicando unos calculos pero en la vida real no hay que aplicar nada, Parace que flowcode y proteus no se entienden bien lo demas si funciona bien...


----------



## opaitopepe (Oct 5, 2008)

me guataria mantener vivo el hilo hasta que que consiga hacer funcionar una simulacion en proteus. Mira que busco...
" cuatro termostatos, con salida a 4 reles e indicación de max. y min. para cada uno.
cuando pulse el lcd cambia de t1 (con su max, y min.) a t2 y asi sucesivamente"
y seguro que es una tonteria. Pero no doy con la tecla.
saludos.


----------



## narcisolara_21 (Oct 5, 2008)

en pruteus cuando quieres hacer la simulacion cual es el problema


----------



## opaitopepe (Oct 9, 2008)

Bueno, a los amigos que han seguido este hilo, os dejo, con permiso de los moderadores, un pdf que me ha parecido muy interesante. Complementa a nuestro querido libro del 16f84 del Sr.Palacios.
(son 300 paginas con un monton de ejemplos.) merece la pena verlo.
Aqui os dejo el ASM que andaba buscando. Pulsando el swich cambia la pantalla del lcd. 
el ejemplo es del libro que os comento.
Espero que sea de utilidad para otros  novatos como yo.
saludos y... hasta otra.



```
title " Visualización de mensajes en función de un pulsador "
;************************************** Mens_06.asm 
; En el modulo LCD se pueden visualizar varios mensajes diferentes. El paso de uno
; a otro se realiza al actuar sobre un pulsador conectado a la línea RA4.
; En pantalla aparecere por ejemplo:
; " Mensaje 2 " (primera línea).
; "S.S. de los Reyes." (segunda línea).
;**
;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz.
;Reloj instrucción: 250 KHz = 4 uS.
;Perro Guardián deshabilitado.
;Tipo de Reloj XT.
;Protección de Código: OFF.
;************************************** Elegimos PIC ********************************************************************
138
list p=16f877, f=inhx32
;***************** Asignación de nombres de Registros de Funciones especiales a direcciones *****************
#include <p16f877.inc> ;Este fichero contiene los nombres y direcciones de los
; registros de funciones especiales.
; Este fichero esta localizado en el directorio
; con el nombre MPASM.
;************************************** Igualdades ***********************************************************************
#DEFINE Pulsador PORTA,4 ; Línea donde se conecta el pulsador.
ValorMaximo EQU D'4' ; Numero de mensajes.
;************************************** Registros ************************************************************************
CBLOCK 0x20
Contador ; El contador a visualizar.
ENDC
;************************************* Sección Código de Reset *******************************************************
ORG 0 ;Dirección del Vector Reset
GOTO COMIENZO ;Comienzo del Programa
;*********************************** Sección de Configuración *********************************************************
COMIENZO clrf PORTA ; Reseteamos el PORTA.
bsf STATUS,RP0 ; Ir al Banco 1.
movlw 0x06 ; Poner el PORTA como señales digitales.
movwf ADCON1
bsf Pulsador ; Línea del pulsador configurada como entrada.
bcf STATUS,RP0 ; Ir al Banco 0.
call LCD_Inicializa ; Inicializar el LCD.
clrf Contador
call Visualiza ; Inicializa contador y los visualiza por primera vez.
;************************************* Principal **************************************************************************
Principal btfsc Pulsador ; Lee el pulsador.
goto Fin
call Retardo_20ms ; Espera estabilicen niveles de tensión.
btfsc Pulsador ; Vuelve a leer el pulsador.
goto Fin
call IncrementaContador ; Incrementa el contador.
call Visualiza ; Visualiza el mensaje correspondiente.
EsperaDejePulsar btfss Pulsador
goto EsperaDejePulsar
Fin goto Principal
;********************************** Subrutina "IncrementaContador" **************************************************
; Incrementa el valor de la variable Contador. Si llega al valor máximo lo resetea.
IncrementaContador incf Contador,F ; Incrementa el contador.
139
movf Contador,W ; Ha superado su valor máximo?
sublw ValorMaximo-1 ; (W)<- ValorMaximo-(Contador).
btfss STATUS,C ; Si C=1 salta una instrucción.
(Contador)> #ValorMaximo
clrf Contador ; Lo inicializa si ha superado su valor máximo.
return
;************************************** Subrutina "Visualiza" **********************************************************
Visualiza call LCD_Borra ; Borra la pantalla y se sitúa en la línea 1.
movlw MensajeN ; Apunta a este mensaje.
call LCD_Mensaje ; Lo visualiza.
movf Contador,W ; A continuación visualiza el contador.
call BIN_a_BCD ; Se debe visualizar en BCD.
call LCD_Byte
call LCD_Linea2 ; Al principio de la segunda línea del LCD.
movf Contador,W
call ApuntaMensaje ; Apunta al mensaje que se va a visualizar.
call LCD_Mensaje ; Lo visualiza.
return
;************************************** Subrutina "ApuntaMensaje" ****************************************************
ApuntaMensajeaddwf PCL,F
retlw Mensaje0
retlw Mensaje1
retlw Mensaje2
retlw Mensaje3
;***************************************** Subrutina "Mensajes" ********************************************************
Mensajes addwf PCL,F
Mensaje0 DT " DESARROLLO DE ",0x00 ; Posición inicial del mensaje 0.
Mensaje1 DT " PROYECTOS ", 0x00 ; Posición inicial del mensaje 1.
Mensaje2 DT "S.S. SEBASTIAN", 0x00 ; Posición inicial del mensaje 2.
Mensaje3 DT "de los Reyes", 0x00 ; Posición inicial del mensaje 3.
MensajeN DT " Mensaje ", 0x00 ; Posición inicial del mensaje primera línea del LCD.
;*********************************************** Librerías ****************************************************************
INCLUDE <LCD_MENS.INC>
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
INCLUDE <BIN_BCD.INC>
END
```


----------



## cfperalta (Jul 2, 2009)

Hola amigos, muy buen material el que han aportado! Yo estoy con el mismo dilema de modificar los valores que aparecen en el lcd mediante un pulsador. La parte de intercambiar la información mostrada ya la implementé con el Flowcode (si alguien la necesita la subo).
Ahora estoy necesitando la rutina en flowcode para modificar los valores visualizados en el lcd mediante pulsadores "subir" y "bajar", ya q le doy vueltas y no logro hallar la solución.. Espero alguien pueda ayudarme.
Saludos y felicitaciones por el foro!


----------



## cfperalta (Jul 2, 2009)

Hola amigos, muy buen material el que han aportado! Yo estoy con el mismo dilema de modificar los valores que aparecen en el lcd mediante un pulsador. La parte de intercambiar la información mostrada ya la implementé con el Flowcode (si alguien la necesita la subo).
Ahora estoy necesitando la rutina en flowcode para modificar los valores visualizados en el lcd mediante pulsadores "subir" y "bajar", ya q le doy vueltas y no logro hallar la solución.. Espero alguien pueda ayudarme.
Saludos y felicitaciones por el foro!


----------



## narcisolara_21 (Jul 2, 2009)

cfperalta dijo:
			
		

> Hola amigos, muy buen material el que han aportado! Yo estoy con el mismo dilema de modificar los valores que aparecen en el lcd mediante un pulsador. La parte de intercambiar la información mostrada ya la implementé con el Flowcode (si alguien la necesita la subo).
> Ahora estoy necesitando la rutina en flowcode para modificar los valores visualizados en el lcd mediante pulsadores "subir" y "bajar", ya q le doy vueltas y no logro hallar la solución.. Espero alguien pueda ayudarme.
> Saludos y felicitaciones por el foro!



Creo que esto es lo que quieres:


----------



## cfperalta (Jul 3, 2009)

Gracias Narciso, veré de que se trata... Saludos!


----------

