Você está na página 1de 24

AUTOR

Maurício Madeira Oliveira


Página pessoal (fonte): www.seguidorsolar.com.br
Este curso pode ser usado e divulgado, sem fins comerciais, citar fonte e autor
Prévia: Curso de Microcontroladores PIC 16F628

6. Montagens Experimentais e Programas em Assembler

6.1 Pisca-pisca usando um LED e freqüência de dois hertz.


Este circuito é muito simples, o PIC usa recursos de temporização por consumo de
ciclos de máquina (se usarmos um clock de 4MHz (freqüência), o período, ou ciclo será de
1µs=(1/f)/4) e funções de controle de portas. Este primeiro exemplo pode ser chamado em
programação para iniciantes de “alô mundo”. O circuito do pisca-pisca é visto na Figura 1.

V1
5V
+V

D2 R2
1N4148 10k (14)Vdd

MCLR\(4)
+

C3 (6)RB0
S1 10uF
R1
360R
PIC 16F628A
D1
LED1

(5)Vss
(15) (16)
Clk-in Clk-out

XTAL1
4.000MHZ

C1 C2
33pF 33pF

Figura 1 – Circuito pisca-pisca.

O programa em assembler ou código fonte comentado é o que segue:

; FORMULÁRIO PADRÃO PARA USO EM PROGRAMAÇÃO COM MICROCONTROLADORES


; DA LINHA PIC ( MICROCHIP ). COM USO DO COMPILADOR MPASWIN.
;------------------------------------------------------------------------------
; ** Os registros da CPU serão escritas com letras maiúsculas, e a-
; pós " ; " os comentários não serão considerados pelo compilador.
;------------------------------------------------------------------------------
; PROJETO : Pisca-pisca DATA : 20/11/2008
;------------------------------------------------------------------------------
; AUTOR : Maurício Madeira Oliveira
;------------------------------------------------------------------------------
list p=16F628A ;para qual processador o código será gerado
radix dec ;padrão decimal para valores sem identificação
include <p16F628A.inc> ;anexa arquivo def.16F628A
__CONFIG _CP_OFF & _PWRTE_OFF & _BODEN_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF
;------------------------------------------------------------------------------
; TABELA DE DEFINIÇÕES DE RAM E CONSTANTES (defino nomes associados a valores)
;------------------------------------------------------------------------------
x equ 20h ; define variável auxiliar x no end.20h da RAM (hexadecimal)
y equ 21h ; define variável auxiliar y no end.21h da RAM(hexadecimal)
m equ 22h ; define variável auxiliar m no end.22h da RAM (hexadecimal)

;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
; MEMÓRIA DE PROGRAMA
;------------------------------------------------------------------------------
org 0 ; define inicio do programa a partir do end. 0h
goto início ; desvia o progrma para o label (rótulo) início

;------------------------------------------------------------------------------
; INÍCIO DA ROTINA DE INTERRUPÇÃO
;------------------------------------------------------------------------------
org 4 ; sempre inicia no end.4h as interrup.no PIC
; rotinas ...............................
retfie ; comando de retorno de interrupção

;------------------------------------------------------------------------------
; INÍCIO DO PROGRAMA
;------------------------------------------------------------------------------

início:
movlw 0 ; registrador w=0 (decimal)
movwf INTCON ; registrador INTCON=B'00000000', desabilito todas as interrupçoões
bcf STATUS, IRP ; clear no bit irp do reg.status, pré-seleciono banco 0 e 1
bcf STATUS, RP1 ; clear no bit RP1 (RP1=0)
bsf STATUS, RP0 ; set bit RP0 (RP0=1) com estas duas linhas seleciono o banco 1, onde está o TRISB e TRISA

;-------------------------------------------------------------------------------
; Poderia usar o comando BANKSEL que é uma diretiva para seleção de banco de memória do MPLAB
; ex. BANKSEL TRISB, não precisaria digitar as duas linhas anteriores
; Também poderia usar o comando: movlw B'001XXXXX' e após movwf STATUS, onde x = a qualquer valor;
; substituiriam as três linhas anteriores.
;-------------------------------------------------------------------------------
movwf TRISB ; registrador TRISB=0 (B'00000000') , OU SEJA, PINOS DO PORTB CONFIGURADOS COMO
SAÍDAS
movlw 0FFH ; w=B'11111111'
movwf TRISA ; TRISA=B'11111111'pinos configurados como entradas
movlw 24 ; w=B'00011000'
movwf OPTION_REG ; registrador OPTION_REG=B'00011000', verificar nos livros esta config.c/ estes valores
bcf STATUS, RP0 ; clear bit RP0, seleciono banco 0
movlw 0
movwf PORTB ; zero as saídas do PORTB
volta:
bsf PORTB,0 ; set pino PB0 do PORTB
call tempo
bcf PORTB,0 ; clear PB0 do PORTB
call tempo
goto volta

tempo: ; início da rotina de tempo (s/uso dos timers),label de chamada para a função call ou outra
movlw 2 ; onde t1 é um valor numérico, base numérica (1uS)
; em uso (decimal, hexa, binário etc.)
movwf x ; variável x, onde ficara c/ o valor x=t1 (1uS)
tempo1:
movlw 250 ; onde t2 é um valor numérico (1uS) y=250
movwf y ; varável y, onde y=t2 (1uS)
tempo2:
movlw 248 ; onde t3 é um valor numérico (1uS) m=248
movwf m ; varável m, onde m=248 (1uS)
tempo3:
nop ; queima 1Us,para o clock de 4MHz (1uS)
decfsz m ; decrem.z e se m=0 salta próxima instrução (1uS ou 2uS)
; (2uS se saltar ou 1US se não saltar)
goto tempo3 ; ir pra o label tempo3 (2uS)
decfsz y ; decrem.y e se y=0 salta próxima instrução (1uS ou 2uS)
goto tempo2 ; ir pra o label tempo2 (2uS)
decfsz x ; decrem.x e se x=0 salta próxima instrução (1uS ou 2uS)
goto tempo1 ; ir pra o label tempo1 (2uS)
return ; função de retorno de subrotina ou desvio (2uS)

end

6.2 Pisca-pisca alternado, usando dois LED’s, período de meio segundo.


