LCD 4x16 - MikroC
 Mosaico
 Mosaico
 PIC
 LCD 4x16 - MikroC
  Registrar   Ajuda   Login

Tópico AnteriorTópico Anterior - Próximo TópicoPróximo Tópico
Tópico com 3743 visitas e 12 mensagens
Autor
Tópico: LCD 4x16 - MikroC
Renato
Usuário Nivel 5

Postagens: 173
Registro: 14/08/2005
Local: Vitoria - ES - Brasil
Idade: 30 anosSexo Masculino
 Postado em 03/12/2009 9:45:00 PM

Opa, beleza pessoal!

estou com uma dificuldade aqui em meus codigos que ja estou ficando bastnte irritado.

pois bem, estou com um LCD 4x16 e um PIC 18F452 que faz algumas coletas de dados no canal AD.

Estou utilizando um sensor de pressão da motorola MPX4250.

O sistema esta funcionando tudo corretamente o canal AD esta lendo corretamente o sinal e apresentando na primeira linha do LCD.

codigo:
Lcd_out(1,1,value_LCD);
Lcd_out(1,7,"Digital");

LCD - resultado.

+----------------+
1| 356Digital |
2| |
3| |
4| |
+----------------+



enfim, agora que vem o problema: estou querendo implementar mais algumas informações nas linhas 2, 3 e 4...

Na linha 2 --> o valor da tensão no canal AD
Na linha 3 --> o valor da pressao em KPa
Na linha 4 --> uma mensagem a cada 10 segundo "Gravando"

com o codigo abaixo, ao ligar o sistema, o display apresenta a primeira linha OK e as outras todas erradas onde me parece que estao misturando as informaçoes.

codigo
value_channel_lcd=Adc_read(0);
IntToStr(value_channel_lcd,value_LCD);
value_volts=(value_channel_lcd/(204.8));
value_pressure=(((0.20*value_volts)+0.04)/0.004);
IntToStr(value_volts,value_volts_LCD);
IntToStr(value_pressure,value_pressure_LCD);

Lcd_out(1,1,value_LCD);
Lcd_out(1,7,"Digital");

Lcd_out(2,1,value_volts_LCD);
Lcd_out(2,7,"Volts");

Lcd_out(3,1,value_pressure_LCD);
Lcd_out(3,7,"KPa");

Lcd_out(4,1,"GRAVOU!!!!");


abaixo a representação do que aparece no display

o "X" representa a posição toda preta no LCD.
e quando da o tempo a linha 4 aparece gravando e depois apaga(tem que apagar mesmo ;)).


+----------------+
1| 356Digital |
2| 1Volts9 X X|
3| 59KPaXX|
4|XX |
+----------------+



Exite algum macete para manter os dados apresentados em tempo real no display de 4 linhas?

Não estou conseguindo evoluir no sistema.

Se alguem puder dar uma ideia agradeço.

valewww

atenciosamente,

IP LogadoPróxima Mensagem
_blackmore_
Usuário Nivel 5

Postagens: 79
Registro: 12/09/2009
Local: - - BrasilSexo não informado
 Postado em 04/12/2009 1:35:00 AM

pelo que me lembro .. um display 16x4 nada mais é que dois displays 16x2 ... tu leu o datasheet?
a biblioteca do lcd comporta este modelo?
eu procurei uma que eu tenho por aqui mas não encotnrei ... dah uma googleada por um driver de 16x4 que tu acha algo pronto.

abrax!

IP LogadoMensagem AnteriorPróxima Mensagem
Angelli
Usuário Nivel 5

Postagens: 56
Registro: 11/12/2007
Local: São Paulo - SP - Brasil
Idade: 32 anosSexo Masculino
 Postado em 04/12/2009 7:57:00 AM

Olá Renato,
Veja e tire suas conclusões!
Tentei ajudar!

// Para LCD 16 x 4 : Endereços das Linhas:
// Linha 1 : 128 + 0 = LCD_CMD(128)
// Linha 2 : 128 + 64 = LCD_CMD(192)
// Linha 3 : 128 + 16 = LCD_CMD(144)
// Linha 4 : 128 + 80 = LCD_CMD(208)

Exemplo:

void display_value_on_LCD(int valeur,int m)

