Monday, May 18, 2020

PIC16F887 interfaces to a single digit seven-segment display with XC8

Seven Segment Display (SSD) is a classical display device for low end digital electronic equipment. The programming for is very simple. It could represent numbers and some English letters.

It come with two terminology, common cathode type and common anode type. But deciding which type to use depends on the application. In this example, I take only common cathode type.

 
Single digit seven segments display
single digit seven segments display

LED segments configurations
Segment LED diagram


Since it made of seven LED segment, we just turn on any LED to display digit or letter. For example, turning on LED segment B and C make digit "1" to display.

In the programming, they commonly use hexadecimal equivalent to the SSD output.

For the common cathode type display the hex code represent the digit from 0 to 9 and from A to F is shown below:


Each LED segment made of from LED, requiring around 2 V and ~10 mA of current. Typically, the digital output from microcontroller drives a voltage of +5V TTL. So we need to cut down the voltage from microcontroller to ~2 V via resistor.

In this example, RD0 to RD6 used to interface with single digit seven-segment display. RD7 used as digital input, counting the number of pressed from the button

The maximum counting is 16 pulses.

PIC16F887 interfaces to a single digit seven-segment display with XC8
The PIC16F887 CPU clocks at 4 MHz.
It's supplied at +5 V DC.
PortD RD0 to RD6 displays the counting result.
PortD RD7 listens to the input counting.


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
/*_XTAL_FREQ use for __delay*/
#define _XTAL_FREQ 4000000
//Label a button a RD7
#define pressCounter RD7
void main(){
    /*SEVEN SEGMENT MAP FOR COMMON
    CATHODE TYPE SEVEN-SEGMENT DISPLAY*/
    unsigned char ssd[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,
        0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
    unsigned char btnCount=0;
    //Clear PortD
    PORTD=0x00;
    //Set RD7 to Digital Input
    TRISD=0x80;
    while(1){
        if(pressCounter==0){
            __delay_ms(250);
            btnCount+=1;
        }
        if(btnCount>15) btnCount=0;
        PORTD=ssd[btnCount];
    }
}
I took a screen shot of the simulation.

simulation result of the PIC16F887 interfaces to a single digit seven-segment display with XC8
While the simulation.
The counting reaches seven.
The SSD display the counting result.

A similar post could be found here.


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)