O circuito também usa o mesmo recurso de temporização do exemplo anterior, ou seja,
não usa os timer’s do microcontrolador. No circuito da Figura 2 é usado dois pinos para
acionamento dos led’s. O software é simples e usa as mesmas funções de controle de portas
do circuito anterior.
Este tipo de implementação de rotina de tempo é bastante usual, em diversas famílias
de microcontroladores (tecnologias de diferentes fabricantes), pois, muitas vezes os
temporizadores já estão sendo usados e são necessários outros meios de implementar funções
de base de tempo.
Na Figura 2 é visualizado o circuito de pisca alternado.
V1
5V
+V

D2 R2
1N4148 10k (14)Vdd

MCLR\(4)(7)RB1
+

C3 (6)RB0
S1 10uF
R1 R3
360R 360R
PIC 16F628A
D1 D3
LED1 LED2

(5)Vss
(15) (16)
Clk-in Clk-out

XTAL1
4.000MHZ

C1 C2
33pF 33pF

Figura 2 – Pisca-pisca alternado.

O programa comentado em assembler do pisca alternado é o que segue.

; FORMULÁRIO PADRÃO PARA USO EM PROGRAMAÇÃO COM MICROCONTROLADORES


; DA LINHA PIC ( MICROCHIP ). COM USO DO COMPILADOR MPASWIN.
;------------------------------------------------------------------------------
; ** Os registros da CPU serão escritas com letras maiúsculas, e a-
; pós " ; " os comentários não serão considerados pelo compilador.
;------------------------------------------------------------------------------
; PROJETO : Pisca - Dois Leds DATA : 22/11/2008
;------------------------------------------------------------------------------
; AUTOR : Maurício Madeira Oliveira
;------------------------------------------------------------------------------
list p=16F628A ;para qual processador o código será gerado
radix dec ;padrão decimal para valores sem identificação
include <p16F628A.inc> ;anexa arquivo def.16F628A
__CONFIG _CP_OFF & _PWRTE_OFF & _BODEN_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF
;------------------------------------------------------------------------------
; TABELA DE DEFINIÇÕES DE RAM E CONSTANTES (defino nomes associados a valores)
;------------------------------------------------------------------------------
x equ 20h ; define variável auxiliar x no end.20h da RAM (hexadecimal)
y equ 21h ; define variável auxiliar y no end.21h da RAM(hexadecimal)
m equ 22h ; define variável auxiliar m no end.22h da RAM (hexadecimal)
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
; MEMÓRIA DE PROGRAMA
;------------------------------------------------------------------------------
org 0 ; define inicio do programa a partir do end. 0h
goto início ; desvia o progrma para o label (rótulo) início

;------------------------------------------------------------------------------
; INÍCIO DA ROTINA DE INTERRUPÇÃO
;------------------------------------------------------------------------------
org 4 ; sempre inicia no end.4h as interrup.no PIC
; rotinas ...............................
retfie ; comando de retorno de interrupção

;------------------------------------------------------------------------------
; INÍCIO DO PROGRAMA - inicialização do uC
;------------------------------------------------------------------------------

início:
movlw 0 ; registrador w=0 (decimal)
movwf INTCON ; registrador INTCON=B'00000000', desabilito todas as interrupçoões
bcf STATUS, IRP ; clear no bit irp do reg.status, pré-seleciono banco 0 e 1
bcf STATUS, RP1 ; clear no bit RP1 (RP1=0)
bsf STATUS, RP0 ; set bit RP0 (RP0=1) com estas duas linhas seleciono o banco 1, onde está o TRISB e TRISA
movwf TRISB ; registrador TRISB=0 (B'00000000') , OU SEJA, PINOS DO PORTB CONFIGURADOS COMO
SAÍDAS
movlw 0FFH ; w=B'11111111'
movwf TRISA ; TRISA=B'11111111'pinos configurados como entradas
movlw 24 ; w=B'00011000'
movwf OPTION_REG ; registrador OPTION_REG=B'00011000', verificar nos livros esta config.c/ estes valores
bcf STATUS, RP0 ; clear bit RP0, seleciono banco 0
movlw 0
movwf PORTB ; zero as saídas do PORTB

;--------------------------------------------------------------------------------
; programa principal - aplicação
;--------------------------------------------------------------------------------

volta:
bsf PORTB,0 ; set pino PB0 do PORTB
bcf PORTB,1 ; clear pino PB1
call tempo
bcf PORTB,0 ; clear PB0 do PORTB
bsf PORTB,1 ; set pino PB1
call tempo
goto volta
;---------------------------------------------------------------------------------
; Rotinas de tempo
;---------------------------------------------------------------------------------

tempo: ; início da rotina de tempo (s/uso dos timers),label de chamada para a função call ou outra
movlw 2 ; onde t1 é um valor numérico, base numérica (1uS)
; em uso (decimal, hexa, binário etc.)
movwf x ; variável x, onde ficara c/ o valor x=t1 (1uS)
tempo1:
movlw 250 ; onde t2 é um valor numérico (1uS) y=250
movwf y ; varável y, onde y=t2 (1uS)
tempo2:
movlw 248 ; onde t3 é um valor numérico (1uS) m=248
movwf m ; varável m, onde m=248 (1uS)
tempo3:
nop ; queima 1Us,para o clock de 4MHz (1uS)
decfsz m ; decrem.z e se m=0 salta próxima instrução (1uS ou 2uS)
; (2uS se saltar ou 1US se não saltar)
goto tempo3 ; ir pra o label tempo3 (2uS)
decfsz y ; decrem.y e se y=0 salta próxima instrução (1uS ou 2uS)
goto tempo2 ; ir pra o label tempo2 (2uS)
decfsz x ; decrem.x e se x=0 salta próxima instrução (1uS ou 2uS)
goto tempo1 ; ir pra o label tempo1 (2uS)
return ; função de retorno de subrotina ou desvio (2uS)

end

6.3 Seqüencial de oito canais (usando LED’s).


O circuito que é visto na Figura 3 usa todos os 8 pinos do PORTB. Através da função
de rotação a esquerda (RLF) e com o mesmo temporizador implementado nos circuitos
anteriores, fica bem simples o entendimento do funcionamento do circuito seqüencial.
O software que comanda o PIC é o descrito no formulário que segue.

; FORMULÁRIO PADRÃO PARA USO EM PROGRAMAÇÃO COM MICROCONTROLADORES


