Página 1 de 2

Ajuda com Display LCD caracter especial

MensagemEnviado: 12 Abr 2009 21:19
por tmarchesi2
Pessoal, mais um problema simples que eu não estou conseguindo resolver.


Eu quero escrever este caracter no display lcd e não ° e não consigo. Estou fazendo um termometro com o lm35.


lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Temp: C");

ftoa(canal0,2,conversao0);
lcd_gotoxy(6,0);
lcd_putsf(conversao0);

lcd_gotoxy(12,0);
lcd_putsf('0xBA'); da erro character constant is too long


Compilador Code vision + atmega8.

Sei que deve ser algum detalhe bobo que eu nao estou conseguindo corrigir.

Grato a todos;

Vlw

MensagemEnviado: 12 Abr 2009 22:55
por tmarchesi2
Galera, ficou assim o código:

lcd_gotoxy(0,0);
lcd_putsf("Temp: C ");

ftoa(canal0,2,conversao0);
lcd_gotoxy(6,0);
lcd_puts(conversao0);


lcd_gotoxy(12,0);
ascii = 0xDF; // caracter °
lcd_putchar(ascii); // da erro character constant is too long
delay_ms(2000);


Eu acredito que de pra melhorar o código, porém está primeira versão está funcionando.

Como dica do nosso amigo Ssandei aqui do forum, o pulo do gato foi pesquisar a tabela ascii para lcd, pois não sei até onde isso é padrão, pois na primeira tabela ascii que pesquisei para o mesmo caracter o codigo hexa era BA.

encontrei aqui a tabela:

http://www.ics.uci.edu/%7Eneslab/labs/lab2/lab2.html

Quem souber como melhorar isso, pode comentar;


Valeu;

MensagemEnviado: 12 Abr 2009 23:12
por guest2003
Todo LCD (destes de caracter e tals...)

Tem se nao me engano 8 posicoes que voce pode programar o caracter que voce quiser...

Ai voce pode ate programar um °C junto no mesmo caracter pra ficar mais legal e ocupar uma posica na tela a menos... e garantir compatibilidade entre LCDs diferentes. (ja que 99% tem estas posicoes programaveis)

[]'s

MensagemEnviado: 13 Abr 2009 10:34
por brasilma
Marchesi,

Não existe esse caractere na tabela do LCD - consulte a tabela de caracteres disponíveis no data-sheet - já vi algumas pessoas usando o simbolo "quadradinho" para isso.

Se desejar pode criar o simbolo, como o Guest comentou existe espaço na memória do LCD para 8 caracteres do usuário.

Abraços.

MensagemEnviado: 13 Abr 2009 13:03
por tmarchesi2
Então,

No segundo post que eu fiz, eu consigui escrever o caracter "bolinha", ta funcionand legal, porém eu utilizei 3 prints no display.

lcd_putsf("Temp: xx.xx °C ");
lcd_puts(conversao0);
lcd_putchar(ascii);

Será que não tem como fazer isso de uma forma mais econômica ?


ABraço

MensagemEnviado: 13 Abr 2009 23:15
por styg
eu uso o o valor 0xDF pra esse simbolo de graus, é só mandar esse valor como data. acho que era dele que o brasilma tava falando.. (quadradinho)

MensagemEnviado: 30 Abr 2009 19:12
por vohr56
No projeto que fiz utilizei o 0XDF também, no codevision. Ficou assim:



lcd_gotoxy(0,0);
sprintf(temp_display,"Temp 1=%5.2f%cC ",temp,0xdf);
lcd_puts(temp_display);


Abraços!!

MensagemEnviado: 03 Mai 2009 19:07
por tmarchesi2
Fala Vorh;

No seu método está economizando mais linhas, fica mais interessante programar assim. Eu só preciso entender melhor como este sprintf funciona. Eu acredito que no manual do C.V. dever ter mais parametros explicando.

Grato pela ajuda, era isso que eu estava procurando, vou tentar implementar.


Tmarchesi

MensagemEnviado: 03 Mai 2009 19:29
por guest2003
Vale lembrar que nem sempre menos linhas de programa equivalem a menos memoria ou melhor performance...

em alguns casos é o contrario...

Inclusive vi que você esta usando ponto flutuante, em ambiente embarcado sempre que possivel fuja disso !!

por exemplo, faça a conta com inteiros e depois ajuste a virgula...

Quer dividir um valor por 1.567 ... multiplique a entrada por 1000 e divida pelo inteiro 1567 e nao utilize ponto flutuante... vai ver que seu consumo de codigo / performance vão mudar muito... (se precisar de casa decimais, multiplique a entrada mais ainda... 10000 ou 100000)

ai na resposta voce apenas ajusta a virgula...

digamos 100 / 1.23 ... ai voce faz 100000 (100x1000) / 123 (1.23x100)

isso resulta em 813 que equivale a 81.3 ... pois temos que deslocar 1 casa na virgula (1000/100)

[]'s

MensagemEnviado: 04 Mai 2009 13:22
por vohr56
tmarchesi2 escreveu:Fala Vorh;

No seu método está economizando mais linhas, fica mais interessante programar assim. Eu só preciso entender melhor como este sprintf funciona. Eu acredito que no manual do C.V. dever ter mais parametros explicando.

Grato pela ajuda, era isso que eu estava procurando, vou tentar implementar.


Tmarchesi


A sintaxe do sprintf é :

sprintf(string,"format",argumentos);

ele pega o texto formatado com os argumentos e joga-os para a string.
Logo no exemplo que fiz a string temp_display vai receber o texto formatado ja com o valor da temperatura e com o símbolo º.



