Página 1 de 1

Enviar números decimais para um LCD

MensagemEnviado: 27 Mai 2007 19:42
por Iran
Usando um display LCD no PSoC temos as funções:

LCD_PrHexByte - que imprime um char em hexadecimal no LCD

LCD_PrHexInt - que imprime um int em formato hexadecimal no LCD

Como se faria para imprimir em decimal ?

Grato,
Zé Iran

MensagemEnviado: 27 Mai 2007 23:45
por Ricardo_Franco
Ola Senhores.
Zé Iran você não imprime números decimais apenas caracteres, ou seja converta numero (int ou float) em Char ou string.

MensagemEnviado: 28 Mai 2007 12:03
por Iran
Desculpem minha burrice mas ainda não entendi.

Uma variável char (8 bits) com um número em hexa, por exemplo 0x47, que corresponde em decimal a 71 deve ser convertida para ascii antes de ser enviada para o display, portanto deverá ser enviado 0x30 0x37 0x31, onde:

0x30 código ascii do 0
0x37 código ascii do 7
0x31 código ascii do 1

É isso mesmo ?

A rotina abaixo faz isso ? Neste caso SourceLength = 1 e Destination[3] ?

//This function turns a charactor array in binary at Source to an ASCII string at destination
//Destination must be (Source * 2 + 1) bytes long or you will get buffer overruns

void Bin2Ascii(unsigned char Source[], int SourceLength, unsigned char Destination[])
{
Destination[SourceLength * 2] = '\0';
while(SourceLength != 0)
{
Destination[SourceLength * 2 - 2] = Source[SourceLength - 1];
Destination[SourceLength * 2 - 1] = Source[SourceLength - 1];
Destination[SourceLength * 2 - 2] &= 0x0f;
Destination[SourceLength * 2 - 1] &= 0xf0;
Destination[SourceLength * 2 - 1] >>= 0x4;
if(Destination[SourceLength * 2 - 2] <= 0x9)
Destination[SourceLength * 2 - 2] |= 0x30;
else
{
Destination[SourceLength * 2 - 2] |= 0x60;
Destination[SourceLength * 2 - 2] -= 0x9;
}
if(Destination[SourceLength * 2 - 1] <= 0x9)
Destination[SourceLength * 2 - 1] |= 0x30;
else
{
Destination[SourceLength * 2 - 1] |= 0x60;
Destination[SourceLength * 2 - 1] -= 0x9;
}
SourceLength--;
}
}


Grato,
Zé Iran

MensagemEnviado: 28 Mai 2007 12:09
por andre_luis
Eu uso a seguinte função :

Código: Selecionar todos
void WriteNumber3digits( unsigned char num )
{
   unsigned char dig;
   dig = num / 100 + '0';
   if ( ( dig == 0 ) && ( ISCHRBRANCO ) ) SayChar( APAGADO );
     else SayChar( dig );
   dig = (num % 100) / 10 + '0';
   SayChar( dig );
   dig = (num % 10) + '0';
   SayChar( dig );
}


Observe que se for menor que 100, ele nao escreve o digito das centenas.

+++

MensagemEnviado: 29 Mai 2007 10:54
por Ricardo_Franco
Ola Senhores
Muito bom André, essa rotina é dez funciona para qualquer C. Mas é podemos também utilizar algumas funções de manipulação de string veja o exemplo abaixo.


void EnviaLCD (void)
{
char *pntConverte;
char strValorString[10];
int intValorDecimal;

itoa(pntConverte, intValorDecimal, 10); //transforma int em ponteiro *char
strcpy(strValorString,pntConverte); //copia o valor do ponteiro para a string

LCD_PutString(strValorString);
}


Boa sorte

MensagemEnviado: 29 Mai 2007 11:23
por Iran
Beleza André,

Batata, dei uma bulidinha (como se diz lá na Paraíba) no código e ficou do jeito que eu queria.

Grato,
Zé Iran

PS. Não tinha visto esta do Ricardo, vou testar tb, grato Ricardo.

MensagemEnviado: 29 Mai 2007 11:24
por andre_luis
Boa dica Ricardo.

Como hoje em dia praticamente todos os compiladores são full ansi compatible, talvez seja mesmo melhor usar essas bibliotecas do que as rotinas, que certamente consomem mais processamento do uC.

Iran, se tiver como voce medir isso numa simulação seria legal, para quantificarmos o quão mais rápido ( supostamente ) é a biblioteca.

+++