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:
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 ?
Valeu, mas onde exatamente seria o laço?
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.
Ah entendi, o código realmente vai ficar menor assim, valeu!
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!
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();
Postar um comentário