Enviar números decimais para um LCD

Software e Hardware para uC PSoC

Moderadores: andre_luis, 51

Enviar números decimais para um LCD

Mensagempor Iran » 27 Mai 2007 19:42

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
Avatar do usuário
Iran
Word
 
Mensagens: 558
Registrado em: 16 Out 2006 18:10
Localização: Imperatriz - MA

Mensagempor Ricardo_Franco » 27 Mai 2007 23:45

Ola Senhores.
Zé Iran você não imprime números decimais apenas caracteres, ou seja converta numero (int ou float) em Char ou string.
Ricardo Franco
____________________________________________________________________________________________
web: www.engricardofranco.kit.net
Skype: engricardofranco
Fone Skype: (19) 3119-8162
Ricardo_Franco
Byte
 
Mensagens: 305
Registrado em: 11 Out 2006 20:53
Localização: Campinas - SP

Mensagempor Iran » 28 Mai 2007 12:03

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
Avatar do usuário
Iran
Word
 
Mensagens: 558
Registrado em: 16 Out 2006 18:10
Localização: Imperatriz - MA

Mensagempor andre_luis » 28 Mai 2007 12:09

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.

+++
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Ricardo_Franco » 29 Mai 2007 10:54

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
Ricardo Franco
____________________________________________________________________________________________
web: www.engricardofranco.kit.net
Skype: engricardofranco
Fone Skype: (19) 3119-8162
Ricardo_Franco
Byte
 
Mensagens: 305
Registrado em: 11 Out 2006 20:53
Localização: Campinas - SP

Mensagempor Iran » 29 Mai 2007 11:23

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.
Editado pela última vez por Iran em 29 Mai 2007 11:27, em um total de 1 vez.
Avatar do usuário
Iran
Word
 
Mensagens: 558
Registrado em: 16 Out 2006 18:10
Localização: Imperatriz - MA

Mensagempor andre_luis » 29 Mai 2007 11:24

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.

+++
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ


Voltar para Cypress

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x