TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: yordan01 en 07 de Septiembre de 2006, 13:20:37
-
Como predefino un dato en la pantalla LCD y como hago para mostrarlo?. Por ejemplo el simbolo de grados centigrados?. He escuchado algo de la cgram. Necesito de su ayuda en assembler. Gracias.
-
Pues sí, es la CGRAM, en el subforo de Almacén del Assembler (http://www.todopic.com.ar/foros/index.php?board=3.0) se ha tratado en más de una ocasión el tema, aquí en este post tienes un ejemplo del símbolo del grado, Generar caracter en LCD (http://www.todopic.com.ar/foros/index.php?topic=5972.0)
Suerte!!! :wink:
-
Hola Yordan01!
Justo ayer por la noche me dió por hacer un efecto extraño (lo tengo a mitad pero ya os lo enseñaré porque es alucinante) con un display LCD y para ello tengo que cargar caracteres en el LCD.
El programa lo tengo en otro ordenador y hoy me va a ser imposible pero... mañana sin falta lo cuelgo para que puedas ver el ejemplo. Por cierto, el programa está hecho en C.
Un saludo desde Alicante.
-
para poder utilizar caracteres "extranos" me refiero que no sean alfa-numericos.
deves leer la hoja caracteristica de tu LCD por aquello que no la tengas puedes ver la del LCD hitachi puesto que la gran mayoria son compatibles con hitachi, busca una tabla con caracteres, en la parte superior de la tabla y en un costado estan los bits que debes mandar como dato (el RS=1) y colocar en el bus (puerto al que esta el lcd ya sea a 4 u 8 bits) y tendras el caracter raro en el lcd.
la CGRAM es la memoria que tiene asociada una locadidad en la pantalla (por eso es RAM de volatil y CG de caracter)
-
Hola Diego Eduardo
Con la CGRam, puedes hasta hacer animaciones de lo que te permita 5x8 pixeles, esa es una caracteristaicas de las pantallas alfanumericas, te permiten crear tus propios caracteres. una imagen de una bateria, un pacman, solo con 5x8 pixeles. mira las direcciones que te dio vszener, que te solucionan el problema.
Suerte
-
Que tal?
Lo prometido es deuda dicen por ahí, osea que, toma esto.
/////////////////////////////////////////////////////////////////////////
//// ////
//// Azicuetano ////
//// ////
/////////////////////////////////////////////////////////////////////////
// AQUI VAN LOS INCLUDES !!!
#include <18F2550.h>
#include "flex_lcd.c"
#fuses XT,NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP, NOPBADEN
#use delay(clock=4000000)
// AQUI VAN LOS DEFINES !!!
#define use_portb_lcd TRUE
#DEFINE UP 1
#DEFINE DOWN 2
#DEFINE MENU 3
#DEFINE NO_PULSADA 4
// AQUI VAN LAS VARIABLES GLOBALES !!!
int tecla_pulsada=NO_PULSADA;
// AQUI VAN LAS DECLARACIONES DE LAS FUNCIONES !!!
int detecta_tecla(void);
void cargar_caracter(void);
void cargar_caracter(void)
{
int n=0, indice=0;
char caracter_A[8] = { 0b11000000,
0b11000100,
0b11001010,
0b11010001,
0b11010001,
0b11011111,
0b11010001,
0b11010001};
char caracter_z[8] = { 0b11000000,
0b11000000,
0b11000000,
0b11011111,
0b11000010,
0b11000100,
0b11001000,
0b11011111};
char caracter_i[8] = { 0b11000000,
0b11000100,
0b11000000,
0b11001100,
0b11000100,
0b11000100,
0b11000100,
0b11001110};
char caracter_c[8] = { 0b11000000,
0b11000000,
0b11000000,
0b11001111,
0b11010000,
0b11010000,
0b11010000,
0b11001111};
char caracter_u[8] = { 0b11000000,
0b11000000,
0b11000000,
0b11010001,
0b11010001,
0b11010001,
0b11010001,
0b11001110};
char caracter_e[8] = { 0b11000000,
0b11000000,
0b11000000,
0b11001110,
0b11010001,
0b11011111,
0b11010000,
0b11001111};
lcd_send_byte(0,0x40); // Enviamos esto para que nos empiece a
// escribir en la primera dirección de la CGRAM
// del display.
printf(lcd_putc,"%c", caracter_A[0]); // Caracter 1
printf(lcd_putc,"%c", caracter_A[1]);
printf(lcd_putc,"%c", caracter_A[2]);
printf(lcd_putc,"%c", caracter_A[3]);
printf(lcd_putc,"%c", caracter_A[4]);
printf(lcd_putc,"%c", caracter_A[5]);
printf(lcd_putc,"%c", caracter_A[6]);
printf(lcd_putc,"%c", caracter_A[7]);
printf(lcd_putc,"%c", caracter_z[0]); // Caracter 2
printf(lcd_putc,"%c", caracter_z[1]);
printf(lcd_putc,"%c", caracter_z[2]);
printf(lcd_putc,"%c", caracter_z[3]);
printf(lcd_putc,"%c", caracter_z[4]);
printf(lcd_putc,"%c", caracter_z[5]);
printf(lcd_putc,"%c", caracter_z[6]);
printf(lcd_putc,"%c", caracter_z[7]);
printf(lcd_putc,"%c", caracter_i[0]); // Caracter 3
printf(lcd_putc,"%c", caracter_i[1]);
printf(lcd_putc,"%c", caracter_i[2]);
printf(lcd_putc,"%c", caracter_i[3]);
printf(lcd_putc,"%c", caracter_i[4]);
printf(lcd_putc,"%c", caracter_i[5]);
printf(lcd_putc,"%c", caracter_i[6]);
printf(lcd_putc,"%c", caracter_i[7]);
printf(lcd_putc,"%c", caracter_c[0]); // Caracter 4
printf(lcd_putc,"%c", caracter_c[1]);
printf(lcd_putc,"%c", caracter_c[2]);
printf(lcd_putc,"%c", caracter_c[3]);
printf(lcd_putc,"%c", caracter_c[4]);
printf(lcd_putc,"%c", caracter_c[5]);
printf(lcd_putc,"%c", caracter_c[6]);
printf(lcd_putc,"%c", caracter_c[7]);
printf(lcd_putc,"%c", caracter_u[0]); // Caracter 5
printf(lcd_putc,"%c", caracter_u[1]);
printf(lcd_putc,"%c", caracter_u[2]);
printf(lcd_putc,"%c", caracter_u[3]);
printf(lcd_putc,"%c", caracter_u[4]);
printf(lcd_putc,"%c", caracter_u[5]);
printf(lcd_putc,"%c", caracter_u[6]);
printf(lcd_putc,"%c", caracter_u[7]);
printf(lcd_putc,"%c", caracter_e[0]); // Caracter 6
printf(lcd_putc,"%c", caracter_e[1]);
printf(lcd_putc,"%c", caracter_e[2]);
printf(lcd_putc,"%c", caracter_e[3]);
printf(lcd_putc,"%c", caracter_e[4]);
printf(lcd_putc,"%c", caracter_e[5]);
printf(lcd_putc,"%c", caracter_e[6]);
printf(lcd_putc,"%c", caracter_e[7]);
}
//##############################################################################
//#
//# Función encargada de detectar la tecla pulsada.
//#
//# Nos devolverá:
//#
//# TECLA_UP -> SI PULSAMOS LA TECLA SUPERIOR
//# TECLA_MENU -> SI PULSAMOS LA TECLA CENTRAL
//# TECLA_DOWN -> SI PULSAMOS LA TECLA INFERIOR
//#
//##############################################################################
int detecta_tecla(void)
{
if(input(PIN_A5)==0)
{
delay_ms(30);
tecla_pulsada=DOWN;
return(tecla_pulsada);
}
if(input(PIN_A3)==0)
{
delay_ms(30);
tecla_pulsada=UP;
return(tecla_pulsada);
}
if(input(PIN_A4)==0)
{
delay_ms(30);
tecla_pulsada=MENU;
return(tecla_pulsada);
}
tecla_pulsada=NO_PULSADA;
return(tecla_pulsada);
}
/////////////////////////////////////////////////////////////////////////////
//
// MAIN: PROGRAMA PRINCIPAL
//
/////////////////////////////////////////////////////////////////////////////
void main(void)
{
set_tris_a(0b11111111);
set_tris_b(0b00000000);
port_b_pullups(FALSE);
lcd_init(); //inicializa lcd
delay_ms(50);
printf(lcd_putc,"\f FORO TODOPIC ;)"); //muestra por pantalla el mensaje
delay_ms(2000);
tecla_pulsada=detecta_tecla();
cargar_caracter();
printf(lcd_putc,"\f->");
while(1)
{
tecla_pulsada=detecta_tecla();
if(tecla_pulsada==MENU)
{
delay_ms(50);
printf(lcd_putc," ");
lcd_gotoxy(0,1);
printf(lcd_putc," %c%c%c%c%c%c",0,1,2,3,4,5);
}
}
}
Si tienes alguna duda pregunta que te responderé encantado. Con un poco de imaginación se pueden hacer cosas tan chulas como esta (como mi camara es una chufa se ve muy mal, pero, en realidad el efecto es muy nítido):
http://rapidshare.de/files/32674026/MVI_0101.avi.html
Un saludo desde Alicante.
-
Hola amigos
Hace algun tiempo lo hice. Es relativamente sencillo pero laborioso. La CGRAM de la pantalla que utilize (LCD 16x2) era una memoria dondde el direcionamiento equivalia a dibujar un punto en una cuadricula limitada por el ancho y largo maximo de caracter. Era como un mapa de bits, donde gracias al mouse, dibujas un punto, y luego otro y otro hasta completar el simbolo deseado. Como te imaginaras, en la LCD no hay mouse, asi que lo haces a punta de coordenadas en la CGRAM y luego lo guardas como una direccion. Esto creo que varia de modelo en modelo de LCD. Busca el data Del Controlador de la pantalla, no de la pantalla. El controlador es del chip mas grande que se ve. en mi caso al pantalla tenia un codigo que no recuerdo, pero su controlador era Samsung. Busque el numero y tenia un muy buen datasheet de como inicializarlo, y la gama de opciones de como programar los caracteres especiales. Ademas me mostraba la cantidad de caracteres válidos y me parece que el "º" estaba incluido. Buscalo, a lo mejor esta y te ahorras ese trabajito...
como accederla en asembler?
depende como hayas conectado la pantallita... yo trabaje en micro 8051 de Intel (asembler) y estaba conectado al bus de datos, compartido con un teclado. con la orden:
MOV DPTR,#8100 // Mover al DPTR (unico registro de 16 bits), la constante 8100
Mov A,#40h //Mover al Acumulador (Registro de uso general) el caracte "@" en ascii
MOVX @DPTR,A //Mover a la posiccion mostrada por el dptr el contenido de A
que hice aqui?, pues el micro cree que la pantalla (y el teclado=9000) eran memorias externas, usando un data select o Decoder con las lineas de direcciones del micro identificaba con cual dispositivo estaba hablando ( por ello el 8000 o 9000) y el resto de los numeros le decian al LCD que queria hacer (leerla, escribirla o enviar comando (por ello 8100) y una vez hecho esto le decia cual caracter escribir.
Espero haber ayudado...