sexta-feira, 12 de novembro de 2010

teclado matricial com PIC :

POR RAFAEL VARANGO AGUIAR


            CÓDIGO FONTE :


/**************************************************************************
* Teclado Matricial com Display *
***************************************************************************
* Rafael Varago de Aguiar Varago Automatics *
***************************************************************************
* Versão: 2.1 *
* Data: 24/07/2010 *
* *
* RAM: 4% ROM: 5% *
***************************************************************************
* Exibe o numero em um display 7 segmentos de acordo com o *
* botão pressionado no teclado matricial de 0 a 9 enter e backspace *
**************************************************************************/
#include <16f877a.h> // Informa o PIC
#device adc=10 // Configura conversor AD para 10 bits
#fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT // Configs internas
#use delay (clock=4000000) // Seleciona delay para 4Mhz de clock
/**************************************************************************
**************************************************************************/
// Definições de pinos
#define l0 pin_b3 // Primeira linha do teclado
#define l1 pin_b4 // Segunda " do "
#define l2 pin_b5 // Terceira " do "
#define l3 pin_b6 // Quarta " do "
#define c0 pin_b0 // Primeira coluna do teclado
#define c1 pin_b1 // Primeira " do "
#define c2 pin_b2 // Primeira " do "
/**************************************************************************
**************************************************************************/
// Variaveis globais
int cont; // Armazanam o valor da a exibir no display
/**************************************************************************
**************************************************************************/
// Tabela para converter o valor da contagem para exibir no display
byte const tabela[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xe7};
/**************************************************************************
**************************************************************************/
// Exibe no display o valor do botão pressionado
void zero(){ // Exibe zero no display

cont=0; // Cont é igual a 0
output_d(tabela[cont]); // Joga cont no display
return; // Retorna
} // Fim da sub-rotina
/*************************************************************************/
void um(){ // Exibe um no display

cont=1; // Cont é igual a 1
output_d(tabela[cont]); // Joga cont no display
return; // Retorna
} // Fim da sub-rotina
void dois(){ // Exibe dois no display

cont=2; // Cont é igual a 2
output_d(tabela[cont]); // Joga cont no display
return; // Retorna
} // Fim da sub-rotina
/*************************************************************************/
void tres(){ // Exibe tres no display

cont=3; // Cont é igual a 3
output_d(tabela[cont]); // Joga cont no display
return; // Retorna
} // Fim da sub-rotina
/*************************************************************************/
void quatro(){ // Exibe quatro no display

cont=4; // Cont é igual a 4
output_d(tabela[cont]); // Joga cont no display
return; // Retorna
} // Fim da sub-rotina
/*************************************************************************/
void cinco(){ // Exibe cinco no display

cont=5; // Cont é igual a 5
output_d(tabela[cont]); // Joga cont no display
return; // Retorna
} // Fim da sub-rotina
/*************************************************************************/
void seis(){ // Exibe seis no display

cont=6; // Cont é igual a 6
output_d(tabela[cont]); // Joga cont no display
return; // Retorna
} // Fim da sub-rotina
/*************************************************************************/
void sete(){ // Exibe sete no display

cont=7; // Cont é igual a 7
output_d(tabela[cont]); // Joga cont no display
return; // Retorna
} // Fim da sub-rotina
/*************************************************************************/
void oito(){ // Exibe oito no display

cont=8; // Cont é igual a 8
output_d(tabela[cont]); // Joga cont no display
return; // Retorna
} // Fim da sub-rotina
/*************************************************************************/
void nove(){ // Exibe nove no display

cont=9; // Cont é igual a 9
output_d(tabela[cont]); // Joga cont no display
return; // Retorna
} // Fim da sub-rotina
/**************************************************************************
**************************************************************************/
// Varredura de teclas
void scan1(){ // Faz primeira varredura

int aux=50; // Tempo de varredura
while(aux != 0){ // Laço para varredura
output_low(l0); // Joga 0 na coluna a ser varrida e 1 nas demais
output_high(l1);
output_high(l2);
output_high(l3);
if(!input(c0)){ // Testa primeira coluna
delay_ms(250); // Tempo para soltar tecla
um(); // Chama a sub-rotina correspondente a tecla
}
if(!input(c1)){ // Testa segunda coluna
delay_ms(250); // Tempo para soltar a tecla
dois(); // Chama a sub-rotina corresponde a tecla
}
if(!input(c2)){ // Testa terceira coluna
delay_ms(250); // Tempo para soltar a tecla
tres(); // Chama a sub-rotina corresponde a tecla
}
aux--; // Decrementa 1 de aux
delay_us(aux); // Tempo de atraso da varredura é igual a aux
}
return; // Retorna
} // Fim da sub-rotina
/*************************************************************************/
void scan2(){ // Faz segunda varredura

int aux=50; // Tempo de varredura
while(aux != 0){ // Laço para varredura
output_high(l0); // Joga 0 na coluna a ser varrida e 1 nas demais
output_low(l1);
output_high(l2);
output_high(l3);
if(!input(c0)){ // Testa primeira coluna
delay_ms(250); // Tempo para soltar tecla
quatro(); // Chama a sub-rotina correspondente a tecla
}
if(!input(c1)){ // Testa segunda coluna
delay_ms(250); // Tempo para soltar a tecla
cinco(); // Chama a sub-rotina corresponde a tecla
}
if(!input(c2)){ // Testa terceira coluna
delay_ms(250); // Tempo para soltar a tecla
seis(); // Chama a sub-rotina corresponde a tecla
}
aux--; // Decrementa 1 de aux
delay_us(aux); // Tempo de atraso da varredura é igual a aux
}
return; // Retorna
} // Fim da sub-rotina
/*************************************************************************/
void scan3(){ // Faz terceira varredura

int aux=50; // Tempo de varredura
while(aux != 0){ // Laço para varredura
output_high(l0); // Joga 0 na coluna a ser varrida e 1 nas demais
output_high(l1);
output_low(l2);
output_high(l3);
if(!input(c0)){ // Testa primeira coluna
delay_ms(250); // Tempo para soltar tecla
sete(); // Chama a sub-rotina correspondente a tecla
}
if(!input(c1)){ // Testa segunda coluna
delay_ms(250); // Tempo para soltar a tecla
oito(); // Chama a sub-rotina corresponde a tecla
}
if(!input(c2)){ // Testa terceira coluna
delay_ms(250); // Tempo para soltar a tecla
nove(); // Chama a sub-rotina corresponde a tecla
}
aux--; // Decrementa 1 de aux
delay_us(aux); // Tempo de atraso da varredura é igual a aux
}
return; // Retorna
} // Fim da sub-rotina
/*************************************************************************/
void scan4(){ // Faz quarta varredura

int aux=50; // Tempo de varredura
while(aux != 0){ // Laço para varredura
output_high(l0); // Joga 0 na coluna a ser varrida e 1 nas demais
output_high(l1);
output_high(l2);
output_low(l3);
if(!input(c0)){ // Testa primeira coluna
delay_ms(250); // Tempo para soltar tecla
zero(); // Chama a sub-rotina correspondente a tecla
}
if(!input(c1)){ // Testa segunda coluna
delay_ms(250); // Tempo para soltar a tecla
zero(); // Chama a sub-rotina corresponde a tecla
}
if(!input(c2)){ // Testa terceira coluna
delay_ms(250); // Tempo para soltar a tecla
nove(); // Chama a sub-rotina corresponde a tecla
}
aux--; // Decrementa 1 de aux
delay_us(aux); // Tempo de atraso da varredura é igual a aux
}
return; // Retorna
} // Fim da sub-rotina
/**************************************************************************
**************************************************************************/
// Rotina principal do programa
main(){ // Rotina principal

setup_adc_ports(no_analogs); // Configura todas as entradas como digitais
set_tris_a(0b00000000); // configuração da direção dos pinos de I/O
set_tris_b(0b00000111);
set_tris_c(0b00000000);
set_tris_d(0b00000000);
set_tris_e(0b00000000);
while(1){ // Laço infinito
scan1(); // Chama primeira varredura
scan2(); // " segunda "
scan3(); // " terceira "
scan4(); // " quarta "
} // Fim do laço
} // Fim do programa

Um comentário :

  1. amigo,por acaso você não teria um projeto de um teclado matricial desse para enviar em binário(via tx) para outro pic e no outro acionar relés para controle?

    ResponderExcluir

olá,digite aqui seu comentário!