Arne
Basic 2k - Experiência 4.2 - Controle de Teclados Matriciais
A proposta Nesta
quarta experiência vou demonstrar como utilizar um teclado matricial
4x4 (16 teclas) com o microcontrolador Embedded Arne Basic 2k. Primeiro
acho interessante mostrar um pouco da teoria, para em seguida apresentar a parte prática.
Os teclados matriciais são muito utilizados hoje em dia. Sempre que for necessário coletar informações em campo, no chão de fabrica, ou mesmo passar “orientações” a um pequeno robô, podemos utilizar um teclado. Estes
teclados são formados basicamente por botões tipo
“normalmente abertos” intercalados entre colunas e linhas. Veja a
figura abaixo. Para saber qual tecla foi pressionada é necessário
ler a linha e coluna referente a tecla. Assim podemos
determinar exatamente
qual das teclas na “matriz” foi pressionada.
Para
trabalhar com a comunicação RS-232, é preciso conhecer
um pouco sobre o que a norma determina com relação as características
“mecânicas” (formato dos conectores e distribuição
dos pinos), “elétricas” (níveis de tensão
presentes) e lógicas (como os dados são transmitidos e
recebidos) da mesma. Porém
como saber exatamente qual linha e qual coluna devemos analisar?!? E
como garantir que estaremos analisando a linha e coluna da tecla
esperada no exato momento em que ela foi pressionada?!? Para
tal é necessário realizar uma operação
muito conhecida no mundo dos microcontroladores, conhecida
como varredura. Observe a figura abaixo.
Você pode observar que é forçado um valor fixo nas “linhas”. Este valor geralmente equivale ao “1” lógico (5V). Então, o microcontrolador executa um “loop” inserindo um “0” lógico (GND) na coluna que deverá ser lida e “1” lógico nas colunas que não deseja-se ler. Assim quando alguém pressiona uma tecla na coluna onde existe o “0” lógico, imediatamente a linha referente à tecla assume o valor “0” também. Por meio de uma interrupção ou mesmo através da leitura direta é possível saber qual linha teve seu valor inicial alterado. Como sabemos qual coluna estava em “0” naquele exato momento, podemos determinar através de uma tabela, qual tecla foi pressionada. Você deve estar se perguntando: Mas como garantir que a tecla pressionada era realmente a que desejávamos ler?!?! Simples. A varredura faz isso. A varredura insere nas colunas o valor “0” com uma velocidade muito maior que uma pessoa pressiona uma tecla. Este valor “0” é inserido na primeira coluna, depois na segunda, e assim por diante até chegar a última. Se nenhuma tecla for pressionada, uma nova varredura é iniciada na busca de uma tecla e assim o microcontrolador ficará em um loop eterno na busca de uma tecla. Resumindo:
forçamos os valores nas linhas igual a “1” lógico,
inserimos “0” lógico na primeira coluna (mantendo todas as
outras em “1”) e lemos as linhas. Se nada se alterou, nenhuma
tecla foi pressiona nas linhas referentes à coluna. Passamos
então a forçar o “0” na próxima coluna e
novamente lemos as linhas. Isso é feito até que uma das
linhas seja alterada. Neste momento, verificamos uma tabela de
decodificação que guarda o valor da tecla. Com este valor é possível
saber exatamente qual tecla foi pressionada.
Na figura abaixo você pode ver o circuito
desta experiência. Basicamente utilizei para a mesma um pequeno teclado
matricial (o mesmo presente em minha loja) e também um LCD serial
(também presente na Loja do Arne).
Você pode ver o código fonte logo abaixo. Este programa é mais um excelente exemplo da estrutura da Linguagem de Programação BASIC utilizada pelo compilador BASCOM-AVR. Ao pressionar uma tecla, a mesma é capturada pela "varredura" (você leu a teoria, não leu!?) e apresentada no LCD serial. Se vocêobservar atentamente o circuito proposto e o programa perceberá que o controle de um teclado matricial, que aparentemente é algo complexo, no Arne Basic 2k ficou bem simples. Eu sei que este ainda não é uma experiência "complexa", mas.... como diria o sr. Miagui - "Daniel San!!! Acabar pintar cerca lado de dentro e lado de fora!?! Acabar de lixar assoalho??? Agora aprender karatê né!!!" ehehehehe Código fonte:'******************************************************************************* '* Programa teste_tecmat_ArneBasic2K.BAS '* Desenvolvido por Márcio José Soares - Arne '* Exemplo de uso de do teclado matricial 4x4 (16 teclas) Arne Robotics '* '* Compilador usado: BASCOM AVR 1.11.9.8 Demo '* '* Obs.: Este foi desenvolvido para rodar com o Arne Basic 2k '* Requer um LCD Serial e um Teclado Matricial - veja a Loja do Arne! ;-) '******************************************************************************* '******************************************************************************* 'Configs necessários ao microcontrolador $crystal = 10000000 $regfile = "attiny2313.dat" Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0 $baud = 9600 '******************************************************************************* 'Declaração das subrotinas Declare Sub Msg_display() Declare Sub Apaga_disp() Declare Sub Muda_linha(byval Ln As Byte) Declare Sub Varre_teclado() Declare Sub Showtecla() '******************************************************************************* 'Variáveis globais Dim Tec As Byte 'guarda última tecla pressionada '******************************************************************************* 'Configura portas Config Portb = &B00001111 'PortB - LSB saída e MSB entrada Config Portd = &B11111110 'PortD é saída, exceto PD0 e Led Alias Portb.0 Colunas Alias Portd 'colunas são saídas Linhas Alias Pinb 'linhas são entradas '******************************************************************************* 'Início do programa Wait 3 'tempo para iniciar sistemas Printbin &HFE 'envia comando para LCD Waitms 10 'aguarda Printbin &H07 'muda velocidade para 19200 Waitms 10 Baud = 19200 'seta baud a 19200 bps Call Msg_display() 'msg principal '******************************************************************************* 'Laço principal Do Tec = 0 'zera tecla Call Varre_teclado() 'verifica se tem tecla If Tec <> 0 Then 'se diferente de zero tem tecla para mostrar Call Showtecla() End If Waitms 100 'delay para evitar repique Toggle Led 'pisca o LED... muito rápido!!! Loop '******************************************************************************* 'Subrotina para apagar LCD Sub Apaga_disp() Printbin &HFE 'coloca LCD em modo comando Waitms 10 'espera processar Printbin &H01 'envia comando Waitms 10 End Sub '******************************************************************************* 'Subrotina para muda de linha no LCD Sub Muda_linha(byval Ln As Byte) Printbin &HFE 'coloca LCD em modo comando Waitms 10 'espera processar If Ln = 1 Then 'se ln é 1 Printbin &H03 'comando HOME Elseif Ln = 2 Then 'mas se for 2 Printbin &H02 'muda para linha 2 End If Waitms 10 End Sub '******************************************************************************* 'Subrotina para imprimir mensagem no LCD Sub Msg_display() Waitms 100 'aguarda qualquer processamento anterior Call Apaga_disp() 'apaga display Print "Tecle algo:"; 'insere mensagens End Sub '******************************************************************************* 'Subrotina para imprimir tecla no LCD Sub Showtecla() Waitms 100 'aguarda qualquer processamento anterior Call Msg_display() 'imprime primeira linha Call Muda_linha(2) 'muda de linha Print "Tecla ->" ; Chr(tec); 'insere mensagens End Sub '******************************************************************************* 'Subrotina para fazer a varredura do teclado 'Arrume a disposição das teclas conforme a sua necessidade ok! ;-) Sub Varre_teclado() Local Mylinhere As Byte Local Aux As Byte Aux = &HF7 Colunas = &HFF 'liga todos os pinos das colunas Colunas = Colunas And Aux 'zero na primeira coluna Waitms 10 'espera alguns ms Mylinhere = Linhas And &HF0 If Mylinhere <> &HF0 Then 'se diferente do estado default Select Case Mylinhere Case &HE0 : Tec = "0" 'pressionou S1 Case &HD0 : Tec = "4" 'pressionou S5 Case &HB0 : Tec = "8" 'pressionou S9 Case &H70 : Tec = "c" 'pressionou S13 End Select End If Aux = &HEF Colunas = &HFF 'liga todos os pinos das colunas Colunas = Colunas And Aux 'zero na segunda coluna Waitms 10 'espera alguns ms Mylinhere = Linhas And &HF0; 'lê as linhas e limpa If Mylinhere <> &HF0 Then 'se diferente do estado default Select Case Mylinhere Case &HE0 : Tec = "1" 'pressionou S2 Case &HD0 : Tec = "5" 'pressionou S6 Case &HB0 : Tec = "9" 'pressionou S10 Case &H70 : Tec = "D" 'pressionou S14 End Select End If Aux = &HDF Colunas = &HFF 'liga todos os pinos das colunas Colunas = Colunas And Aux 'zero na terceira coluna Waitms 10 'espera alguns ms Mylinhere = Linhas And &HF0; 'lê as linhas e limpa If Mylinhere <> &HF0 Then 'se diferente do estado default Select Case Mylinhere Case &HE0 : Tec = "2" 'pressionou S3 Case &HD0 : Tec = "6" 'pressionou S7 Case &HB0 : Tec = "A" 'pressionou S11 Case &H70 : Tec = "E" 'pressionou S15 End Select End If Aux = &HBF Colunas = &HFF 'liga todos os pinos das colunas Colunas = Colunas And Aux 'zero na última coluna Waitms 10 'espera alguns ms Mylinhere = Linhas And &HF0; 'lê as linhas e limpa If Mylinhere <> &HF0 Then 'se diferente do estado default Select Case Mylinhere Case &HE0 : Tec = "3" 'pressionou S4 Case &HD0 : Tec = "7" 'pressionou S8 Case &HB0 : Tec = "B" 'pressionou S12 Case &H70 : Tec = "F" 'pressionou S16 End Select End If End Sub End 'final do programa |
Copyright deste conteúdo reservado para Márcio José Soares e protegido pela Lei de Direitos Autorais LEI N° 9.610, de 19 de Fevereiro de 1998. É estritamente proibida a reprodução total ou parcial do conteúdo desta página em outros pontos da internet, livros ou outros tipos de publicações comerciais ou não, sem a prévia autorização por escrito do autor. |