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.


Teclados matriciais

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.


A experiência

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.