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.