Autor Tema: duda sobre cgram de lcd  (Leído 1472 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado setshomaru

  • PIC12
  • **
  • Mensajes: 66
duda sobre cgram de lcd
« en: 13 de Abril de 2009, 12:50:26 »
Buenos dias señores tengo una duda y no he podido dar con el problema hice un programa que muestra caracteres de 2x2 posiciones en una lcd la mayoria los muestra bien pero el 4, 8 y 9 aparecen mal, ya revicè el codigo de la generacion no encuentro nada raro, es como si se pasara de posiciones pero no sè, si alguien me puede colaborar, le agradeceria mucho. les dejo el codigo:


//en la libreria flex_lcd.c se definen los pines que van al lcd
//este programa muestra caracteres personalizados


#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

#define  sig         6     //0x06
#define  clear       1     //0x01
#define  cursor_no   12    //0x0C
#define  cursor_si   14    //0x0E
#define  cur_blink   15    //0x0F
#define  dezp_izq    24
#define  dezp_der    28
#define  gen_car     64
#define  lin1        133   //0x85
#define  ren1        128   //0x80
#define  ren2        192   //0xC0

#include <flex_lcd.c>
#include <big_char.c>

byte  car;


void main() {
 

   lcd_init();
 
   car=0;
   
   do{
   
   delay_ms(1000);
   
   genera_char(0,car);
   
   lcd_gotoxy(1,1);
   lcd_putc(0);
   lcd_putc(1);
   lcd_gotoxy(1,2);
   lcd_putc(2);
   lcd_putc(3);
   
   
 
   genera_char(1,car);
   
   lcd_gotoxy(3,1);
   lcd_putc(4);
   lcd_putc(5);
   lcd_gotoxy(3,2);
   lcd_putc(6);
   lcd_putc(7);
   
   ++car;
   if(car==10)
      car=0;
   }while(true);
   


y esta es la libreria big_char.c


//por 07_04_09
//
//esta libreria se encarga de generar caracteres de tamaño 2x2 posiciones de la lcd
//solo se pueden mostrar 2 tipos diferentes de caracteres en la lcd porque para
//cada caracter se necesitan 4 posiciones de la cgram de la lcd y solo contamos
//con 8 posiciones lo que me permite solo generar 2 caracteres al mismo tiempo.
//el 2,4,8,9 tienen problemas no se porque
//para generar se llama:
//
//generar_char(pos,caracter)
//
//donde pos es 0 ó 1 y caracter entre 0 y 9
//

   
   byte i_cg,i_chr;
   
   byte mem_cgram[2][4]={64,72,80,88,     //posiciones cgram para gen 1er caracter
                         96,104,112,120}; //posiciones cgram para gen 2do caracter


   byte big_char[4][32]= {0x07,0x0F,0x18,0x18,0x18,0x18,0x18,0x19,   //
                          0x1C,0x1E,0x07,0x0F,0x0B,0x1B,0x13,0x13,   //codigo para
                          0x19,0x1B,0x1E,0x1C,0x1C,0x0F,0x07,0x00,   //generar el cero
                          0x03,0x03,0x03,0x03,0x07,0x1E,0x1C,0x00,   //
                 
                 
                          0x07,0x0F,0x1F,0x1F,0x1B,0x03,0x03,0x03,   //
                          0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,   //codigo para
                          0x03,0x03,0x03,0x03,0x03,0x0F,0x0F,0x00,   //generar el 1
                          0x18,0x18,0x18,0x18,0x18,0x1E,0x1E,0x00,
                         
                         
                          0x07,0x0F,0x1C,0x18,0x00,0x00,0x00,0x00,   //
                          0x1E,0x1F,0x03,0x03,0x07,0x0E,0x0C,0x18,   //codigo para
                          0x01,0x03,0x07,0x0E,0x1C,0x1F,0x1F,0x00,   //generar el 2*
                          0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,
         
         
                          0x1F,0x1F,0x10,0x00,0x00,0x01,0x03,0x01,   //
                          0x1F,0x1F,0x07,0x0E,0x1C,0x18,0x10,0x00,   //codigo para
                          0x00,0x00,0x18,0x18,0x18,0x0F,0x07,0x00,   //generar el 3
                          0x1C,0x0E,0x07,0x03,0x03,0x1E,0x1C,0x00
                         
                         
                          0x00,0x00,0x01,0x03,0x07,0x0E,0x1C,0X18,   //
                          0X1C,0X1C,0X1C,0X1C,0X0C,0X0C,0X0C,0X00,   //codigo para
                          0X1F,0X1F,0X00,0X00,0X00,0X00,0X00,0X00,   //generar el 4*
                          0X1F,0X1F,0X0C,0X0C,0X0C,0X0C,0X0C,0X00
                         
                          0x1F,0x1F,0x18,0x18,0x1F,0x1F,0x00,0x00,   //
                          0x1F,0x1F,0x00,0x00,0x1C,0x1E,0x07,0x03,   //codigo para
                          0x00,0x00,0x18,0x18,0x1C,0x0F,0x03,0x00,   //generar el 5
                          0x03,0x03,0x03,0x03,0x07,0x1E,0x1C,0x00
                         
                         
                          0x03,0x07,0x0E,0x1C,0x18,0x18,0x1F,0x1F,   //
                          0x1C,0x1C,0x00,0x00,0x00,0x00,0x1C,0x1E,   //codigo para
                          0x1F,0x18,0x18,0x18,0x1C,0x0F,0x07,0x00,   //generar el 6
                          0x1F,0x03,0x03,0x03,0x07,0x1E,0x1C,0x00
                         
                          0x1F,0x1F,0x00,0x00,0x00,0x01,0x03,0x07,   //
                          0x1F,0x1F,0x07,0x0E,0x1C,0x18,0x10,0x00,   //codigo para
                          0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x00,   //generar el 7
                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                         
                          0x07,0x0F,0x18,0x18,0x18,0x18,0x0F,0x07,   //
                          0x1C,0x1E,0x03,0x03,0x03,0x03,0x1E,0x1C,   //codigo para
                          0x0C,0x18,0x18,0x18,0x18,0x0F,0x07,0x00,   //generar el 8 *                                                                                   
                          0x06,0x03,0x03,0x03,0x03,0x1E,0x1C,0x00
                         
                          0x07,0x0F,0x18,0x18,0x18,0x18,0x0F,0x07,   //
                          0x1C,0x1E,0x03,0x03,0x03,0x03,0x1F,0x1F,   //codigo para
                          0x19,0x1B,0x1E,0x1C,0x1C,0x0F,0x07,0x00,   //generar el 9*
                          0x00,0x00,0x00,0x00,0x01,0x07,0x07,0x00};
                         
                         
                         
                         
                         
                         
                         
                         
                         
                         
               
void genera_char(int1 pos_cgram,byte simbolo){

   i_cg=0;
   i_chr=0;
   
inc_men_cgram:

   lcd_send_byte(0,mem_cgram[pos_cgram][i_cg]); //selecciona posiciones de la cgram
                                                //donde se guardaran los fragmentos
                                                //de caracter

aun_no:

   lcd_putc(big_char[simbolo][i_chr]);          //forma simbolo segun la declaracion inicial y la peticion
   ++i_chr;                                     //desde programa
   
   if(i_chr==8||i_chr==16||i_chr==24){          //cada vez que se forma un fragmento inc la dir cgram
      ++i_cg;                                   //para formar otro frag
      goto inc_men_cgram;
   }
   
   if(i_chr==32)                                //cuando se forman los 4 frag retornamos o salimos
      return;
   
   goto aun_no;
}
   
muchas gracias espero sus respuestas.  :-/
entre mas se, me doy cuenta que no se nada