Teclado 4X4

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Teclado 4X4

Mensagempor fabio_ » 12 Jun 2008 00:46

Preciso fazer um teclado 4X4 num 16F877A (4 Entradas e 4 Saídas)
Porém, preciso que as teclas possam ser pressionadas simultaneamente se que uma interfira no funcionamento da outra.
Me lembro de ter visto uma vez um circuito com diodos 1N4148 para esta função só que não consigo encontrar o bendito.
Alguém pode me ajudar?

Desde já agradeço.
fabio_
Byte
 
Mensagens: 177
Registrado em: 13 Jun 2007 12:08

Mensagempor fabim » 12 Jun 2008 08:01

como assim ?
Tipo se precionar a 1 e 2 juntas tem que reconhecer a 1 primeiro e desconsiderar a 2 até soltar a 1 ?

Fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor andre_luis » 12 Jun 2008 09:36

Já postei uma rotina aqui que permite identificar de 1 a 4 teclas simultaneamente na mesma linha ou coluna.

Dá uma olhada nesse tópico :

http://www.asm51.eng.br/phpbb/viewtopic.php?t=2968

Ela permite 120 combinações de teclas, com a restrição de que as telcas pressionadas simultaneamente estejam na mesma linha ou coluna.

Não precisa de diodo nem nada, pode usar um teclado de matriz convencional, só tendo o cuidado de colocar resistores de pelo menos 100R em série com todos os 8 pinos do teclado, caso o microcontroldador não suporte 2 saidas em curto, se o infeliz pressionar uma combinação inesperada.

+++
"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

Mensagempor fabio_ » 12 Jun 2008 15:41

é quase isso xará,

se estiver com a 1 e 2 pressionadas preciso saber que a 1 e a 2 estão pressionadas, cada uma num flag diferente, e assim por diante com TODAS as chaves.
Cada uma delas tem uma função e nenhuma delas pode depender da outra.

Até +.
fabio_
Byte
 
Mensagens: 177
Registrado em: 13 Jun 2007 12:08

Mensagempor andre_luis » 12 Jun 2008 15:53

ok,

Mas a função desse flag é realizada pelo mapeamento (TECLA1, TECLA2, TECLA1E2, etc...). Cada valor retornado pela função estará associado a uma combinação diferente de teclas pressionadas.

Bom, sem querer parecer deboxado, mas se já é complicado pressionar 3 teclas ( CTRL+ALT+DEL ), imajina 16 teclas...haja dedo pra isso.
:)


+++
"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

Mensagempor fabim » 12 Jun 2008 16:01

licensa.

Ai minha cabeça.

Desculpe

Podem continuar.
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor fabio_ » 12 Jun 2008 16:19

só que na minha aplicação não são utilizados apenas simples botões, são chaves tipo toggle de 3 posições, logo, cada chave serve como 2 teclas.
Além disso é possível ter até 5 pontos acionados ao mesmo tempo utilizando somente uma mão .... mas acredito que isso não vem ao caso.

Só quero saber se é possível ou não ...

Já tenho esta aplicação funcionando com 4 74HC165, porém, estou precisando reduzir o tamanho do circuito e pensei em eliminar estes 4 CIs.
fabio_
Byte
 
Mensagens: 177
Registrado em: 13 Jun 2007 12:08

Mensagempor fabim » 12 Jun 2008 16:27

olha eu não sei bem se você conhece o teclado 4X4. mas vamos no seguinte.

Você o ligou no portb e ativou int por mudânça de estados.

Faz-se uma varredura da seguinte forma.
COL-1 = 1
Le-se nible alto
Col-1 = 0
col-2 = 1
Le-se nible alto
.....................

No fim da varredura pode-se saber se as 16 teclas estavam precionadas, ou se apenas a 1 e o A, ou 1,2,3.....

Qual o seu problema com isso ? só tem uma coisa aí.

Existem duas técnicas - 1° ler de tempos em tempos ou através de mudança de estado.

Por mudânça de estado, você so pode sair do vetor de interrupção ligando a int apos as teclas terem sido soltas, caso contrario no soltar da tecla acontece a int novamente "" convenhamos nada de mais apenas prever na rotina"rs.

Fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor andre_luis » 13 Jun 2008 08:05

Fábio,

.... mas acredito que isso não vem ao caso. Só quero saber se é possível ou não ...


Pra início de conversa, isso vem ao caso sim, pois explica melhor a situação.

fabim,

Estou com uma dúvida a respeito de como implementar essa função da maneira que voce falou.
Se fossemos retornar dessa função o valor de qualquer combinação de teclas pressionadas, teríamos um total de 2^16 ( = 65536 ) combinaçoes diferentes, e assim precisaria de 2 Bytes para armazenar o valor, mas a varredura é realizada nibble-a-nibble.

Como seria faito isso ?

+++
"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

Mensagempor fabim » 13 Jun 2008 08:57

bom se esse é o causo.