{if (flag_display_value==0) {
LCD_CMD(144);
LCD_Out_Cp("SAMPLE: ");
LCD_CMD(208);
LCD_Out_Cp(" VALUE: ");
flag_display_value=1;
}
LCD_CMD(144+10);
IntToStr(m, txt1);
LCD_Chr_CP(txt1[0]);
LCD_Chr_CP(txt1[1]);
LCD_Chr_CP(txt1[2]);
LCD_Chr_CP(txt1[3]);
LCD_Chr_CP(txt1[4]);
LCD_Chr_CP(txt1[5]);

LCD_CMD(208+10);
IntToStr(valeur, txt1);
LCD_Chr_CP(txt1[0]);
LCD_Chr_CP(txt1[1]);
LCD_Chr_CP(txt1[2]);
LCD_Chr_CP(txt1[3]);
LCD_Chr_CP(txt1[4]);
LCD_Chr_CP(txt1[5]);
flag_display_value=1;
}
Boa Sorte!

IP LogadoMensagem AnteriorPróxima Mensagem
jsbrown
Usuário Nivel 5

Postagens: 433
Registro: 08/05/2008
Local: - MG - Brasil
Idade: 85 anosSexo Masculino
 Postado em 04/12/2009 9:38:00 AM

oi. a única dif entre o lcdcmd e lcdout é o lcdrs: o bit de controle geralmente pino 4 dele. Portanto, baseando-se na dica do amigo angeli:
#define L1 128 + 0
#define L2 128 + 64
#define L3 128 + 16
#define L4 128 + 80

basta... (pseudocód):

lcdrs=0... enviando comando
port=L1+coluna...posiciona cursor ... ldcenable
lcdrs=1...enviando caracter
port="sua string" ... ldcenable
ou port=seu dado numérico ... ldcenable

fica muito + enxuto e distante das loucuras do ccs
abç



IP LogadoMensagem AnteriorPróxima Mensagem
Renato
Usuário Nivel 5

Postagens: 173
Registro: 14/08/2005
Local: Vitoria - ES - Brasil
Idade: 30 anosSexo Masculino
 Postado em 06/12/2009 12:56:00 PM

Opa, entendi como funciona pessoal!!

Ja fiz varias configurações diferentes e todas funcionaram. Ja coloquei em minha lista de codigos o modelo de configuração para LCD 4x16.

Bem, aproveitando a conversa, estou com uma pequena dificuldade agora com um valor analogico convertido para Volts (valor com ponto decimal)

Ai vai a dificuldade que eu estou enfrentando ....


Estou fazendo uma leitura no canal AD de 10bits ...

Minhas leituras
363
263
269
272
259

Pois bem, agora quero pegar o valor e transformar para Volts mas que ele seje composto da parte inteira e a decimal.

1.795V

entao eu fiz a seguinte manobra:

//DECIMAL
char v_integer;
unsigned int v_decimal;
unsigned long v_total;
char value_V_int[2];
char value_V_dec[3];
//***************

Main....
{
value_channel_lcd=Adc_read(0);

IntToStr(value_channel_lcd,value_LCD);

v_total = value_channel_lcd * 488; // (4.88mV/lsb => 5V / 1024 = 0.0048828125...V)
v_total = v_total / 100; // converter para mV
v_integer = v_total / 1000; // converter resultado de mV para "volts" para calcular valor inteiro
v_decimal = v_total % 1000; // resto do valor v_total para mostrar o decimal
IntToStr(v_integer,value_V_int);
IntToStr(v_decimal,value_V_dec);

display_value_on_LCD();
}

...
..

na função do display temos:

void display_value_on_LCD()
{if (flag_display_value==0) {
LCD_CMD(134);
LCD_Out_Cp("Digital");
LCD_CMD(194);
LCD_Out_Cp(".");
LCD_CMD(198);
LCD_Out_Cp("Volts");
}
LCD_CMD(128);
LCD_Chr_CP(value_LCD[0]);
LCD_Chr_CP(value_LCD[1]);
LCD_Chr_CP(value_LCD[2]);
LCD_Chr_CP(value_LCD[3]);
LCD_Chr_CP(value_LCD[4]);
LCD_Chr_CP(value_LCD[5]);

LCD_CMD(192);
LCD_Chr_CP(value_V_int[0]);
LCD_Chr_CP(value_V_int[1]);
LCD_CMD(195);
LCD_Chr_CP(value_V_dec[0]);
LCD_Chr_CP(value_V_dec[1]);
LCD_Chr_CP(value_V_dec[2]);
flag_display_value=0;
}

infelizmente o valor nao é apresentado da maneira correta e aparece fragmentado (incorreto)

Eu nao consegui ainda ver o porque disso.

Eu pensei em concatenar os valores e o ponto para uma unica string e depois mostrar no LCD, mas eu não consegui fazer isso... tambem nao sei se é possivel

Se alguem puder auxiliar em alguma desatenção minha fico agradecido.

atenciosamente,

Renato

IP LogadoMensagem AnteriorPróxima Mensagem
Renato
Usuário Nivel 5

Postagens: 173
Registro: 14/08/2005
Local: Vitoria - ES - Brasil
Idade: 30 anosSexo Masculino
 Postado em 14/12/2009 3:37:00 PM

Pessoal, esta dificil aqui ...


Não consigo nem por reza fazer o display apresentar um valor decimal na tela... pqp. Quando apresenta esta apresentando errado.... esta dificil

Se alguem puder me dar uma luz de como faço para apresentar um valor decimal no LCD eu agradeço.

Atenciosamente,

Renato

IP LogadoMensagem AnteriorPróxima Mensagem
jsbrown
Usuário Nivel 5

Postagens: 433
Registro: 08/05/2008
Local: - MG - Brasil
Idade: 85 anosSexo Masculino
 Postado em 15/12/2009 12:11:00 PM

Amigo isso é fácil. Se não quiser ver esta discussão
http://www.asm51.eng.br/phpbb/viewtopic.php?t=8894&postdays=0&postorder=asc&start=0
veja 1 dos itens dela:

#define un s[0] //só pra melhor identificar em alguma função
#define dez s[1]
#define cen s[2]
#define mil s[3]
#define dmil s[4]
unsigned int s[5]; //global
void separa(unsigned int dado)
{
unsigned char i=0;
while(dado)
{
s[i]=dado%10;
dado/=10;
i++;
}
}

O teu valor v_total já devidamente “convertido” em V e inteiro pode ser passado pra função separa(v_total) e os bytes pode ser colhidos em un,dez,cen,mil,dmil (que são globais) e enviados 1 a 1 pro display na ordem:
LCD_Chr_CP (mil); LCD_Chr_CP (‘.’); LCD_Chr_CP(cen); LCD_Chr_CP (dez); LCD_Chr_CP (un); // ou se preferir s[0],s[1]... autoexplicativo
Ou seja tem que “despedaçar” mais o v_total

testaê!!!
abç


IP LogadoMensagem AnteriorPróxima Mensagem
Renato
Usuário Nivel 5

Postagens: 173
Registro: 14/08/2005
Local: Vitoria - ES - Brasil
Idade: 30 anosSexo Masculino
 Postado em 15/12/2009 3:17:00 PM

Opa,,,,

Tem bastante sentido o despedaçar o valor, fiz o despedaçamento (palavra feia :P) da variavel inteira mas não funfou na hora de aprensetar no display.

Apresenta o caracter todo cheio o quadrado do caracter todo iluminado.

o display não mostra só variáveis do tipo char ?

Tentei passar a variavel diretamente inteira mas nao foi, depois tentei converter pra char mas não funfou direito


Mas estou tentando aqui...estou testando algumas artimanhas :)

Agradeço a ajuda com as informações sbreut

Atenciosamente,
Renato

IP LogadoMensagem AnteriorPróxima Mensagem
Renato
Usuário Nivel 5

Postagens: 173
Registro: 14/08/2005
Local: Vitoria - ES - Brasil
Idade: 30 anosSexo Masculino
 Postado em 16/12/2009 10:56:00 AM

Evolução. ....


Antes de mostrar o valor numérico é necessário convertê-lo no código ASCII corretamente

exemplo: para converter corretamente o numero '1' temos que enviar valor ASCII 49 - essa é a finalidade do comando IntToStr

