Sunday, May 17, 2020

Programming the digital inputs outputs of PIC16F887 with XC8

PIC16F887 has up to 35 digital inputs outputs, divides into ports. They are:
  1. PORTA
  2. PORTB
  3. PORTC
  4. PORTD
  5. and PORTE
PIC16F887 pin diagram
PIC16F887 Pin Diagram

Each port has its own address locates in the special function register (SFR). They are 8-bit wide and Read/Write.

Port                Address
---------------------------
PORTA            0x05
PORTB            0x06                    
PORTC            0x07
PORTD            0x08
PORTE            0x09

Each Port controlled by a direction register called TRIS. For example, TRISA controls the direction of PortA. They have the corresponding address in the SFR:

TRIS               Address
---------------------------
TRISA            0x85
TRISB            0x86                    
TRISC            0x87
TRISD            0x88
TRISE            0x89

Writing a '1' to TRISx make the corresponding PORTx as a digital input. While writing a '0' to TRISx make the corresponding PORTx as a digital output.

For example, TRISA=0x01 will make RA0 of PORTA as a digital input.

Example:
TRISA=0x0F    make RA0...3 as a digital input
TRISB=0xF0    make RB0...3 as a digital output

In this example, I use PORTC as a digital input port, reading digital data from a DIP switch.

PORTD is assigned to a digital output port, displaying digital value to LED bar graph.


Circuit Diagram for digital inputs outputs
Circuit Diagram
When setting up on real hardware, don't forget to connect VDD and VSS
The supply voltage assumed to be +5 V DC.
The external crystal is 4 MHz, clocks the PIC16F887.
PORTC read the digital input from the DIP Switch.
PORTD displays the digital output to bar graph LEDs.

In XC8, we include xc.h file. It contain all SFR information for selected PIC device.

Source Code:
#include<xc.h>
// CONFIG1
#pragma config FOSC = XT
#pragma config WDTE = ON
#pragma config PWRTE = OFF
#pragma config MCLRE = ON
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = ON
#pragma config IESO = ON
#pragma config FCMEN = ON
#pragma config LVP = ON
// CONFIG2
#pragma config BOR4V = BOR40V
#pragma config WRT = OFF
void main(){
//Clear PortC
PORTC=0x00;
//Clear PortD
PORTD=0x00;
//PortC as input
TRISC=0xFF;
//PortD as output
TRISD=0x00;
while(1){
PORTD=PORTC;
}
}

The picture below is a screen shot of simulation.

Simulating the digital inputs outputs of PIC16F887 with XC8
A screen shot of the simulation.
PORTC read 0x0F from the DIP switch.
PORTD write 0x0F to the bar graph LED.

No comments:

Post a Comment

Search This Blog

Labels

25AA010A (1) 8051 (7) 93AA46B (1) ADC (30) Analog Comparator (1) Arduino (15) ARM (6) AT89C52 (7) ATMega32 (54) AVR (57) CCS PICC (28) DAC (1) DHT11 (2) Display (105) Distance Sensor (3) DS18B20 (3) dsPIC (2) dsPIC30F1010 (2) EEPROM (5) Environment Sensor (4) esp8266 (1) I2C (29) Input/Output (67) Interrupt (19) Keil (5) Keypad (10) LCD (46) Master/Slave (1) MAX7221 (1) MCP23017 (5) MCP23S17 (4) Meter (3) MikroC (2) Motor (15) MPLABX (66) Nokia 5110 LCD (3) OLED (2) One-Wire (6) Oscillator (8) PCB (6) PCD8544 (3) PCF8574 (5) PIC (107) PIC12F (2) PIC16F628A (2) PIC16F630 (1) PIC16F716 (3) PIC16F818 (10) PIC16F818/819 (2) PIC16F84A (15) PIC16F876A (1) PIC16F877A (9) PIC16F88 (1) PIC16F887 (60) PIC18 (19) PIC18F1220 (4) PIC18F2550 (3) PIC18F4550 (12) PWM (11) RTC (8) Sensor (10) SH1106 (1) Shift Register (11) Shift Registers (2) SPI (24) STM32 (6) STM32 Blue Pill (6) STM32CubeIDE (6) STM32F103C8T6 (6) SysTick (3) temperature sensor (11) Thermometer (21) Timer/Counter (30) TM1637 (2) UART (7) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (94)