como criar um programa para ler um teclado matricial?

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

como criar um programa para ler um teclado matricial?

Mensagempor renan-papaco » 28 Jul 2013 22:25

eu devo ter uma ideia de como funciona este programa... a varredura das colunas é feita de modo continuo enquanto que nenhuma tecla é pressionada, quando uma tecla é precssionada o sinal da coluna correspondente a ela vai pra linha correspondente a sua posição e é lida pela CPU... sei que para cada tecla apertada tem uma operação lógica que condiz assim: posição armazenada da coluna + nivel lógico obtido na linha de acordo com a tecla pressionada, que pode interromper a varredura ou não... eu já fiz um circuito deste no hardware e funcionou perfeitamente... mas eu não consigo de fato fazer o programa pra isso... como controlar um teclado somente por software... pois tudo se baseia em contar uma variável q seria a coluna e somar o valor dessa variavel com o valor obtido nas linhas de acordo com a tecla pressionada...isso seria ótimo tambem pra expandir as entradas de um MCU usando multiplexadores como o 74LS151 por exemplo...e controlar 8 entradas usando 4 vias do microcontrolador poderiam me ajudar apênas explicando detalhadamente o código?
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Re: como criar um programa para ler um teclado matricial?

Mensagempor Red Neck Guy » 29 Jul 2013 08:18

Só exemplificando, falta fazer o filtro de repetição e outras coisas mas pra um esboço de 2 minutos está quase funcionando.

cpp code
unsigned char bufferColunas[8][4];
///função chamada periódicamente
/// (dentro de uma int de um timer ou no loop principal
/// mas coninuamente)
void func_varredura(void){
static unsigned char amostra=0;
unsigned char i;

for(i=0;i<4;i++)
{
MACRO_HABILITA_LINHAS(i);
bufferColunas[(amostra++)&0x07][i] = PORT & MASCARA_TECLAS;
MACRO_DESABILITA_LINHAS(i);
}
}

unsigned char get_tecla(void){
unsigned char i,j,k;
unsigned char cont;
unsigned char retorno=0;

for(i=0;i<4;i++)
for(j=0;j<8;j++){
cont=0;
for(k=0;j<8;k++){
if(bufferColunas[k][i]&(0x01<<j))
cont++;
if(cont>5){
retorno = (i*4)+j;
break;
}
}
}

return retorno;
}
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Re: como criar um programa para ler um teclado matricial?

Mensagempor andre_luis » 29 Jul 2013 08:19

Renan,


Dá uma olhada na rotina que sugeri no tópico abaixo.
Ele possui a vantagem de ler a coluna e a linha inteira, ao invéz de escanear pino a pino, que é mais comum de se observar por aí.

viewtopic.php?t=2968&p=19797

Código: Selecionar todos
unsigned char VarreKey ( void )
{
unsigned char TeclaLendo = 0 ;

PORTA_TECLADO = LINHAS                                     ;
Delay(4)                                                   ;
TeclaLendo = (~( PORTA_TECLADO | COLUNAS ))                ;
if ( TeclaLendo )
   {
   PORTA_TECLADO = COLUNAS                                 ;
   Delay(4)                                                ;
   TeclaLendo += (~( PORTA_TECLADO | LINHAS ))             ;     
   return ( TeclaLendo )                                   ;
   }
   else return ( NO_KEY )  ;
}



+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: como criar um programa para ler um teclado matricial?

Mensagempor renan-papaco » 02 Ago 2013 14:54

andre_teprom escreveu:Renan,


Dá uma olhada na rotina que sugeri no tópico abaixo.
Ele possui a vantagem de ler a coluna e a linha inteira, ao invéz de escanear pino a pino, que é mais comum de se observar por aí.

viewtopic.php?t=2968&p=19797

Código: Selecionar todos
unsigned char VarreKey ( void )
{
unsigned char TeclaLendo = 0 ;

PORTA_TECLADO = LINHAS                                     ;
Delay(4)                                                   ;
TeclaLendo = (~( PORTA_TECLADO | COLUNAS ))                ;
if ( TeclaLendo )
   {
   PORTA_TECLADO = COLUNAS                                 ;
   Delay(4)                                                ;
   TeclaLendo += (~( PORTA_TECLADO | LINHAS ))             ;     
   return ( TeclaLendo )                                   ;
   }
   else return ( NO_KEY )  ;
}



+++



eu vou estudar esse código seu... e tentar adaptar ele pro que eu quero fazer... depois volto aki pra contar como foi a experiência
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56


Voltar para 8051

Quem está online

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

x