; DA LINHA PIC ( MICROCHIP ). COM USO DO COMPILADOR MPASWIN.
;------------------------------------------------------------------------------
; ** Os registros da CPU serão escritas com letras maiúsculas, e a-
; pós " ; " os comentários não serão considerados pelo compilador.
;------------------------------------------------------------------------------
; PROJETO : Pisca - Sequencial de 8 leds DATA : 22/11/2008
;------------------------------------------------------------------------------
; AUTOR : Maurício Madeira Oliveira
;------------------------------------------------------------------------------
list p=16F628A ;para qual processador o código será gerado
radix dec ;padrão decimal para valores sem identificação
include <p16F628A.inc> ;anexa arquivo def.16F628A
__CONFIG _CP_OFF & _PWRTE_OFF & _BODEN_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF
;------------------------------------------------------------------------------
; TABELA DE DEFINIÇÕES DE RAM E CONSTANTES (defino nomes associados a valores)
;------------------------------------------------------------------------------
x equ 20h ; define variável auxiliar x no end.20h da RAM (hexadecimal)
y equ 21h ; define variável auxiliar y no end.21h da RAM(hexadecimal)
m equ 22h ; define variável auxiliar m no end.22h da RAM (hexadecimal)

;------------------------------------------------------------------------------
; MEMÓRIA DE PROGRAMA
;------------------------------------------------------------------------------
org 0 ; define inicio do programa a partir do end. 0h
goto início ; desvia o progrma para o label (rótulo) início

;------------------------------------------------------------------------------
; INÍCIO DA ROTINA DE INTERRUPÇÃO
;------------------------------------------------------------------------------
org 4 ; sempre inicia no end.4h as interrup.no PIC
; rotinas ...............................
retfie ; comando de retorno de interrupção

;------------------------------------------------------------------------------
; INÍCIO DO PROGRAMA - inicialização do uC
;------------------------------------------------------------------------------

início:
movlw 0 ; registrador w=0 (decimal)
movwf INTCON ; registrador INTCON=B'00000000', desabilito todas as interrupçoões
bcf STATUS, IRP ; clear no bit irp do reg.status, pré-seleciono banco 0 e 1
bcf STATUS, RP1 ; clear no bit RP1 (RP1=0)
bsf STATUS, RP0 ; set bit RP0 (RP0=1) com estas duas linhas seleciono o banco 1, onde está o TRISB e TRISA
bcf STATUS, C ; clear carry . É IMPORTANTE ESTE CLEAR, POIS O COMANDO DE ROTAÇÃO
; (RLF) USA ESTE FLAG
movwf TRISB ; registrador TRISB=0 (B'00000000') , OU SEJA, PINOS DO PORTB CONFIGURADOS COMO
SAÍDAS
movlw 0FFH ; w=B'11111111'
movwf TRISA ; TRISA=B'11111111'pinos configurados como entradas
movlw 24 ; w=B'00011000'
movwf OPTION_REG ; registrador OPTION_REG=B'00011000', verificar nos livros esta config.c/ estes valores
bcf STATUS, RP0 ; clear bit RP0, seleciono banco 0
movlw 0
movwf PORTB ; zero as saídas do PORTB

;--------------------------------------------------------------------------------
; programa principal - aplicação
;--------------------------------------------------------------------------------
movlw 128 ; w=b'10000000'
movwf PORTB ; portb=w=b'10000000'
volta:
rlf PORTB, 1 ; desloca bit à esquerda no PORTB ( o f=1, atua sobre o próprio registro)
call tempo ; chama subrotina de tempo
goto volta ; ir para label volta

;---------------------------------------------------------------------------------
; Rotinas de tempo
;---------------------------------------------------------------------------------
tempo: ; início da rotina de tempo (s/uso dos timers),label de chamada para a função call ou outra
movlw 2 ; onde t1 é um valor numérico, base numérica (1uS)
; em uso (decimal, hexa, binário etc.)
movwf x ; variável x, onde ficara c/ o valor x=t1 (1uS)
tempo1:
movlw 250 ; onde t2 é um valor numérico (1uS) y=250
movwf y ; varável y, onde y=t2 (1uS)
tempo2:
movlw 248 ; onde t3 é um valor numérico (1uS) m=248
movwf m ; varável m, onde m=248 (1uS)
tempo3:
nop ; queima 1Us,para o clock de 4MHz (1uS)
decfsz m ; decrem.z e se m=0 salta próxima instrução (1uS ou 2uS)
; (2uS se saltar ou 1US se não saltar)
goto tempo3 ; ir pra o label tempo3 (2uS)
decfsz y ; decrem.y e se y=0 salta próxima instrução (1uS ou 2uS)
goto tempo2 ; ir pra o label tempo2 (2uS)
decfsz x ; decrem.x e se x=0 salta próxima instrução (1uS ou 2uS)
goto tempo1 ; ir pra o label tempo1 (2uS)
return ; função de retorno de subrotina ou desvio (2uS)
end

O circuito básico do PIC é o mesmo dos pisca-piscas anteriores, apenas usando 8


conjuntos de LED’s e um novo comando. Com isto se observa a facilidade e o imenso
potencial de uso de um microcontrolador.
Em projetos com uso de microcontroladores, é fácil observar a importância do
software, pois a partir hardwares básicos é possível implementar vários circuitos com a
mudança de linhas de um programa de controle.
V1
5V
+V

D9 R2
1N4148 10k (14)Vdd
(13)RB7
+
MCLR\(4)

C3 (6)RB0
S1 10uF
R1 R8
360R Total de 8 conjuntos 360R
PIC 16F628A ..........................
D1 D8
LED1 LED8
(5)Vss
(15) (16)
Clk-in Clk-out

XTAL1
4.000MHZ

C1 C2
33pF 33pF

Figura 3 – Circuito da seqüencial de oito canais.


6.4 Sensor com chave tipo normalmente aberta e sinalização com led temporizado.
Este circuito usa uma chave normalmente aberta como sensor, à mesma esta ligada no
pino RA0. Esta chave mecânica indica quando aberta o nível zero e quando fechada nível 1,
sinalizada pelo led 1 que está ligada no pino RB0 do µC; quando a chave for fechada (nível 1)
a subrotina de temporização é acionada.
O circuito é visto na Figura 4.
O programa de controle do circuito esta todo comentado. A função de entrada do sinal

a ser interpretado pelo programa é btfss.


