Devido a duvida de um usuário em um dos fóruns que eu participo, decidi criar esse exemplo que mostro como gerar caracteres maiores em LCD alfanumérico 4×20, com pequenas alterações podem-se fazer muitas outras aplicações.

Nesse exemplo leio o canal ADC e mostro seu valor no display, com controle de quantidade de casas decimais.

Duvidas, postem nos comentários.

Usar no Proteus 7.10 ou superior.


Fazer o download:][PIC][MIKROC][PROTEUS] Caractere Grande LCD


Segue o código:

[sections] [section title=”Esquema Elétrico”]
Caractere Grande LCD
Caractere Grande LCD
[/section] [section title=”Código Fonte”]

/*
DATEK Tecnologia Eletrônica Ltda.

********************************************************************************
PROGRAMA EXEMPLO: Mostrar como criar caracteres grandes no LCD alfanumérico.
OBJETIVO: Aprender como criar caracteres grandes no LCD alfanumérico.
AUTOR: Fabio Mulero.[fabio@datek.com.br] ********************************************************************************
MICROCONTROLADOR: PIC18F4520.

PLACA DE DESENVOLVIMENTO: SIMULAÇÃO NO PROTEUS

SOFTWARE: MikroC PRO for PIC Versão: 6.0.1

********************************************************************************
*/
//### ALIAS ####################################################################
// Lcd pinout settings
sbit LCD_RS at RD4_bit;
sbit LCD_EN at RD5_bit;
sbit LCD_D7 at RD3_bit;
sbit LCD_D6 at RD2_bit;
sbit LCD_D5 at RD1_bit;
sbit LCD_D4 at RD0_bit;

// Pin direction
sbit LCD_RS_Direction at TRISD4_bit;
sbit LCD_EN_Direction at TRISD5_bit;
sbit LCD_D7_Direction at TRISD3_bit;
sbit LCD_D6_Direction at TRISD2_bit;
sbit LCD_D5_Direction at TRISD1_bit;
sbit LCD_D4_Direction at TRISD0_bit;
//### PROTOTIPOS DE FUNÇÃO #####################################################
void GerarCaractere(unsigned int Valor,unsigned char CasasDecimais);
void CustomChar();
//### CONSTANTES PARA GERAÇÃO CARACTERE ########################################
//GERAÃO DOS GRAFICOS PARA GERAÇÃO DO CARACTERE
const char character[7][8] = {
{0,0,0,0,7,15,31,31}, //CANTO SUPERIOR ESQUERDO
{0,0,0,0,31,31,31,31}, //MEIO SUPERIOR
{0,0,0,0,28,30,31,31}, //CANTO SUPERIOR DIREITO
{31,31,31,31,31,31,31,31}, //CARACTERE PREENCHIDO
{31,31,15,7,0,0,0,0}, //CANTO INFERIOR ESQUERDO
{31,31,31,31,0,0,0,0}, //MEIO INFERIOR
{31,31,30,28,0,0,0,0} //CANTO INFERIOR DIREITO
};
//MONTAGEM DOS CARACTERES
const char character0[4][3] = {
{0,1,2},
{3,’ ‘,3},
{3,’ ‘,3},
{4,5,6}
};
const char character1[4][3] = {
{‘ ‘,1,’ ‘},
{0,3,’ ‘},
{‘ ‘,3,’ ‘},
{5,5,5}
};
const char character2[4][3] = {
{0,1,2},
{0,1,3},
{3,’ ‘,’ ‘},
{4,5,5}
};
const char character3[4][3] = {
{0,1,2},
{‘ ‘,1,3},
{‘ ‘,’ ‘,3},
{4,5,6}
};
const char character4[4][3] = {
{1,’ ‘,1},
{3,1,3},
{‘ ‘,’ ‘,3},
{‘ ‘,’ ‘,5}
};
const char character5[4][3] = {
{1,1,1},
{3,1,1},
{‘ ‘,’ ‘,3},
{5,5,6}
};
const char character6[4][3] = {
{0,1,2},
{3,1,1},
{3,’ ‘,3},
{4,5,6}
};
const char character7[4][3] = {
{0,1,2},
{‘ ‘,’ ‘,3},
{‘ ‘,3,’ ‘},
{‘ ‘,5,’ ‘}
};
const char character8[4][3] = {
{0,1,2},
{3,1,3},
{3,’ ‘,3},
{4,5,6}
};
const char character9[4][3] = {
{0,1,2},
{3,1,3},
{‘ ‘,’ ‘,3},
{4,5,6}
};
const char characterDot[4][3] = {
{‘ ‘,’ ‘,’ ‘},
{‘ ‘,’ ‘,’ ‘},
{‘ ‘,’ ‘,’ ‘},
{‘ ‘,5,’ ‘}
};

//função main
void main()
{
unsigned int uiValor;

ADCON1 = 0x0e;
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
CustomChar();//armazena custom chars
while(1)
{
uiValor=ADC_Read(0);
GerarCaractere(uiValor,3);
}
}

//PREENCHE DDRAM DO LCD COM OS CARACTERES ESPECIAIS
void CustomChar()
{
char i;
Lcd_Cmd(64);
for (i = 0; i<=7; i++) Lcd_Chr_CP(character[0][i]);
Lcd_Cmd(72);
for (i = 0; i<=7; i++) Lcd_Chr_CP(character[1][i]);
Lcd_Cmd(80);
for (i = 0; i<=7; i++) Lcd_Chr_CP(character[2][i]);
Lcd_Cmd(88);
for (i = 0; i<=7; i++) Lcd_Chr_CP(character[3][i]);
Lcd_Cmd(96);
for (i = 0; i<=7; i++) Lcd_Chr_CP(character[4][i]);
Lcd_Cmd(104);
for (i = 0; i<=7; i++) Lcd_Chr_CP(character[5][i]);
Lcd_Cmd(112);
for (i = 0; i<=7; i++) Lcd_Chr_CP(character[6][i]);
}

unsigned char Valor(unsigned char value,unsigned char a,unsigned char b)
{
switch(value)
{
case 0:
return(character0[a][b]);
case 1:
return(character1[a][b]);
case 2:
return(character2[a][b]);
case 3:
return(character3[a][b]);
case 4:
return(character4[a][b]);
case 5:
return(character5[a][b]);
case 6:
return(character6[a][b]);
case 7:
return(character7[a][b]);
case 8:
return(character8[a][b]);
case 9:
return(character9[a][b]);
default:
return(characterDot[a][b]);
}
}

void GerarCaractere(unsigned int Valor,unsigned char CasasDecimais)
{
char a,b,c,d=1;
if(CasasDecimais>3)CasasDecimais=0;
while(1)
{
if((CasasDecimais>0)&&(d!=CasasDecimais+1))
{
c=Valor%10;
Valor/=10;
}
for(a=0;a<4;a++)
{
for(b=0;b<3;b++)
{
Lcd_Chr(a+1,(20-(d*4))+(b+1),Valor((((CasasDecimais>0)&&(d==CasasDecimais+1)))?10:c,a,b));
}
}
d++;
if(d>5)break;
}
}

[/section] [/sections]
Obrigado e até o próximo post.

DATEK Tecnologia Eletrônica
[PIC][MIKROC][PROTEUS] Caractere Grande LCD
Tags:                             

Deixe uma resposta

%d blogueiros gostam disto: