Cambio de pantalla lcd 16x2

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.
 
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)
 
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.
 
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.
 
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
 
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");
}
}
 
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
 

Adjuntos

  • foro_800.jpg
    foro_800.jpg
    54.1 KB · Visitas: 145
  • foro2_200.jpg
    foro2_200.jpg
    57.4 KB · Visitas: 137
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)
{
}
 
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.
 
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]
 
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
 
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..
 
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...
 

Adjuntos

  • termomet_162.jpg
    termomet_162.jpg
    138.7 KB · Visitas: 124
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.
 
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
 

Adjuntos

  • temperatura_147.rar
    2.2 KB · Visitas: 119
Atrás
Arriba