Lendo keypad com PIC



O objetivo deste circuito é apenas para aprendizado visando apenas a familiarização da leitura de um teclado numérico utilizando o PIC.

Funcionamento:
Este circuito lê um teclado numérico (teclado de telefone) e mostra os dígitos no Display de 7 segmentos. Como são utilizados dois display de 7 segmentos, o circuito permite que seja mostrado até o número 99. O botão asterisco (*) é usado para limpar o número mostrado no display. A tecla # é utilizada como Enviar, ou seja, se digitarmos o número 12 por exemplo, e em seguida pressionarmos a tecla # , o circuito irá gerar 12 pulsos no pino RA2. Sendo assim, podemos digitar o número de pulsos que sera transmitido.

Compiladores:
O código fonte foi escrito no programa Ktechlab-gcb usando o compilador gcbasic que é um compilador Open Source. Para quem utiliza Windows pode optar pelo Prithvi que é um ambiente para programar microcontroladores PIC usando o compilador gcbasic.




Esquema elétrico do circuito

Vídeo mostrando o funcionamento:


Codigo

'Lendo teclado numerico
'Site: https://sites.google.com/site/kitoeag/pic---ler-keypad
#chip 16F876A, 4


'Keypad connection settings
#define Linha1 PORTC.0
#define Linha2 PORTC.1
#define Linha3 PORTC.2
#define Linha4 PORTC.3

#define coluna1 PORTC.5
#define coluna2 PORTC.6
#define coluna3 PORTC.7
'------------------------

'Display 7 seg
#define DISP_SEG_A PORTB.0
#define DISP_SEG_B PORTB.1
#define DISP_SEG_C PORTB.2
#define DISP_SEG_D PORTB.3
#define DISP_SEG_E PORTB.4
#define DISP_SEG_F PORTB.5
#define DISP_SEG_G PORTB.6

#define DISP_SEL_1 PORTA.0
#define DISP_SEL_2 PORTA.1
'-------------------------

Dir Linha1 In
Dir Linha2 In
Dir Linha3 In
Dir Linha4 In
Dir Coluna1 Out
Dir Coluna2 Out
Dir Coluna3 Out

Dim primeira_vez_timer1 as Bit    'Define a variavel primeira_vez_timer1 como Bit

'----------------------------------------------------------------
'CONFIGURAÇAO DO TIMER1
InitTimer1 Osc, PS_256
On Interrupt Timer1Overflow Call Aciona_display    'Quando houver o estouro de Timer1, entao chame a rotina Aciona_display
StartTimer 1    'Inicia Timer1
'----------------------------------------------------------------

Num1 = 255
Num2 = 255

'===================================================================
' ROTINA PRINIPAL
'====================================================================
Do

Varre_teclado     'Chama rotina de varredura do teclado
Numero = Dado_Teclado    'Transfere o dado recebido pelo teclado para a variavel Numero

If Numero <> 255 Then    'Nao executa esta rotina se o numero for igual a 255
            '(pois esse numero eh o valor que a rotina do teclado retorna casa nenhuma tecla seja pressionada)
    If Numero <= 9 then
        If primeira_vez = 0 Then
        primeira_vez = 1
        Num1 = Numero
        Wait 1 ms
        else
            If segunda_vez = 0 Then
            segunda_vez = 1
            Num2 = Numero
            end if
        end if
    end if

    If Numero = 14 Then 'Tecla asterisco (*) pressionada, entao zera tudo
    primeira_vez = 0
    segunda_vez = 0
    Num1 = 255
    Num2 = 255
    Desliga_Display    'Chama rotina para desligar o display
    End If
   
    If Numero = 15 Then    'Tecla sustenido (#) pressionada, transmite o dado
        If segunda_vez = 1 then    'Transmita se o segundo digito tenha sido pressionado
            If Num1 > 0 Then
            pulso = (Num1 * 10) + Num2
            else
            pulso = Num2
            end if
            Repeat pulso    'Transmite a quantidade de pulso equivalente ao numero mostrado no display
            PORTA.2 = 1
            wait 50 ms
            PORTA.2 = 0
            wait 50 ms
            End Repeat
            Repeat 5    'Pisca o Display sinalizando o fim da transmissao
            StopTimer 1
            Desliga_Display
            wait 100 ms
            StartTimer 1
            wait 100 ms
            End Repeat
        end if
    End If

End If


Loop
'====================================================================

' ------------------------------------------------------------------
Sub Varre_teclado

Dado_Teclado = 255

Set Coluna1 On
If Linha1 = 1 Then Dado_Teclado = 1
Wait Until Linha1 off
If Linha2 = 1 Then Dado_Teclado = 4
Wait Until Linha2 off
If Linha3 = 1 Then Dado_Teclado = 7
Wait Until Linha3 off
If Linha4 = 1 Then Dado_Teclado = 14    'Corresponde a tecla asterisco (*)
Wait Until Linha4 off
Set Coluna1 Off

Set Coluna2 On
If Linha1 = 1 Then Dado_Teclado = 2
Wait Until Linha1 off
If Linha2 = 1 Then Dado_Teclado = 5
Wait Until Linha2 off
If Linha3 = 1 Then Dado_Teclado = 8
Wait Until Linha3 off
If Linha4 = 1 Then Dado_Teclado = 0
Wait Until Linha4 off   
Set Coluna2 Off

Set Coluna3 On
If Linha1 = 1 Then Dado_Teclado = 3
Wait Until Linha1 off
If Linha2 = 1 Then Dado_Teclado = 6
Wait Until Linha2 off
If Linha3 = 1 Then Dado_Teclado = 9
Wait Until Linha3 off
If Linha4 = 1 Then Dado_Teclado = 15    'Corresponde a tecla sustenido (#)
Wait Until Linha4 off
Set Coluna3 Off

End sub
' ------------------------------------------------------------------


' ------------------------------------------------------------------
sub Aciona_display

If primeira_vez_timer1 = 0 Then
    primeira_vez_timer1 = 1
    If Num1 <> 255 Then 'Mostra no display se Num1 for diferente de 255
    DisplayValue 1, Num1
    end if
else
    primeira_vez_timer1 = 0
    If Num2 <> 255 Then 'Mostra no display se Num2 for diferente de 255
    DisplayValue 2, Num2
    end if
end if

end sub
' ------------------------------------------------------------------


' ------------------------------------------------------------------
Sub Desliga_Display
DISP_SEL_1 = 0    'Desliga o Display1
DISP_SEL_2 = 0    'Desliga o Display2
end sub
' ------------------------------------------------------------------


Anexos
Logo abaixo está anexado os arquivos HEX e a simulação feita no proteus.
Obs.: Clique na seta para baixar os arquivos.

ċ
LER-TECLADO-KEYPAD-16f876a.hex
(2k)
Edivaldo Amaral Gonçalves,
6 de fev de 2013 06:28
ċ
Simulacao_Proteus7.8.DSN
(120k)
Edivaldo Amaral Gonçalves,
6 de fev de 2013 06:29
Comments