7-segment display driver for PIC 16F684


/*
 * File:   main.c
 * Author: root
 *  4-bit input 7-segment output for IC training board
 * Created on 29 June 2026, 16:29
 */

// CONFIG
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF       // MCLR 
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown Out Detect (BOR disabled)
#pragma config IESO = OFF       // Internal External Switchover bit (Internal External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)

#include <xc.h>
#include <pic16f684.h>
#define _XTAL_FREQ 4000000  // default  can be set by OSCCON

void main(void) {
    TRISA = 0b00111000; // input RA5 RA4 RA3 (MCLR) output RA2 RA1 RA0 
    TRISC = 0b00110000; // input RC5 RC4 output RC3 RC2 RC1 RC0
    PORTA = 0x00;
    PORTC = 0x00;
    ANSEL = 0x00;  // no analog input
    ADCON0 = 0x00;
    CMCON0 =  0b00000111;  //comparators CM2:CM0 off. CxIN pins are configured as digital I/O

unsigned char number=0;
const unsigned char arr_leds[16][7] = {
      {1,1,1,1,1,1,0},{0,1,1,0,0,0,0},{1,1,0,1,1,0,1},{1,1,1,1,0,0,1},{0,1,1,0,0,1,1},{1,0,1,1,0,1,1}, // 0 1 2 3 4 5
      {1,0,1,1,1,1,1},{1,1,1,0,0,0,0},{1,1,1,1,1,1,1},{1,1,1,1,0,1,1},{1,1,1,0,1,1,1},{0,0,1,1,1,1,1}, // 6 7 8 9 A b 
      {1,0,0,1,1,1,0},{0,1,1,1,1,0,1},{1,0,0,1,1,1,1},{1,0,0,0,1,1,1}  // C d E F
    };    


    while(1) {
        // read input
        number = 0;
       
        if (PORTAbits.RA5 == 1) number += 1;
        if (PORTAbits.RA4 == 1) number += 2;
        if (PORTCbits.RC5 == 1) number += 4;
        if (PORTCbits.RC4 == 1) number += 8;

        // RC0 =a RC1 =b, RA2 = c, RA1 =d,  RA0 = e, RC2 =f RC3= g
        PORTCbits.RC0 = arr_leds[number][0];
        PORTCbits.RC1 = arr_leds[number][1];
        PORTAbits.RA2 = arr_leds[number][2];
        PORTAbits.RA1 = arr_leds[number][3];
        PORTAbits.RA0 = arr_leds[number][4];
        PORTCbits.RC2 = arr_leds[number][5];
        PORTCbits.RC3 = arr_leds[number][6];        
       
    }
    return;
}