2010-08-14

Gerador de caracteres para LCD/Pinguino

Ontem estava trabalhando na parte final do projeto da biblioteca LCD para pinguino, e deparei com a tarefa de criar caracteres do usuário, bom a tarefa apesar de simples é um pouco tediosa e resolvi automatizar o processo.

Assim nasceu o Easy LCD CGRAM, desenvolvi em Java usando o NetBeans, não é a melhor opção mas tenho de estudar Java para a faculdade... :-(

A ideia é  simples, são 64 botões que representam os pixels do display LCD, você clica nestes e depois gera o código para uso com a biblioteca pinguino que postei antes, o processo todo é muito fácil.

Screenshot:
Fontes e programa:
easy_LCD_CGRAM.zip

Como usar?
Basta colocar o código dos caracteres após o comando begin(), no setup{...}, e usa-los no loop{...} com o comando write():
Apenas, lembrem-se de usar o restante do código .pde e arquivo .h do post anterior...
/*
  *************************************************************************
 ***************************************************************************
**                LCD pratical use! PINGUINO CLOCK!                        **
 ***************************************************************************
  *************************************************************************
 */
// Remove line above if you using a pinguino with PIC18F2550
#define PIC18F4550

#define HOUR 20
#define MIN 19

//global vars
uchar counter = 0;
uchar sec  = 0;
uchar min  = 0;
uchar hour = 0;

uchar num = 0;
 
void setup(){
    //8 bits mode
    //lcd(8, 9, 0, 1, 2, 3, 4, 5, 6, 7); // RS, E, D0 ~ D7
   
    //4 bits mode, dont use last four pins ...
    lcd(8, 9, 4, 5, 6, 7, 0, 0, 0, 0); // RS, E, D4 ~ D8    
   
    //LCD format
    begin(2, 0);
   
    //Creating user chars
    //Set AC register to initial CGRAM position
    command(0x40);
    //Write character code
    write(0x3);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x8);
    write(0x18);
    //Write character code
    write(0x6);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x4);
    write(0x0);
    write(0xc);
    //Write character code
    write(0x6);
    write(0x0);
    write(0x0);
    write(0x2);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0xc);
    //Write character code
    write(0xc);
    write(0x0);
    write(0x1);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x6);
    //Write character code
    write(0x6);
    write(0x2);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x3);
    //Write character code
    write(0xc);
    write(0x0);
    write(0x4);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x6);
    //Write character code
    write(0x6);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x8);
    write(0x0);
    write(0x0);
    write(0xc);
    //Write character code
    write(0x3);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x10);
    write(0x0);
    write(0x18);

    /* Debug */
    pinMode(13, OUTPUT);        // LED on pin 12
   
    //Setup buttons
    pinMode(20, INPUT);
    pinMode(19, INPUT);
}
 
void loop()
{
    // Output string
    home();
    lcdPrint("Pinguino Clock!");    // Output char
   
    setCursor(15, 1);
    //Using user chars, a very small pong game! :P
    if(counter % 2){
        num++;
        if(num > 8){
            num = 0;
        }
        write(num);
    }
   
    if (counter>9){
        counter = 0;
        sec++;
    }
   
    if (sec>59){
        sec = 0;
        min++;
    }
   
    if (min>59){
        min = 0;
        hour++;
    }
   
    if (hour>23){
        hour = 0;
    }
   
   
    setCursor(0, 1);
    if (hour < 10)
        lcdPrint("0");    
    printNumber(hour, 10);
   
    if (min < 10)
        lcdPrint(":0");
    else
        lcdPrint(":");        
    printNumber(min, 10);
   
    if (sec < 10)
        lcdPrint(":0");
    else
        lcdPrint(":");
    printNumber(sec, 10);    
   
    //set hour and min    
    if(digitalRead(HOUR) == LOW){
        hour++;
    }
    if(digitalRead(MIN) == LOW){
        min++;
    }
   
    counter++;
    delay(52); //Need two delays by 52ms, crystal/clock/PIC18F code? DSO give me 100.1ms with this!
    digitalWrite(13, LOW);
    delay(52);
    digitalWrite(13, HIGH);    
}

6 comentários:

raul zanardo disse...

nossa, ficou muito bom..

mas não seria mais fácil se ele gera-se um vetor e usa-se um laço pra repeti o comando ?

Marcus Fazzi disse...

Valeu, mas onde exatamente seria o laço?

raul zanardo disse...

algo do tipo:


//caractere A
const unsigned short A[8]=
{0x4, 0xa, 0x11, 0x11, 0x1f, 0x11, 0x11, 0x11};


ai vc pode criar uma função ou colocar no meio do programa:


int i;
for(i=0;i<8;i++)
write(A[i]);


fica mais facil pra organiza os caracteres e programa fica menor.

acho q da pra uzar ponteiro tbm, mas num sei direito, se fizer uma função em que vc coloca o vetor como argumento, tipo write_custom(&A);, mas num so muito bom com ponteiros.

Marcus Fazzi disse...

Ah entendi, o código realmente vai ficar menor assim, valeu!

murilomagostinho disse...

Achei bem interessante a idéia,mas baixei se programinha e não achei o .EXE para testar!comecei a poucos com lcds,estou com o nokia 5310,mas só consigo gerar imagens de tela cheia,ainda não entendi a lógica de gerar imagems "interativas" tipo termometros que reagam a um gráfico na tela,estou usando a biblioteca do luzo robotica,que certamente vc conhece!gero minha imagem te tela cheia po exemplo> byte teste [504] = { "minha imagem"};
e depois chamo a função que escreve a imagem>
cursorxy(0,0);
for (int i = 0; i<504;i++) writedata(minha imagem[i]);
delay(5000);
clearram();

quando tento colocar imagens menores da erro!será que podes me dar uma luz,pois já vasculhei por tudo e só fico mais confuso,rss
desculpe o texto,parabens pelo blog!

Marcus Fazzi disse...

Vou tentar lhe explicar este código

//cursorxy, posiciona o local onde começa a plotar a imagem.
cursorxy(0,0);

//Este laço for, percorre cada pixel da imagem plotando-os, 504 é a quantidade de pixels da imagem.
//Se a imagem for menor vai dar erro, pois vai tentar ploatar um pixel que não existe, provavelmente travar o µC.
for (int i = 0; i<504;i++)
//Esse manda o pixel pro display...
writedata(minha imagem[i]);
delay(5000);

Uma pergunta qual o formato do display? resolução?

//Esse limpa a GRAM do display
clearram();