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.