; FORMULÁRIO PADRÃO PARA USO EM PROGRAMAÇÃO COM MICROCONTROLADORES
; DA LINHA PIC ( MICROCHIP ). COM USO DO COMPILADOR MPASWIN.
;------------------------------------------------------------------------------
; ** Os registros da CPU serão escritas com letras maiúsculas, e a-
; pós " ; " os comentários não serão considerados pelo compilador.
;------------------------------------------------------------------------------
; PROJETO : Sensor c/ temporização DATA : 25/11/2008
;------------------------------------------------------------------------------
; AUTOR : Maurício Madeira Oliveira
;------------------------------------------------------------------------------

list p=16F628A ;para qual processador o código será gerado


radix dec ;padrão decimal para valores sem identificação
include <p16F628A.inc> ;anexa arquivo def.16F628A
__CONFIG _CP_OFF & _PWRTE_OFF & _BODEN_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF

;------------------------------------------------------------------------------
; TABELA DE DEFINIÇÕES DE RAM E CONSTANTES (defino nomes associados a valores)
;------------------------------------------------------------------------------
x equ 20h ; define variável auxiliar x no end.20h da RAM (hexadecimal)
y equ 21h ; define variável auxiliar y no end.21h da RAM(hexadecimal)
m equ 22h ; define variável auxiliar m no end.22h da RAM (hexadecimal)
S1 equ 0 ; sensor 1 que usara o pino 0 do PORTA
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
; MEMÓRIA DE PROGRAMA
;------------------------------------------------------------------------------
org 0 ; define inicio do programa a partir do end. 0h
goto início ; desvia o progrma para o label (rótulo) início
;------------------------------------------------------------------------------
; INÍCIO DA ROTINA DE INTERRUPÇÃO
;------------------------------------------------------------------------------
org 4 ; sempre inicia no end.4h as interrup.no PIC
; rotinas ...............................
retfie ; comando de retorno de interrupção
;------------------------------------------------------------------------------
; INÍCIO DO PROGRAMA - inicialização do uC
;------------------------------------------------------------------------------
início:
movlw 0 ; registrador w=0 (decimal)
movwf INTCON ; registrador INTCON=B'00000000', desabilito todas as interrupçoões
bcf STATUS, IRP ; clear no bit irp do reg.status, pré-seleciono banco 0 e 1
bcf STATUS, RP1 ; clear no bit RP1 (RP1=0)
bsf STATUS, RP0 ; set bit RP0 (RP0=1) com estas duas linhas seleciono o banco 1, onde está o TRISB e TRISA
bcf STATUS, C ; clear carry
movwf TRISB ; registrador TRISB=0 (B'00000000') , OU SEJA, PINOS DO PORTB CONFIGURADOS
; COMO SAÍDAS
movlw 0FFH ; w=B'11111111'
movwf TRISA ; TRISA=B'11111111'pinos configurados como entradas
movlw 24 ; w=B'00011000'
movwf OPTION_REG ; registrador OPTION_REG=B'00011000', verificar nos livros esta config.c/ estes valores
bcf STATUS, RP0 ; clear bit RP0, seleciono banco 0
movlw 7 ; w=B'00000111'
movwf CMCON ; cmcon=w, desligo o comparador analógico (o reset não faz isso)
movlw 0 ; w=0
movwf CCP1CON ; CCP1CON=W=, desliga o módulo CCP (o reset faz isso, mas forçar o sinal por garantia)
movwf PORTB ; zero as saídas do PORTB (PORTB=w=0)
;--------------------------------------------------------------------------------
; programa principal - aplicação
;--------------------------------------------------------------------------------
sensor1:
nop ; gasto um ciclo de máquina
btfss PORTA, S1 ; se o bit S1 do portA for igual a 1,pula a próxima instrução
goto sensor1 ; se esta aqui é porque S1=0, volta para sensor1 (fica testando o sensor S1)
bsf PORTB,0 ; liga o led 1 conectado em RB0
call tempo ; chama rotina de tempo (para deixar o sinalizador led 1 ligado por um tempo)
bcf PORTB,0 ; desliga o led 1
goto sensor1 ; desvia para o sensor1, volta a testar o sensor S1
;---------------------------------------------------------------------------------
; Rotinas de tempo
;---------------------------------------------------------------------------------
tempo: ; início da rotina de tempo (s/uso dos timers),label de chamada para a função call ou outra
movlw 2 ; onde t1 é um valor numérico, base numérica (1uS)
; em uso (decimal, hexa, binário etc.)
movwf x ; variável x, onde ficara c/ o valor x=t1 (1uS)
tempo1:
movlw 250 ; onde t2 é um valor numérico (1uS) y=250
movwf y ; varável y, onde y=t2 (1uS)
tempo2:
movlw 248 ; onde t3 é um valor numérico (1uS) m=248
movwf m ; varável m, onde m=248 (1uS)
tempo3:
nop ; queima 1Us,para o clock de 4MHz (1uS)
decfsz m ; decrem.z e se m=0 salta próxima instrução (1uS ou 2uS)
; (2uS se saltar ou 1US se não saltar)
goto tempo3 ; ir pra o label tempo3 (2uS)
decfsz y ; decrem.y e se y=0 salta próxima instrução (1uS ou 2uS)
goto tempo2 ; ir pra o label tempo2 (2uS)
decfsz x ; decrem.x e se x=0 salta próxima instrução (1uS ou 2uS)
goto tempo1 ; ir pra o label tempo1 (2uS)
return ; função de retorno de subrotina ou desvio (2uS)
end
V1
5V
+V

D2 R2 S1
1N4148 10k (14)Vdd
(17)RA0
MCLR\(4)
+

C3 (6)RB0
RESET 10uF
R1
360R
PIC 16F628A R3
D1 1k
LED1

(5)Vss
(15) (16)
Clk-in Clk-out

XTAL1
4.000MHZ

C1 C2
33pF 33pF

Figura 4 – Sensor com chave normalmente aberta.


6.5 Detector de nível para sinal digital.
Este circuito informa através de dois led’s se o sinal amostrado no pino RA0 é alto(1),
ligando o led 1 (pino RB0), se é baixo (0), ligando o led 2 (pino RB1) ou se o sinal está
variando entre 0 e 1 (oscilador de onda quadrada), liga os dois led’s.
O programa de controle é bastante simples, e o circuito apresentado funciona para
sinais com tensão igual a da fonte de alimentação dos circuitos apresentados (5V).
Na Figura 5 é mostrado o esquema do circuito, o mesmo é simples e didático, pois
pode ser usado como base para circuitos mais sofisticados. Este exemplo mostra que o sinais
digitais amostrados podem ser analisados diretamente pelo software de controle.
V1
5V
+V

