Menu

Adskeeper - header widge

728x90

Menu

Wednesday, May 20, 2020

PIC16F887 Counting Display Example

Interrupt occurred very quickly, and in background. So in the main program loop, we don't need to pay attention on it. We can spend the time in the program main loop doing other tasks.

Here's an example of implementing the interrupt on change of PIC16F887. In this example, I use only three interrupt on change pins RB0 RB1 and RB2. When the interrupt occurred, We will process the counting in the ISR.

The main program loop just display the counting result on a four-digit multiplexed seven-segments display.

For more information about multiplexing the display click here.

Making a digital up down counter using PortB interrupt on change of PIC16F887 with Multiplexed Display
Schematic diagram.
RB0, RB1 and RB2 implement the IOCB
to process the up/down and reset counting.
PortC uses to output the numbers.
PortD uses to control the 4 digits.

Source code is written using XC8.
#include<xc.h>
// PIC16F887 Configuration Bit Settings
// CONFIG1
#pragma config FOSC = XT
#pragma config WDTE = OFF
#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
#define _XTAL_FREQ 4000000
unsigned int counter=0;
/*Interrupt service routine*/
void interrupt _ISR(void){
    /*looking for portB interrupt
     on change by checking RBIF*/
    if(RBIF){
        /*Test individual pin*/
        if(RB0==0)  {
            if(counter<0)
                counter-=1;
        }
        if(RB1==0)  counter=0;
        if(RB2==0)  {
            if(counter<1000)
                counter+=1;
        }
        RBIF=0;
    }
}
void driveDisplays(unsigned int cnt){
    unsigned char ssd[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,
 0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
 //Digit 4 1000's
 PORTD=0x00;
 PORTC=ssd[cnt/1000];
 PORTD=0x08;
 __delay_ms(10);
 //Digit 3 100's
 PORTD=0x00;
 PORTC=ssd[(cnt%1000)/100];
 PORTD=0x04;
 __delay_ms(10);
 //Digit 2 10's
 PORTD=0x00;
 PORTC=ssd[(cnt%100)/10];
 PORTD=0x02;
 __delay_ms(10);
 //Digit 1 1's
 PORTD=0x00;
 PORTC=ssd[cnt%10];
 PORTD=0x01;
 __delay_ms(10);
}
void main(){
    /*clear PortB*/
    PORTB=0x00;
    /*Clear PortC*/
    PORTC=0x00;
    /*clear PortD*/
    PORTD=0x00;
    /*PortC Output*/
    TRISC=0x00;
    /*PortD as output*/
    TRISD=0x00;
    /*PortB0.3 input*/
    TRISB=0x07;
    /*disable all analog input of portB*/
    ANSELH=0;
    /*turn on global weak pull up*/
    nRBPU=0;
    /*Turn on pull up resistor from RB0 to RB3*/
    WPUB=0x07;
    /*enable portB interrupt on change
     of all pins*/
    IOCB=0x07;
    RBIE=1;
    /*enable global interrupt*/
    GIE=1;
    /*program main loop just do
    the multiplexing display*/
    while(1) driveDisplays(counter);
}

I took a screen shot while simulating.

Making a digital up down counter using PortB interrupt on change of PIC16F887 with Multiplexed Display
A simulation screen shot.
The counting reach 15.
The program main loop keeps track only for
driving the multiplexed display.

No comments:

Post a Comment

Search This Blog

Navbar

Electronics and Programming Tutorials

DIY Electronic Projects And Instruments

Labels

23K256 (1) 24C16B (2) 25AA010A (2) 8051 (7) 93AA46B (1) ADC (40) Analog Comparator (1) Arduino (16) ARM (32) AT89C52 (7) ATMega32 (59) ATMega644P (27) AVR (88) AVR PCB (2) Bootloader (1) CCS PICC (31) Change Notify Interrupt (CNI) (2) DAC (2) DHT11 (5) Display (157) Distance Sensor (3) dot matrix (1) ds1307 (10) DS18B20 (6) ds3231 (2) ds3232 (2) dsPIC (16) dsPIC30F1010 (3) dsPIC30F2010 (15) EEPROM (5) Environment Sensor (6) ESP32 (1) esp8266 (1) Graphical LCD (3) HD44780 (13) I2C (40) ILI9341 (1) Input/Output (85) Interrupt (22) IoT PCB (1) Keil (5) Keypad (16) KS0108 (3) LCD (88) LM35 (4) Master/Slave (2) MAX7221 (1) MCP23017 (8) MCP23S17 (7) MCP4921 (1) MCP4922 (2) Meter (3) MikroC (2) MikroC ARM (1) MikroC dsPIC (11) MikroC PIC (2) Module PCB (2) Motor (15) MPLABX (73) Nokia 5110 LCD (5) OLED (2) One-Wire (7) Oscillator (8) PCB (13) PCD8544 (3) PCF8574 (13) PIC (122) PIC12F (3) PIC16 (105) PIC16F628A (3) PIC16F630 (2) PIC16F716 (4) PIC16F818 (11) PIC16F818/819 (3) PIC16F84A (16) PIC16F876A (2) PIC16F877A (9) PIC16F88 (2) PIC16F887 (60) PIC18 (19) PIC18F1220 (5) PIC18F2550 (5) PIC18F4550 (14) PICKit2 (1) PICMicro PCB (4) Pin Change Interrupt (1) PLL (1) PWM (12) RTC (13) SBN0064G (1) Sensor (15) SH1106 (3) Shift Register (15) Shift Registers (19) SN74HC595N (9) Software SPI (1) Software TWI (3) SPI (44) sprinf (3) ST7735 (1) STM32 (29) STM32 Black Pill (1) STM32 Blue Pill (12) STM32 HAL (23) STM32CubeIDE (32) STM32F103C8T6 (9) STM32F103R6 (18) STM32F401CCU6 (1) SysTick (7) temperature sensor (15) TFT (1) TG12864A (1) Thermometer (22) Timer/Counter (32) TM1637 (2) twi (10) UART (11) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (96)