Estou aprendendo a utilizar o compilador C18 e tomando o livro do Alberto Noburo como referência, e no capítulo 13, tem um exemplo bem interessante de uso de canal AD para leitura de teclas através de um dividor de tensão.
Estou com uma dúvida, que pode parecer esdrúxula para muitos, mas a vontade de entender o funcionamento é maior que o interesse de apenas copiar o exemplo e ver funcionando na protoboard.
Vamos ao fragmento do código:
- Código: Selecionar todos
//Matriz
unsigned int range_tensao [13]={ 300,500,700,900 .... };
- Código: Selecionar todos
//Atribui valor ao botão e verifica validade dele
unsigned char _checa_tecla(unsigned char desc-tecla_ant)
{
tecla=0;
valor_tensao=converte_tensao(); // chama funcao para ler canal
if (valor_tensao > 300)
{
for(cont_t=1; cont_t<13; cont_t++)
{
if (valor_tensao>=range_tensao[cont_t-1] && valor_tensao<range_tensao[cont_t])
{
if (tecla_anterior!=cont_t)
tecla=filtro_teclado(cont_t);
else
tecla=cont_t;
break;
}
}
}
if (tecla_anterior==tecla)
tecla=0;
else
tecla_anterior=tecla;
return nome_tecla (tecla); //retorna caracter corresp. a tecla pressionada
}
Na variável cont_t ... entendi que ela é incrementada a cada vez que passa pelo for, através da comparação entre valores da matriz [cont_t-1] e [cont_t] e retornando o valor da "posição" que pelo entendipo por mim ao final é o mesmo de cont_t sendo este a tecla pressionada.
No código valor_tensao e filtro_teclado são funções do firm, não achei necessário digitá-las.
Pergunto ... a lógica está certa? ou tem algo errado?