Entrada sinal
D2 R2
1N4148 10k (14)Vdd
(17)RA0 S1
MCLR\(4)
(6)RB0
+

C3
RESET 10uF (7)RB1
R4 R1
360R 360R
PIC 16F628A R3
D3 D1 1k
LED2 LED1

(5)Vss
(15) (16)
Clk-in Clk-out

XTAL1
4.000MHZ

C1 C2
33pF 33pF

Figura 5 – Detector de nível de sinal.

;------------------------------------------------------------------------------
; FORMULÁRIO PADRÃO PARA USO EM PROGRAMAÇÃO COM MICROCONTROLADORES
; DA LINHA PIC ( MICROCHIP ). COM USO DO COMPILADOR MPASWIN.
;------------------------------------------------------------------------------
; ** Os registros da CPU serão escritas com letras maiúsculas, e a-
; pós " ; " os comentários não serão considerados pelo compilador.
;------------------------------------------------------------------------------
; PROJETO : Detector de nível de sinal DATA : 26/11/2008
;------------------------------------------------------------------------------
; AUTOR : Maurício Madeira Oliveira
;------------------------------------------------------------------------------
list p=16F628A ;para qual processador o código será gerado
radix dec ;padrão decimal para valores sem identificação
include <p16F628A.inc> ;anexa arquivo def.16F628A
__CONFIG _CP_OFF & _PWRTE_OFF & _BODEN_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF
;------------------------------------------------------------------------------
; TABELA DE DEFINIÇÕES DE RAM E CONSTANTES (defino nomes associados a valores)
;------------------------------------------------------------------------------
x equ 20h ; define variável auxiliar x no end.20h da RAM (hexadecimal)
y equ 21h ; define variável auxiliar y no end.21h da RAM(hexadecimal)
m equ 22h ; define variável auxiliar m no end.22h da RAM (hexadecimal)
S1 equ 0 ; sensor 1 que usara o pino 0 do PORTA
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
; MEMÓRIA DE PROGRAMA
;------------------------------------------------------------------------------
org 0 ; define inicio do programa a partir do end. 0h
goto início ; desvia o progrma para o label (rótulo) início
;------------------------------------------------------------------------------
; INÍCIO DA ROTINA DE INTERRUPÇÃO
;------------------------------------------------------------------------------
org 4 ; sempre inicia no end.4h as interrup.no PIC
; rotinas ...............................
retfie ; comando de retorno de interrupção
;------------------------------------------------------------------------------
; INÍCIO DO PROGRAMA - inicialização do uC
;------------------------------------------------------------------------------
início:
movlw 0 ; registrador w=0 (decimal)
movwf INTCON ; registrador INTCON=B'00000000', desabilito todas as interrupçoões
bcf STATUS, IRP ; clear no bit irp do reg.status, pré-seleciono banco 0 e 1
bcf STATUS, RP1 ; clear no bit RP1 (RP1=0)
bsf STATUS, RP0 ; set bit RP0 (RP0=1) com estas duas linhas seleciono o banco 1, onde está o TRISB e TRISA
bcf STATUS, C ; clear carry
movwf TRISB ; registrador TRISB=0 (B'00000000') , OU SEJA, PINOS DO PORTB CONFIGURADOS
COMO SAÍDAS
movlw 0FFH ; w=B'11111111'
movwf TRISA ; TRISA=B'11111111'pinos configurados como entradas
movlw 24 ; w=B'00011000'
movwf OPTION_REG ; registrador OPTION_REG=B'00011000', verificar nos livros esta config.c/ estes valores
bcf STATUS, RP0 ; clear bit RP0, seleciono banco 0
movlw 7 ; w=B'00000111'
movwf CMCON ; cmcon=w, desligo o comparador analógico (o reset não faz isso)
movlw 0 ; w=0
movwf CCP1CON ; CCP1CON=W=, desliga o módulo CCP (o reset faz isso, mas forçar o sinal por garantia)
movwf PORTB ; zero as saídas do PORTB (PORTB=w=0)
;--------------------------------------------------------------------------------
; programa principal - aplicação
;--------------------------------------------------------------------------------
sensor1:
nop ; gasto um ciclo de máquina
btfss PORTA, S1 ; se o bit S1 do portA for igual a 1,pula a próxima instrução
goto sensor2 ; desvia para sensor2 (label), pois RA0 (S1) está em zero (nível baixo)
bsf PORTB,0 ; liga RB0 pois S1=1 (nível alto do sinal amostrado)
bcf PORTB,1 ; desliga RB1
goto sensor1 ; volta à sensor1 para continuar a testar o nível do sinal
sensor2:
bcf PORTB,0 ; desliga RB0, pois sinal amostrado têm nível baixo (zero)
bsf PORTB,1 ; liga RB0
goto sensor1 ; volta para sensor1
end

6.6 Contador de pulsos externos com uso de display de 7 seguimentos


Neste exemplo iremos utilizar nosso µC para contar um determinado número de pulsos
externos, em nosso caso serão 10, quando isto acontecer nosso timer 0 irá gerar uma
interrupção no µC, a mesma será resolvida pelo software , que ligara um led (representando
uma carga qualquer) por 500mS, e após desligara, voltando para rotina principal do µC como
contador. Também aproveitaremos para ativar um display de 7 segmentos (de led) para
fixarmos mais este conceito (decodificador por software). O circuito é visualizado na Figura
6:
V1
5V
+V

D2
1N4148 R2 Entada Gnd
10k
DISP1
MCLR\(4)
(14)Vdd R4
500R abcdefg.

PIC 16F628A
+

C3
S1 10uF
(03)RA4

(06)RB0
(07)RB1
(08)RB2
(09)RB3
(10)RB4
(11)RB5
(12)RB6
(13)RB7

(5)Vss
(15) (16)
Clk-in Clk-out
R3 R1
XTAL1 10k 360R
4.000MHZ

D1
C1 C2 LED1
33pF 33pF

Figura 6 – Contador externo com display de 7 seguimentos.


