Moderadores: 51, guest2003, Renie, gpenga
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;
}
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 ) ;
}
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 ) ;
}
+++
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante