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;
}