O código de controle do circuito têm um maior grau de dificuldade, mas com os comentários
de cada linha se chega ao entendimento do mesmo.
; FORMULÁRIO PADRÃO PARA USO EM PROGRAMAÇÃO COM MICROCONTROLADORES
; DA LINHA PIC ( MICROCHIP ). COM USO DO COMPILADOR MPASWIN.
;------------------------------------------------------------------------------
; ** Os registros da CPU serão escritas com letras maiúsculas, e a-
; pós " ; " os comentários não serão considerados pelo compilador.
;------------------------------------------------------------------------------
; PROJETO : Contador de pulsos externos c/ display7 (7 seguimentos)e inmterrupção do timer0
; DATA : 25/11/2008
;------------------------------------------------------------------------------
; AUTOR : Maurício Madeira Oliveira
;------------------------------------------------------------------------------
list p=16F628A ;para qual processador o código será gerado
radix dec ;padrão decimal para valores sem identificação
include <p16F628A.inc> ;anexa arquivo def.16F628A
__CONFIG _CP_OFF & _PWRTE_OFF & _BODEN_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF
;------------------------------------------------------------------------------
; TABELA DE DEFINIÇÕES DE RAM E CONSTANTES (defino nomes associados a valores)
;------------------------------------------------------------------------------
x equ 20h ; define variável auxiliar x no end.20h da RAM (hexadecimal)
y equ 21h ; define variável auxiliar y no end.21h da RAM(hexadecimal)
m que 22h ; define variável auxiliar m no end.22h da RAM (hexadecimal)
l1 equ 7 ; led ligado a PORTB em RB7
STEMP equ 23h ; define variável temporária p/ guardar valores do STATUS
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
; TABELA DE MONTAGEM DO DISPLAY
;------------------------------------------------------------------------------
;
; a=RB0 define segmento do display ligado ao pino 0 do portB
; b=RB1 " " " " " " " 1 do portB
; c=RB2 " " " " " " " 2 do portB
; d=RB3 " " " " " " " 3 do portB
; e=RB4 " " " " " " " 4 do portB
; f=RB5 " " " " " " " 5 do portB
; g=RB6 " " " " " " " 6 do portB
;
; fica em binario: B'0gfedcba', para escrever n.7 ==> B'00000111' ou B'00000cba'
; , para escrever n.6 ==> B'01111101' ou B'0gfedc0a' , etc.
;
; a
; *******
; f * * b
; * g *
; ******* DISPLAY
; e * * c
; * *
; *******
; d
;------------------------------------------------------------------------------
; MEMÓRIA DE PROGRAMA
;------------------------------------------------------------------------------
org 0 ; define inicio do programa a partir do end. 0h
goto início ; desvia o progrma para o label (rótulo) início
;------------------------------------------------------------------------------
; INÍCIO DA ROTINA DE INTERRUPÇÃO
;------------------------------------------------------------------------------
org 4 ; sempre inicia no end.4h as interrup.no PIC
swapf STATUS,W
movwf STEMP ; stemp=w=status (c/nibles invertidos)
bsf PORTB,l1 ; ligo led1 pino 7 do portB
movlw 0x0F6 ; w=F6h
movwf TMR0 ; tmr0=w=F6h
call tempo
bcf PORTB,l1 ; desligo led1
swapf STEMP,W
movwf STATUS ; move vlrs.stemp p/status (inv.nibles/fica correto)
bcf INTCON,T0IF ; zera o indicador de overflow p/iniciar novam.
retfie ; comando de retorno de interrupção

;------------------------------------------------------------------------------
; INÍCIO DO PROGRAMA - inicialização do uC
;------------------------------------------------------------------------------

início:
movlw B'10000000' ; w=10000000b
movwf INTCON ; INTCON=w , GIE esta habilitada
bcf STATUS, IRP ; clear no bit irp do reg.status, pré-seleciono banco 0 e 1
bcf STATUS, RP1 ; clear no bit RP1 (RP1=0)
bsf STATUS, RP0 ; set bit RP0 (RP0=1) com estas duas linhas seleciono o banco 1, onde está o TRISB e TRISA
movlw 0
movwf TRISB ; registrador TRISB=0 (B'00000000') , OU SEJA, PINOS DO PORTB CONFIGURADOS
COMO SAÍDAS
movlw 0FFH ; w=B'11111111'
movwf TRISA ; TRISA=B'11111111'pinos configurados como entradas
movlw B'11111000' ; w=11111000b
movwf OPTION_REG
;(OPTION=w|RPBU\=1|INTEDEG=1|TOCS=1|TOSE=1|PSA=1|PS2=0|PS1=0|PS0=0|==>T0CS=1contagem por RA4...)

bcf STATUS, RP0 ; clear bit RP0, seleciono banco 0


movlw 7 ; w=B'00000111'
movwf CMCON ; cmcon=w, desligo o comparador analógico
movlw 0 ; w=0
movwf CCP1CON ; CCP1CON=W=, desliga o módulo CCP (o reset faz isso, mas forçar o sinal por garantia)
movwf PORTB ; zero as saídas do PORTB (PORTB=w=0)
;--------------------------------------------------------------------------------
; programa principal - aplicação
;--------------------------------------------------------------------------------

movlw 0x0F5 ; w=0F5


movwf TMR0 ; timer0=w
bcf INTCON,T0IF ; reset no bit indicador de overflow
bsf INTCON,T0IE ; set o bit de interrupção do timer0
loop:
movf TMR0,0 ; w=tmr0
call certo ; sub-rotina de conversão p/7 segmentos
movwf PORTB ; portB=w
nop
goto loop
certo:
andlw B'00001111' ; and w p/limitar em 4 bits vlr.contador (w= tmr0 and b'00001111')
sublw 0x0E ; subtrai de 14 o vlr.de w (vlr.tmr0 acertado)(w=0x0E-w)
addwf PCL,1 ; soma valor de w com pcl, saltando p/ instrução
; necessária p/escrita do número correto
;'0gfedcba' sequência dos segmentos
retlw B'01100111' ; retorna 9 (instrução de retorno de subrotina e com valor em w= cte.)
retlw B'01111111' ; retorna 8
retlw B'00000111' ; retorna 7
retlw B'01111100' ; retorna 6
retlw B'01101101' ; retorna 5
retlw B'01100110' ; retorna 4
retlw B'01001111' ; retorna 3
retlw B'01011011' ; retorna 2
retlw B'00000110' ; retorna 1
retlw B'00111111' ; retorna 0

