Função para Edição de Variável no LCD

Software e Hardware para ATMEL

Moderadores: 51, guest2003, brasilma

Mensagempor Fandango » 13 Fev 2008 10:00

Maurício escreveu:Mas, desenvolver a tal da IHM é o maior terror da programação!! :lol: Não fosse isso, as coisas seriam bem mais simples!


Putz! É a mais cruel realidade. Estou apanhando prá burro.

Tentei ir pelo caminho apontado pelo Maurício, mas encontrei uma dificuldade cabulosa: Não consigo utilizar um campo de edição de tamanho fixo, do tipo [XXXXXX], porque ao converter de LONG para STRING, decrementar o dígito mais significativo até chegar a zero, e depois converter de STRING para LONG, na próxima chamada à função o que ocorre é um deslocamento para a esquerda da string exibida no LCD, porque como o número perdeu o dígito mais significativo, uma nova conversão de LONG para STRING, vai ter um dígito a menos.

Para exemplificar, imaginem o seguinte:
- Seja inicialmente o valor de num = 123456, ao chamar a função "decrementar" (análoga à incrementar apresentada pelo Maurício, e feitas as adequações necessárias para compilar com o WinAVR), num assumirá o valor 023456, pois decrementei o dígito mais significativo.
- Quando chamar a função decrementar novamente, a string exibida será 23456, ou seja perdi o zero à esquerda e o campo fixo de 6 dígitos agora terá apenas 5.

Cara, que parto ! :x

Vou tentar uma mistureba de idéias, ... aliás, vai aí uma sugestão para os idealizadores, desenvolvedores, colaboradores e demais desocupados que bolaram o WinAVR... Por que não publicam um release incorporando funções de edição de variáveis? Já que existem funções de manipulação, de conversão e o escambau a quatro, que tal queimar neurônios jovens nesse sentido (os meus já estão velinhos e cansados, hehehe).

À luta !
... e assim falou Zaratustra !
Fandango
Byte
 
Mensagens: 187
Registrado em: 11 Jun 2007 22:13
Localização: SC - Brasil

Mensagempor barboza » 13 Fev 2008 11:35

É só usar a formatação nas opções da função sprintf ou printf.

valor = 23456;

sprintf(string, "06%i", valor);



a string será = "023456"

Pois definiu 6 campos com inclusão de 0 a esquerda.


http://www.cplusplus.com/reference/clib ... rintf.html
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor Fandango » 13 Fev 2008 11:47

Beleza Barboza, só tem um detalhezinho. Para imprimir no LCD eu uso funções próprias, porque meu LCD está ligado via latch 74HC573, em modo de 4 bits, devido ao uso do Port-B do ATmega32 como barramento de dados.
Teria então que implementar essas funcionalidades do sprintf dentro das minhas funções? Aliás, taí uma coisa que eu nunca soube como se faz, isto é, redirecionar as funções de entrada e saída do C para minhas funções.
... e assim falou Zaratustra !
Fandango
Byte
 
Mensagens: 187
Registrado em: 11 Jun 2007 22:13
Localização: SC - Brasil

Mensagempor Maurício » 13 Fev 2008 13:38

Salve, Fandango.

Não. Vc não precisa alterar a função sprinft porque ela já está embutida no compilador. E sprintf só formata uma string, não dá saída dos dados.
Quem dá saída é PRINTF.

Quando vc usa um hardware específico (LCD em 4 bits, p.ex.), vc usa as bibliotecas próprias desse dispositivo, ou então reescreve algumas das rotinas de entrada e saída da máquina para direcionar para o dispositivo específico.

PUTCHAR e GETCHAR são as funções de entrada/saída de mais baixo nível no C, e que podem ser modificadas para um caso específico. Vc altera PUTCHAR, p.ex., para que ao invés de enviar o dado para a USART, envie para um dispositivo mapeado. Nesse caso, vc continua usando a função printf, que os dados serão impressos no dispositivo mapeado.
Se vc tem um dispositivo específico, então na maioria dos casos vc vai modificar somente estas duas funções, pois as funções de entrada/saída no C, passam por estas duas funções.

[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor Fandango » 13 Fev 2008 13:50

Salve Maurício !

Muito esclarecedora a tua explicação, entendi direitinho 8) . Valeu mesmo!

Pois bem, então vou acrescentar as dicas do Barboza e vamos ver como é que fica. Logo logo eu volto prá contar...

Aquele abraço!
... e assim falou Zaratustra !
Fandango
Byte
 
Mensagens: 187
Registrado em: 11 Jun 2007 22:13
Localização: SC - Brasil

Mensagempor Fandango » 13 Fev 2008 14:15

Gente, desculpem, mais um detalhe... "06%i" é para inteiros, só que a variável tem que ser LONG (6 dígitos -> 999999d).
O WinAVR acusa este erro. Tentei "06%l" mas não furunfa, o WinAVR chia denovo. Procurei na documentação do avr-libc mas não encontrei nada a respeito de saída para long.

Êta nêgo chato!
... e assim falou Zaratustra !
Fandango
Byte
 
Mensagens: 187
Registrado em: 11 Jun 2007 22:13
Localização: SC - Brasil

Mensagempor Maurício » 13 Fev 2008 17:03

Experimenta assim:

Código: Selecionar todos
valor = 23456;

sprintf(string, "%06Lu", valor);


[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor Fandango » 13 Fev 2008 17:20

Pois é Maurício,

Por increça que parível... não foi!
Mas valeu a sua dica, porque compilou sem chiar com "%06lu".

Infelizmente a "string" referente a "valor" ficou como "0623456" (hehehe), o bichinho entendeu que devia incluir o "06", e ainda por cima continua fazendo o mesmo, ou seja, ignorando os zeros à esquerda. Aliás esquerda rima com o que fiz.
Cara, tá de rosca! Acho que vou abortar a idéia da simplicidade e do generalismo e fazer um rebosteio complicado mesmo, senão não saio do buraco. Valeu pela força! mas...

Que se fueda!
... e assim falou Zaratustra !
Fandango
Byte
 
Mensagens: 187
Registrado em: 11 Jun 2007 22:13
Localização: SC - Brasil

Mensagempor Maurício » 13 Fev 2008 18:16

Use o L em minúscula! Coloquei a versão do Keil pro 8051 :oops:

Se não funcionar, então, acredito ser problema do seu compilador. Alguma configuração interna dele, já que no CodeVision rodou perfeitamente. No CodeVision existem umas opções para otimização do uso de inteiros pelas funções printf e sprintf. Experimenta ver se o seu compilador também tem essas opções.

Sem esquecer que é necessário incluir o arquivo STDIO.H, para usar as funções printf e sprintf.

[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor ze » 14 Fev 2008 14:57

olá, tem algumas rotinas minhas para lcd 4bits no post
http://asm51.eng.br/phpBB/viewtopic.php ... highlight=

de repente podem lhe dar 1 luz.
1 curiosidade coincidente: estava vendo 1 projeto que usava um LS573. Mas ele pelo menos pra mim é mosca branca. Você não poderia usar o barramento do portb e o sinal de lacth como enable lcd? (ci--) a não ser que usa os outros sinais de saída dele e/ou é um hw preexistente.
abrç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Anterior

Voltar para AVR

Quem está online

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

x