Ir ao conteúdo

Varredura teclado matricial travando PIC


crosspopz1

Posts recomendados

Postado

Boa tarde galera.

Estou fazendo um projeto que utiliza um PIC16F877A com um teclado matricial.

Está tudo funcionando, porém quando apertamos uma tecla da linha 4 do teclado, o PIC trava.

A linha 4 está ligada no pino B6 do PIC.

Creio que seja na programação ou varredura, pois quando inverto a linha, colocando em outro pino, a linha que coloquei no pino B6 trava também.

Segue codigo para uma possivel avaliação.

Obrigado!


#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
/**************************************************************************/

Postado
Boa tarde galera.

Estou fazendo um projeto que utiliza um PIC16F877A com um teclado matricial.

Está tudo funcionando, porém quando apertamos uma tecla da linha 4 do teclado, o PIC trava.

A linha 4 está ligada no pino B6 do PIC.

Creio que seja na programação ou varredura, pois quando inverto a linha, colocando em outro pino, a linha que coloquei no pino B6 trava também.

Segue codigo para uma possivel avaliação.

Obrigado!


#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
/**************************************************************************/

Ninguém???????????????????

Postado

Seguinte,faça uma experiencia.

Ative o MCLR,e deixe-o em nível alto.

Deixe o circuito funcionando e repara se voce encostar o dedo com um pedaço de resistor no pino se o PIC trava.

Eu tive um problema semelhante com outro PIC que compartilhava o pino como o PGM com uma porta eu não conseguí solução,pode não ser o seu caso.

Postado
Seguinte,faça uma experiencia.

Ative o MCLR,e deixe-o em nível alto.

Deixe o circuito funcionando e repara se voce encostar o dedo com um pedaço de resistor no pino se o PIC trava.

Eu tive um problema semelhante com outro PIC que compartilhava o pino como o PGM com uma porta eu não conseguí solução,pode não ser o seu caso.

Na realidade, o pino 1, referente ao MCLR sempre fica ligado na tensão.

Se eu deixo desligado o PIC nem funciona.

Postado
Deixe o circuito funcionando e repara se voce encostar o dedo com um pedaço de resistor no pino se o PIC trava.

Aguardando resposta...

Postado
Aguardando resposta...

Segurei um resistor e encostei no PINO 1 (MCLR) e não travou não.

Trava? trava como? Reset? Ou para de rodar e o valor do display fica estático?

Abs.

Eu aperto o 1, funciona, 2 funciona, até o 9 funciona.

Apertando o 0 ou qualquer da ultima linha do teclado o display trava no ultimo botão apertado, que não seja da ultima linha e não sai mais daquilo, só volta a funcionar quando desliga o PIC e liga.

Postado
Isso ta me parecendo pau no HW, posta o esqueme elétrico se tiver.

O código em sim não tem nada de mais...Mas vou analisar melhor.

Abs.

Pode ser o esquema do ISIS?

circuitov.th.jpg

Só pra adicionar uma informação.

No esquema acima mostramos que as colunas estão ligadas no VCC com alguns resistores.

Nos testes práticos o PIC trava quando ligamos as LINHAS no GND com resistor, quando ligamos as linhas no VCC com resistores ou deixamos sem ligar em nenhum lugar (Como no esquema, direto no PIC) ele não trava, mas não funciona.

Uploaded with ImageShack.us

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...