;---------------------------------------------------------------------------------
; Rotinas de tempo
;---------------------------------------------------------------------------------

tempo: ; início da rotina de tempo (s/uso dos timers),label de chamada para a função call ou outra
movlw 2 ; onde t1 é um valor numérico, base numérica (1uS)
; em uso (decimal, hexa, binário etc.)
movwf x ; variável x, onde ficara c/ o valor x=t1 (1uS)
tempo1:
movlw 250 ; onde t2 é um valor numérico (1uS) y=250
movwf y ; varável y, onde y=t2 (1uS)
tempo2:
movlw 248 ; onde t3 é um valor numérico (1uS) m=248
movwf m ; varável m, onde m=248 (1uS)
tempo3:
nop ; queima 1Us,para o clock de 4MHz (1uS)
decfsz m ; decrem.z e se m=0 salta próxima instrução (1uS ou 2uS)
; (2uS se saltar ou 1US se não saltar)
goto tempo3 ; ir pra o label tempo3 (2uS)
decfsz y ; decrem.y e se y=0 salta próxima instrução (1uS ou 2uS)
goto tempo2 ; ir pra o label tempo2 (2uS)
decfsz x ; decrem.x e se x=0 salta próxima instrução (1uS ou 2uS)
goto tempo1 ; ir pra o label tempo1 (2uS)
return ; função de retorno de subrotina ou desvio (2uS)
end

6.7 Acionamento de Display LCD com palavra de 8 bits.


Na figura 7 é mostrado o circuito básico de um microcontrolador e um módulo de
LCD (display de cristal liquido), o mesmo é do tipo 2x16 (duas linhas por 16 colunas) com
iluminação de fundo (back light). As palavras de instrução e de escrita usam 8 bits, a tabela 1
descreve as palavras de inicialização (instrução) do módulo LCD para operar neste modo.
Será escrito no display “CURSO DE MICROCONTROLADOR”, desta forma, com o
software de controle e os comentários sobre o mesmo, se alcançará o entendimento básico de
uso deste dispositivo.
V1
5V
+V

2 Vdd MÓDULO LCD


D2
1N4148 R2 Vss Cnte RS R/W E B0 ........... B7
10k
1 3 4 5 6 7 8 9 10 11 12 13 14
MCLR\(4)
(14)Vdd
R1
10k 40%

PIC 16F628A
+

C3
S1 10uF
(06)RB0
(07)RB1
(08)RB2
(09)RB3
(10)RB4
(11)RB5
(12)RB6
(13)RB7
(17)RA0
(18)RA1

(5)Vss
(15) (16)
Clk-in Clk-out

XTAL1
4.000MHZ

C1 C2
33pF 33pF

Figura 7 – Módulo LCD controlado pelo PIC 16F628A.

; FORMULÁRIO PADRÃO PARA USO EM PROGRAMAÇÃO COM MICROCONTROLADORES


; DA LINHA PIC ( MICROCHIP ). COM USO DO COMPILADOR MPASWIN.
;------------------------------------------------------------------------------
; ** Os registros da CPU serão escritas com letras maiúsculas, e a-
; pós " ; " os comentários não serão considerados pelo compilador.
;------------------------------------------------------------------------------
; PROJETO : LCD (escreve no display: CURSO DE MICROCONTOLADORES)
; DATA : 10/12/2008
;------------------------------------------------------------------------------
; AUTOR : Maurício Madeira Oliveira
;------------------------------------------------------------------------------
list p=16F628A ;para qual processador o código será gerado
radix dec ;padrão decimal para valores sem identificação
include <p16F628A.inc> ;anexa arquivo def.16F628A
__CONFIG _CP_OFF & _PWRTE_OFF & _BODEN_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF
;------------------------------------------------------------------------------
; TABELA DE DEFINIÇÕES DE RAM E CONSTANTES (defino nomes associados a valores)
;------------------------------------------------------------------------------

x equ 20h ; define variável auxiliar x na ram 0Ch (hexadecimal)


y equ 21h ; define variável auxiliar y na ram 0Dh (hexadecimal)
con0 equ 0h ; controle do sinal RS (LCD) através do PA.0
con1 equ 1h ; controle do sinal CS (LCD) através do PA.1

;Definição de caracteres que serão usados:

M equ 0x4D
I equ 0x49
;C equ 0x43 ; C não pode ser usada pois é nome p/ carry no uC
R equ 0x52
O equ 0x4F
N equ 0x4E
T equ 0x54
L equ 0x4C
A equ 0x41
D equ 0x44
U equ 0x55
S equ 0x53
E equ 0x45
# equ 0x23
; espaço em branco 0x20

;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
; MEMÓRIA DE PROGRAMA
;------------------------------------------------------------------------------
org 0 ; define inicio do programa a partir do end. 0h
goto início ; desvia o progrma para o label (rótulo) início
;------------------------------------------------------------------------------
; INÍCIO DA ROTINA DE INTERRUPÇÃO
;------------------------------------------------------------------------------
org 4 ; sempre inicia no end.4h as interrup.no PIC
; rotnas
retfie ; comando de retorno de interrupção
;------------------------------------------------------------------------------
; INÍCIO DO PROGRAMA - inicialização do uC
;------------------------------------------------------------------------------
início:
movlw B'00000000' ; w=00000000b
movwf INTCON ; INTCON=w , desabilitada as interrupções
bcf STATUS, IRP ; clear no bit irp do reg.status, pré-seleciono banco 0 e 1
bcf STATUS, RP1 ; clear no bit RP1 (RP1=0)
bsf STATUS, RP0 ; set bit RP0 (RP0=1) com estas duas linhas seleciono o banco 1, onde está o TRISB e TRISA

