Você está na página 1de 9

4.

PIC16F877 / PIC16F877A / PIC16F887


O microcontrolador PIC16F877 muito usado para fins didticos, bem como o PIC16F877A e o PIC16F887, sendo este ltimo o mais novo. Como o PIC16F877A uma verso atualizada do 877, ele mais fcil de ser encontrado. Algumas de suas caractersticas so:

Frequncia de operao at 20MHz 256 bytes de memria de dados EEPROM 5 portas de input/output (I/O: entrada/sada, E/S), sendo elas A, B, C, D e E 3 timers (TIMER0, TIMER1 e TIMER2) 2 mdulos CCP (Capture/Compare/PWM), sendo eles CCP1 e CCP2 Comunicao serial MSSP, USART Comunicao paralela PSP Mdulos conversores analgico/digital de at 10 bits (8 canais)

4.1. Pinagem e Portas


Pinagem do PIC16F877A de 40 pinos (encapsulamento PDIP): cada pino pode
desempenhar uma ou mais funes, dependendo da configurao feita.

Portas: So ligaes entre o microcontrolador e o mundo exterior. No PIC16F877A de


encapsulamento PDIP temos 5 portas (A, B, C, D e E), cada uma com suas funes. Abaixo est uma lista dos pinos para o PIC16F877A: Pin o 1 2 3 4 5 6 7 8 Funo MCLR - Entrada de reset ou entrada da tenso de programao Vpp do microcontrolador. Pino RA0 Digital E/S ou entrada analgica 0 Pino RA1 Digital E/S ou entrada analgica 1 Pino RA2 Digital E/S, ou entrada analgica 2, ou entrada de tenso de referncia (low) do conversor A/D ou sada VREF do comparados. Pino RA3 Digital E/S, ou entrada analgica 3, ou entrada de tenso de referncia (high) do conversor A/D. Pino RA4 Digital E/S (open-drain quando configurado como sada) ou entrada de clock externo do Timer0 ou sada do comparador 1. Pino RA5 Digital E/S, ou entrada analgica 4, ou entrada de seleo bloco SPI (modo Slave) ou sada do comparador 2. Pino RE0 Digital E/S, ou entrada analgica 5 ou entrada de controle de leitura da porta paralela escrava

9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

Pino RE1 Digital E/S, ou entrada analgica 6 ou entrada de controle de escrita da porta paralela escrava Pino RE2 Digital E/S, ou entrada analgica 7 ou entrada de controle de chip select da porta paralela escrava Tenso positiva de alimentao para circuitos lgicos e pinos de E/S Referncia de terra dos circuitos lgicos e pinos de E/S Entrada para conexo de cristal oscilador ou entrada de sinal de clock externo Entrada para conexo de cristal oscilador ou entrada de sinal de clock externo (associada entrada OSC1). Pino RC0 Digital E/S, ou sada do Timer1 ou entrada de clock externo para Timer1 Pino RC1 Digital E/S, ou entrada do oscilador do Timer1, ou entrada do bloco Capture 2, ou sada do bloco Compare 2 ou sada PWM 2. Pino RC2 Digital E/S, ou entrada do bloco Capture 1, ou sada do bloco Compare 1 ou sada PWM 1. Pino RC3 Digital E/S, ou sada/entrada de clock para serial sncrona do bloco SPI ou sada/entrada de clock para serial sncrona do bloco I2C. Pino RD0 Digital E/S ou pino de E/S da porta paralela escrava. Pino RD1 Digital E/S ou pino de E/S da porta paralela escrava. Pino RD2 Digital E/S ou pino de E/S da porta paralela escrava. Pino RD3 Digital E/S ou pino de E/S da porta paralela escrava. Pino RC4 Digital E/S, ou entrada de dados SPI ou E/S de dados I2C. Pino RC5 Digital E/S ou sada de dados SPI. Pino RC6 Digital E/S, ou TX USART ou sinal de clock para USART sncrona. Pino RC7 Digital E/S, ou RX USART ou E/S de dados para USART sncrona. Pino RD4 Digital E/S ou pino de E/S da porta paralela escrava. Pino RD5 Digital E/S ou pino de E/S da porta paralela escrava. Pino RD6 Digital E/S ou pino de E/S da porta paralela escrava. Pino RD7 Digital E/S ou pino de E/S da porta paralela escrava. Referncia de terra dos circuitos lgicos e pinos de E/S Tenso positiva de alimentao para circuitos lgicos e pinos de E/S Pino RB0 Digital E/S ou pino de entrada de interrupo externa. Pino RB1 Digital E/S. Pino RB2 Digital E/S. Pino RB3 Digital E/S ou pino de habilitao de programao em baixa tenso no modo ICSP. Pino RB4 Digital E/S. Pino RB5 Digital E/S. Pino RB6 Digital E/S ou pino de sinal de clock para programao ICSP e depurao de cdigo In-Circuit. Pino RB7 Digital E/S ou pino de dados para programao ICSP e depurao de cdigo In-Circuit.

