Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

19/09/2008 #1


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.
19/09/2008 #2


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)
20/09/2008 #3


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.
22/09/2008 #4


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.
23/09/2008 #5


Gracias tio: no lo tengo muy claro pero investigare tu hilo.
si alguien tuviera un ejemplo grafico estaria bien.
saludos.
23/09/2008 #6


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
24/09/2008 #7


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?op...d=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");
}
}
24/09/2008 #8

Avatar de narcisolara_21

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
Imágenes Adjuntas
Tipo de Archivo: jpg foro2_200.jpg (57,4 KB (Kilobytes), 137 visitas)
Tipo de Archivo: jpg foro_800.jpg (54,1 KB (Kilobytes), 145 visitas)
24/09/2008 #9

Avatar de narcisolara_21

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)
{
}
25/09/2008 #10


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

Avatar de Meta

¿Y en ensamblador?
26/09/2008 #12


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.
26/09/2008 #13

Avatar de narcisolara_21

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]
26/09/2008 #14

Avatar de FRYCK

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
27/09/2008 #15


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..
27/09/2008 #16


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.
27/09/2008 #17

Avatar de narcisolara_21

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...
Imágenes Adjuntas
Tipo de Archivo: jpg termomet_162.jpg (138,7 KB (Kilobytes), 122 visitas)
28/09/2008 #18


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.
28/09/2008 #19

Avatar de narcisolara_21

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
Archivos Adjuntos
Tipo de Archivo: rar temperatura_147.rar (2,2 KB (Kilobytes), 119 visitas)
28/09/2008 #20

Avatar de narcisolara_21

oprime enter mas o menos por 1 segundo no lo he terminado porque estoy haciendo un sensor de flujo para una bomba de agua
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.