guest2003:

Eu sabia que o float gasta muita memória, mas ainda não tinha pensado nesta sua implementação. Agora, coo poderia implementar este ajuste da virgula?

MensagemEnviado: 05 Mai 2009 08:07
por tmarchesi2
Vorh56

Qual formato de variável eu devo especificar para o caso da variável temp_display ? ou qual tipo de dado ela pode carregar ? (char , float int).

Está semana se tudo der certo, eu já implemento no tcc.


Abraço;

MensagemEnviado: 05 Mai 2009 09:53
por tmarchesi2
Deu certo;

Ja fiz os testes aqui. Consegui manipular o caracter da forma que eu precisava.


Se alguém precisa eu posto o trecho código.
Tem um exemplo no C.v com o DS1820, também ajuda pra quem precisar.


Grato;

Abraço a todos

MensagemEnviado: 06 Mai 2009 16:03
por Ander_sil
Só para dar minha contribuição:

Eu já fiz isso da seguinte maneira usando sprintf:

Código: Selecionar todos
// No inicio do programa declarei a variavel simbolo da seguinte forma:
// Notem que o primeiro byte da string é espaço;
char xdata simbolo[]=" C";

// Antes de formatar no buffer coloco o simbolo de grau:
simbolo[0]=223;

// Formato a string no buffer usando sprintf:
sprintf((char*)buffer,"TEMP = %.1f%s", (((float)(ADC0.channel0 * VREF) / 255) - 0.400) / 0.0195, simbolo);

// Envio para o LCD na linha 2 centralizado:
LCD_printf(buffer,LINHA2,CENTRO);


Depois no Keil 8051 eu fiz minha função de printf para LCD, mas não sei se funciona no CodeVision porque acho que ele não é ANSI-C mas vou postar mesmo assim.

Código: Selecionar todos
//------------------------------------------------------------------------
// Parameters:
// IN  row:     LCD display row     (1 to 4)
// IN  column:  LCD display column  (1 to 40)
// IN  *fmt:    format string
// Return: 0 if OK or -1 if error
//------------------------------------------------------------------------
int Printf_LCD(char linha, char coluna, const char *fmt,...)
{
   char xdata lcdstring[DISPLAY_MAX_COLUMNS+1];
   unsigned int xdata j=0;
   va_list arg_ptr;   

   if((linha == 0) || (linha > DISPLAY_MAX_RAWS) || coluna > DISPLAY_MAX_COLUMNS)
   {
      return (-1);
   }

   va_start(arg_ptr,fmt);   
   j += vsprintf(lcdstring + j, fmt,arg_ptr);
   LCD_goto_xy(linha, coluna);
   LCD_EnviaString(lcdstring);
   va_end(arg_ptr);
   return 0;
}


É preciso incluir a biblioteca:
#include <stdarg.h>

Ex: Para colocar a hora na primeira linha coluna 3 " 00:00:00 "
Código: Selecionar todos
Printf_LCD(1,3,"%02d:%02d:%02d",DateTimer.hora,DateTimer.min,DateTimer.seg);

ou
Código: Selecionar todos
if(Printf_LCD(1,3,"%02d:%02d:%02d",DateTimer.hora,DateTimer.min,DateTimer.seg))
               ErroAoEscreverLCD();

// No exemplo de Temperatura lá no começo não precisa do sprintf fica assim:
Printf_LCD(2,1,"TEMP = %.1f%s", (((float)(ADC0.channel0 * VREF) / 255) - 0.400) / 0.0195, simbolo);


é isso ai

falow!

MensagemEnviado: 07 Mai 2009 20:08
por vohr56
guest2003 escreveu:Vale lembrar que nem sempre menos linhas de programa equivalem a menos memoria ou melhor performance...

em alguns casos é o contrario...

Inclusive vi que você esta usando ponto flutuante, em ambiente embarcado sempre que possivel fuja disso !!

por exemplo, faça a conta com inteiros e depois ajuste a virgula...

Quer dividir um valor por 1.567 ... multiplique a entrada por 1000 e divida pelo inteiro 1567 e nao utilize ponto flutuante... vai ver que seu consumo de codigo / performance vão mudar muito... (se precisar de casa decimais, multiplique a entrada mais ainda... 10000 ou 100000)

ai na resposta voce apenas ajusta a virgula...

digamos 100 / 1.23 ... ai voce faz 100000 (100x1000) / 123 (1.23x100)

isso resulta em 813 que equivale a 81.3 ... pois temos que deslocar 1 casa na virgula (1000/100)

[]'s


guest2003:

Gostaria de saber como que você faz para ajustar a virgula como você disse acima. O processo de multiplicar por 1000, 10000 e etc eu entendi. só não sei como ajustar a vírgula após isso.

Abraços!

MensagemEnviado: 07 Mai 2009 20:58
por guest2003
Veja,

Não existe virgula, certo ?!!? estamos fugindo do ponto flutuante...

Existe sim uma "virgula virtual" :) pois voce esta trabalhando com os numeros multiplicados por um fator...

ou seja... sua variavel vai conter o valor 31415927... porém no display voce exibe PI = 3.1415927 (ou seja, você sabe onde a virgula deve estar)

Por exemplo, se esta trabalhando com fator de 100x a virgula esta 2 casas deslocadas... se a variavel esta com o valor 123 isso equivale (para exibição em display por ex) a 1.23

Não sei se deu pra entender a ideia... qquer coisa avisa !

[]'s