4.2. Acendendo um LED


#include <16F877A.h> #fuses HS, NOWDT, NOPUT, NOBROWNOUT, NOLVP #use delay(clock = 20000000)

void main() { output_high(PIN_D0); }

4.3. Display de 7 segmentos


4.3.1. Contador de 0 a 3
#include <16F877A.h> #fuses HS, NOWDT, NOPUT, NOBROWNOUT, NOLVP #use delay(clock = 20000000) void main() { while(1){ output_b(0b0111111); // 0 delay_ms(1000); output_b(0b0000110); // 1 delay_ms(1000); output_b(0b1011011); // 2 delay_ms(1000); output_b(0b1001111); // 3 delay_ms(1000); } }

4.3.2. Contador de 0 a 9
#include <16F877A.h> #use delay(clock = 20000000) #fuses NOWDT, HS, PUT, NOBROWNOUT, NOLVP

byte const decodificador[10] = {0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01100111}; void main() { int s = 0; while(1) { output_b(decodificador[s]); delay_ms(1000); s++; if (s > 9) s = 0; } }

4.3.3. Displays de 7 segmentos multiplexados


Nos exemplos anteriores, utilizamos um nico display de 7 segmentos e o ligamos na porta B. Se precisssemos usar 2 displays, poderamos ligar o segundo display na porta C ou D. E se quisssemos utilizar 3 displays, ligaramos um em cada porta (B, C e D). Notem que estaramos utilizando 21 pinos do PIC s para controlar os displays. A tcnica de multiplexar consiste em ligar todos os displays em uma nica porta. Mas se ligarmos todos na mesma porta, eles iro exibir todos a mesma coisa. Este problema se resolve se ns ligarmos somente 1 display por vez, ou seja, todos os outros estaro apagados. Assim, se ligarmos e desligarmos os displays rapidamente, ao mesmo tempo alterando a sada da porta em uso, no conseguiremos enxergar os displays apagados. No caso, ligaramos e desligaramos

os displays por meio do pino comum deles (ctodo ou nodo comum). Esta prtica de multiplexar displays til no somente para que haja economia de pinos, mas tambm para que haja economia de energia, pois os displays no esto sempre ligados. necessrio um intervalo de tempo (muito curto) entre o ligamento/desligamento/exibio dos displays. De preferncia, utilizando TIMERs.

4.4. Display de LCD 16x2


4.4.1. Relgio digital
#include <16F877A.h> #use delay(clock = 20000000) #fuses HS, NOWDT, NOPUT, NOBROWNOUT, NOLVP #include <bib_LCD_16x2_all.c> void main() { ini_lcd_16x2(); int segundos = 0, minutos = 0, horas = 0; while(1) { delay_ms(1000); segundos++; if (input(PIN_C3)) segundos = 0; if (input(PIN_D0)) minutos++; if (input(PIN_D1)) horas++; if (segundos == 60) { segundos = 0; minutos++; if (minutos == 60) { minutos = 0; horas++;

if (horas == 24) { horas = 0; } } } printf(exibe_lcd,"\fHora: %02d:%02d:%02d", horas, minutos, segundos); } }

Pino LCD
BLBL+ VSS VDD V0 RS RW E D4 D5 D6 D7

Pino PIC
0V 5V com resistor 0V 5V com resistor 0V Pino 9 (RE1 / WR) 0V Pino 8 (RE0 / RD) Pino D4 Pino D5 Pino D6 Pino D7

Fontes:

ww1.microchip.com/downloads/en/devicedoc/39582b.pdf (Data Sheet PIC16F87XA) Apostila de Microcontrolador PIC16F877 (Disciplina Sistemas Digitais, Prof. Manoel Alves) Minicurso de Microcontrolador PIC16F877 (Alison Lins)

Você também pode gostar