;-------------------------------------------------------------------------------
; Poderia usar o comando BANKSEL que é uma diretiva para seleção de banco de memória do MPLAB
; ex. BANKSEL TRISB, não precisaria digitar as duas linhas anteriores
; Também poderia usar o comando: movlw B'001XXXXX' e após movwf STATUS, onde x= a qualquer valor
; substituiria as três linhas anteriores (o registro STATUS está presente nos 4 bancos).
;-------------------------------------------------------------------------------
movlw 0
movwf TRISB ; registrador TRISB=0 (B'00000000') , OU SEJA, PINOS DO PORTB CONFIGURADOS COMO
; SAÍDAS
movlw 0FCH ; w=B'11111100'
movwf TRISA ; TRISA=B'11111100'pinos configurados como entradas e PA.1 e PA.0 como saídas
movlw B'11011000' ; w=11011000b
movwf OPTION_REG ; OPTION=w ,|RPBU\=1|INTEDEG=1|TOCS=0|TOSE=1|PSA=1|PS2=0|PS1=0|PS0=0|==>ler
reg. p/ saber a config.
bcf STATUS, RP0 ; clear bit RP0, seleciono banco 0
movlw 7 ; w=B'00000111'
movwf CMCON ; cmcon=w, desligo o comparador analógico (o reset não faz isso)
movlw 0 ; w=0
movwf CCP1CON ; CCP1CON=W=, desliga o módulo CCP (o reset faz isso, mas forçar o sinal por garantia)
movwf PORTB ; zero as saídas do PORTB (PORTB=w=0)
movwf PORTA ; zero as saídas do PORTA

;--------------------------------------------------------------------------------
; programa principal - aplicação
;--------------------------------------------------------------------------------

principal: ;inicialização do display LCD

bcf PORTA,con0 ; portA P0=0, RS=0 ,LCD recebe instrução


movlw 0x38 ; w=38h
movwf PORTB ; portB=instrução 38 p/ o LCD
call tempo ; rotina de 20mS
movlw 0x38 ;
movwf PORTB ; Verificar tabela de configuração LCD
call tempo ;
movlw 0x06 ; w=o6h
movwf PORTB ; portB=inst. 06 p/ o LCD
call tempo
movlw 0x0E ; w=0Eh
movwf PORTB ; portB=inst. 0E p/ o LCD
call tempo
movlw 0x01 ; w=01h
movwf PORTB ; portB=inst. 01 p/ o LCD
call tempo
movlw 0x80 ; w=80h
movwf PORTB ; portB=inst. 80 p/ o LCD, iniciar na 1.linha
; e 1.coluna do LCD
call time ; rotina de 40uS (pode ter tempo menor p/esta inst.)

esc1: ; rotina de escrita na primeira linha do LCD

bcf PORTA,con0
movlw 0x84 ; cursor na coluna 84 da linha 1
movwf PORTB
call time
bsf PORTA,con0 ; portA P0=1, RS=1 , LCD recebe dados
movlw 0x43 ; letra C
movwf PORTB
call time
movlw U
movwf PORTB
call time
movlw R
movwf PORTB
call time
movlw S
movwf PORTB
call time
movlw O
movwf PORTB
call time
movlw 0x20
movwf PORTB
call time
movlw D
movwf PORTB
call time
movlw E
movwf PORTB
call time
movlw 0x20
movwf PORTB
call time
bcf PORTA,con0 ; porta P0=0, RS=0 , LCD recebe inst.
movlw 0x0C0 ; w=C0h
movwf PORTB ; cursor vai p/2.linha, 1.coluna do LCD
call time
bsf PORTA,con0
movlw M
movwf PORTB
call time
movlw I
movwf PORTB
call time
movlw 0x43
movwf PORTB
call time
movlw R
movwf PORTB
call time
movlw O
movwf PORTB
call time
movlw 0x43
movwf PORTB
call time
movlw O
movwf PORTB
call time
movlw N
movwf PORTB
call time
movlw T
movwf PORTB
call time
movlw R
movwf PORTB
call time
movlw O
movwf PORTB
call time
movlw L
movwf PORTB
call time
movlw A
movwf PORTB
call time
movlw D
movwf PORTB
call time
movlw O
movwf PORTB
call time
movlw R
movwf PORTB
call time
; goto principal ; ou a linha ==> aqui: .....
aqui: goto aqui

;---------------------------------------------------------------------------------
; Rotinas de tempo
;---------------------------------------------------------------------------------

tempo: ; rotina de +/- 20mS

bsf PORTA,con1 ; gera sinal (alto) p/ CS do LCD


bcf PORTA,con1 ; gera sinal (low ) p/ CS do LCD
movlw 250 ; w=250d, 1uS
movwf x ; x=w , 1uS

temp1:
movlw 18 ; 1uS
movwf y ; 1uS
temp2:
nop ; 1uS
decfsz y ; decrementa y de 1,se>0 exec.prox.inst.
goto temp2 ; se=0 salta prox.inst.
decfsz x ; 1uS
goto temp1 ; 1uS
return ; 1uS

time: ; rontina de +/- 40uS

bsf PORTA,con1 ; gera sinal (alto) p/ CS do LCD


bcf PORTA,con1 ; gera sinal (low ) p/ CS do LCD
movlw 38 ; w=38d
movwf x
tim1:
nop
decfsz x
goto tim1
return
end

6.8 Acionamento de Display LCD com palavra de 4 bits.


Neste exemplo, o módulo de LCD será controlado com palavras de 4 bits. O código
em assembler é listado e novos comandos da família PIC são utilizados. Também é visto na
Figura 8 o circuito que economiza 4 pinos do microcontrolador. É utilizado um dos pinos do
PORTB para acionar um LED temporizado, que liga por +/- 2 segundos e após desligar o
programa escreve no módulo LCD. As informações para o módulo são transmitidas de 4 em 4
bits (nibles), sendo enviado primeiro os 4 bits mais significativos e após os demais (4 bits
menos significativos), sempre nesta ordem.
V1
5V
+V

2 Vdd MÓDULO LCD


D2
1N4148 R2 Vss Cnte RS R/W E B0 ........... B7
10k
1 3 4 5 6 7 8 9 10 11 12 13 14
MCLR\(4)
(14)Vdd
R1
10k 40%

+ PIC 16F628A
C3
S1 10uF
(09)RB3
(07)RB1
R3
(08)RB2 390R
(06)RB0
(10)RB4
(11)RB5
(12)RB6
(13)RB7
(17)RA0
(18)RA1

(5)Vss
(15) (16) D1
Clk-in Clk-out LED1

XTAL1
4.000MHZ

C1 C2
33pF 33pF

Figura 8 – Módulo LCD ativado com palavra de 4 bit’s.

A forma e a mensagem escrita no módulo LCD é verificada na Figura 9.

C U R S O
P I C 1 6 F 6 2 8

Figura 9 – Mensagem escrita no módulo LCD.

Você também pode gostar