botões Array [0...16] of byte
são 17 bytes.
byte 0 = numero de teclas que foi precionada
1...16 = teclas precionadas. de 0 a F

interrupt.
foi interrupção por mudança de estado ? Sim {

portb := portb and 0 or "coluna 1"

portb,4 = 1 ?

sim!

botões[0] = botões[0]+1
tem = botões[0]+1
botões[tem] = A;

não!
portb,5 = 1 ?

sim.......!!!

.................................................


Observe o seguinte, que cada teste não usa uma casa dos 16 bytes, e sim o primeiro byte do array indica quantas teclas foram precionadas simultaneamente, e conforme vai fazendo o teste das colunas e lendo as linhas no MSB, ao que identifica uma nova tecla ele pega a variavel tem, que esta indicando o seguinte.
"numero de botões que ja foram precionados + 1" + 1 pra eu não sobreescrever sobre o byte anterior..

Sacou a jogada ?

fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor styg » 13 Jun 2008 09:08

axo que nao tem tanto stress, se pode fazer a varredura normalmente só que em vez de parar quando encontra a tecla desejada, voce continua pra verse tem mais de uma pressionada.

dai c pode fazer algo do tipo, atribuir um valor a cada tecla (como aquele s valores em prova de vestibular). p ex.
tecla 1 -> valor = 1
tecla 2 -> valor = 2
tecla 3 -> valor = 4
tecla 4 -> valor = 8

dai voce define uma variavel 'teclas_p' inicia ela com zero no inicio da varredura do teclado e vai somando a ela o valor de cada tecla pressionada.
ao final da varredura voce sempre vai ter um valor unico que indicara qual, ou quais as teclas foram pressionadas.

tecla 1 + 2 -> valor = 3
tecla 2 + 4 -> valor = 10
tecla 1 + 2 + 4 -> valor = 11
tecla 1 + 3 + 4 -> valor = 13

tendeu?
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor andre_luis » 13 Jun 2008 10:30

Ok,

Entendi...

Código: Selecionar todos
0 1  2  3 
4 5  6  7 
8 9  a  b
c d  e  f

Nesse caso teríamos :

Código: Selecionar todos
1 para tecla 0
2 para tecla 1
4 para tecla 2
8 para tecla 3
...
32768 para tecla f

Interessante. Só fico curioso pra saber se realmente funciona com mais de uma 'chave' pressionada na mesma linha, quando a varredura for feita pela coluna, mas parece que funciona sim.

+++
Editado pela última vez por andre_luis em 13 Jun 2008 10:35, em um total de 2 vezes.
"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

Mensagempor ze » 13 Jun 2008 10:34

olás,
creio que a solução do teprom foi a + eficaz que vi (desconsiderando o fato de usar uma porta inteira). ela lê os nibbles e remonta o byte. num precisa de diodos.
veja uma opção dentro de uma int:
Código: Selecionar todos
unsigned char tec;
/**********************************************************************/
//interrupção timer1: tratamento dos displays, leds e teclado
static void interrupt
timer1_int(void)
{
TMR1IF=0;  //zera flag timer1
TMR1H=tm1h;  //restaura 400Hz int
TMR1L=tm1l;
T1CON=0b00010101; //prescaler /2,osc. dis.,not sync.,interno fosc/4,timer on
TRISB=0xf0;tec=PORTB;
TRISB=0x0f;tec+=PORTB;
...
...
}

é claro, setar pullups internos (RBPU=0) nas inicializações.
de novo, caso tenha um port de 8 bits disponível só pro teclado, esta é a melhor solução que já vi a té hoje. parabens andré!!!
obs: a [simplista] rotina acima apresenta uma irregularidade se pressionadas muitas teclas em paralelo. mas para individuais e até 3 está ok. simulei-a no proteus. se quiser os arquivos pra avaliar/evoluir...
abrç
Editado pela última vez por ze em 16 Jun 2008 08:25, em um total de 1 vez.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor andre_luis » 13 Jun 2008 10:44

lellis,

Obrigado pelo que me ´toca´.

O grande mérito da rotina que indiquei é a redução no tempo de leitura de teclado, que consome um processamento excessivo do microcontrolador, mas a dica do styg me pareceu interessante também, pois com isso, poderia se usar a rotina de teclado para expandir a capacidade de I/O de um sistema.

Exemplo : Usando uma matriz de 3x4, iria precisar de apenas mais 1 pino de I/O para ganhar mais 4 entradas. Parece interessante...

+++
"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

Mensagempor ze » 13 Jun 2008 11:14

de fato já tenho um sistema que usa aquele princípio. um hc164 que serve pra acionar displays multiplexados e aproveito o mesmo sinal pra varredura de teclado onde 2 pinos do uC são usados como comum do teclado 16 teclas. (+1pino=8 teclas+).não tinha port disp. tem diodo. só que é 1 pouco + complexo comparando com a sua rotina e também tem o ci a+ e também variável tipo int.
abrçs
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Próximo

Voltar para PIC

Quem está online

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

x