por Pask » 28 Jan 2007 09:12
Caro MOR_AL, quem disse para você que eu não gosto muito do assembly??? Na verdade, sou fã incondicional desta linguagem e é, justamente, aquela que eu mais conheço e com a qual eu melhor consigo programar! Já sei. Foi porque eu disse que o assembly é a linguagem dos "masoquistas" ?! Mas vou explicar: quando eu disse que o assembly é para quem gosta de sofrer eu estava me referindo a certos detalhes da linguagem. Por exemplo: Na Linguagem C "padrão ANSI-CCS", se eu quiser um atraso de tempo qualquer, eu escrevo "delay_ms(xxx)" e o compilador se encarrega de gerar o código necessário para este atraso de tempo sem nenhum esforço do programador, ok! Em Assembly, para fazer a mesma coisa, eu preciso escrever uma sub-rotina envolvendo algumas linhas de comandos com o timer0 ou outro timer qualquer, decrementar variáveis auxiliares, etc para chegar ao atraso de tempo desejado, ou mesmo usar a interrupção de timer, ou seja, o programador precisa desenvolver todo o código necessário de forma braçal, pois o montador MPASM não faz isto automaticamente! Outro exemplo: em C, quando eu escrevo "input_pin(rb0)", o compilador já direciona este pino do PIC como entrada e altera o TRISB automaticamente sem esforço do programador; em Assembly, para direcionar este pino como entrada, eu tenho que acessar o banco da RAM correto, enviar o byte correto para o work e dele para o TRISB para que o MPASM entenda que o pino RB0 deve ser uma entrada.
Portanto, em Assembly caro MOR_AL, tudo depende muito do esforço do programador e isto é "ótimo" !!! Graças a essa característica mais trabalhosa do assembly, o programador aprende muito mais sobre as "entranhas" do PIC, coisa que já não acontece em C que é uma linguagem mais dinâmica e direta! Eu também aprecio muito a linguagem C, só não a conheço o suficiente para desenvolver programas mais complexos.
Agora, eu quero que você veja, abaixo, um código que eu criei para separar um número binário em código BCD, ou seja, por exemplo, o número "0000 1010" binário que é o número 10 decimal, é separado em unidades e dezenas, ou seja, unidade 1 e dezena 0. E este código pode fazer a mesma coisa com qualquer número binário entre 0 e 99. Se vc quiser ampliá-lo para converter de 0 a 999 também pode e a modificação é simples. O que eu gostaria, é de algo semelhante para o programa do Fábio Pereira, porém, mantendo na linguagem C mesmo, ok. Aguardo seu retorno e lhe desejo um domingo com muita "macarronada" !
-------------------------------------------------------------------------------------
int aux=10;
int unidade;
int dezena;
//-----------------------------------------------------------------------------------
int tabela[]= {0b10111111, // 0
0b10000110, // 1
0b11011011, // 2
0b11001111, // 3
0b11100110, // 4
0b11101101, // 5
0b11111101, // 6
0b10000111, // 7
0b11111111, // 8
0b11100111}; // 9
void ajuste_dec(){ //função para o ajuste decimal
unidade=0;
dezena=0;
while (aux>0){
unidade++;
if(unidade==10){
unidade=0;
dezena++; }
aux--;
}
}
main(){ output_a(0);
output_b(0);
cmcon=7;
option=128;
while (true){
ajuste_dec();
output_low(pin_a0);
output_high(pin_a1);
output_b(tabela[unidade]);
output_low(pin_a1); output_high(pin_a0);
output_b(tabela[dezena]);
}
}
//-------------------------------------------------------------------------