Com isso, ao invés de me quebrar todo para converter e tudo mais, passei a utilizar a seguinte função:

void separa()
{
unsigned char cont=0;
while(v_total)
{
SVoltsC[cont] = (v_total % 10) + 48;
v_total/=10;
cont++;
}
}


ate agora esta funcionado parte da apresentação dos numeros no display, agora é o codigo de apresentação dos caracteres... mas estou trabalahndo aqui e jaja posto mais informações do que esta ocorrendo.


Abraços.

IP LogadoMensagem AnteriorPróxima Mensagem
Renato
Usuário Nivel 5

Postagens: 173
Registro: 14/08/2005
Local: Vitoria - ES - Brasil
Idade: 30 anosSexo Masculino
 Postado em 12/01/2010 2:18:00 PM

Soulução!!!

Resolvido o problema ... um deles era o formato da variavel que eu coloquei errado. O outro foi a maneira de apresentar a função IntToStr nao funcionou direito. Entao eu fiz a apresentação na mao dos caracteres.

A pressao em KPa é referente a leitura de um sensor da motorola MPX4520AP

Segue abaixo o codigo e uma imagem com o resultado.

Valew!


// Pinagem do display LCD
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;


char txt1[] = "TESTANDO@#$%&!<>";
int leitura_ad ;
unsigned char leitura_LCD[7];
unsigned long adc_value;
unsigned long kpa_value;
unsigned char d1,d2,d3,d4;
unsigned char k1,k2,k3;

#define printV lcd_chr(1,21,48+d1); \
lcd_chr_cp('.'); \
lcd_chr_cp(d2+48); \
lcd_chr_cp(48+d3); \
lcd_chr_cp(48+d4); \
lcd_chr_cp('V'); \
lcd_chr_cp('o'); \
lcd_chr_cp('l'); \
lcd_chr_cp('t'); \
lcd_chr_cp('s');

#define calcV d1=adc_value/1000; \
d2=(adc_value%1000)/100; \
d3=((adc_value%1000)%100)/10; \
d4=((adc_value%1000)%100)%10;

#define printkpa lcd_chr(2,23,48+k1); \
lcd_chr_cp(k2+48); \
lcd_chr_cp(k3+48); \
lcd_chr_cp('K'); \
lcd_chr_cp('P'); \
lcd_chr_cp('a');

#define calckpa k1=(kpa_value%1000)/100; \
k2=((kpa_value%1000)%100)/10; \
k3=((kpa_value%1000)%100)%10;

#define printdig lcd_chr(2,6,leitura_LCD[2]); \
lcd_chr_cp(leitura_LCD[3]); \
lcd_chr_cp(leitura_LCD[4]); \
lcd_chr_cp(leitura_LCD[5]); \
lcd_chr_cp('D'); \
lcd_chr_cp('i'); \
lcd_chr_cp('g'); \
lcd_chr_cp('i'); \
lcd_chr_cp('t'); \
lcd_chr_cp('a'); \
lcd_chr_cp('l');


void main(){

TRISA = 0xFF; // ALL INPUTS -> 1
TRISC = 0xD3; //0b11010011
ADCON1 = 0x00; // ALL OUTPUT -> 0

TRISB = 0XFF;
TRISA.RA0 = 1;
PORTA = 0;

Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,txt1);

while(1)
{
leitura_ad = adc_read(0);
IntToStr(leitura_ad,leitura_LCD);
adc_value=leitura_ad*(4.9);
kpa_value=(adc_value*0.05)+10;
calcV
printV
calckpa
printkpa
printdig
delay_ms(500);
}
}





Valew a ajuda de todos!

**Espero que o codigo acima possa ser de grande ajuda a todos que tiveram dificuldade e que estao procurando um exemplo direto de como fazer funcionar.

Atenciosamente.
Renato Zanardo

IP LogadoMensagem AnteriorPróxima Página
 Todos os horários são de Brasília (GMT -03:00)
 Nova Mensagem desde a sua Última Visita.
[***] Palavra proibida pelo moderador do Grupo de Discussão
Páginas: 1 2
Tópico AnteriorTópico Anterior - Próximo TópicoPróximo Tópico

Volta para o Topo da Página



Forum Now! - Criar seu forum grátis