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.