Here is the code I was eyeballing, From Nuts and Volts Aug 2007, a water heater controller, display section,
Code:
////////////////// Display.c //// for PIC16F684 using MPLAB IDE 7.51
//       PICC Compiler with PICSTART Plus programmer
//       by Dick Aidt  7 Mar 07   //
//       Program displays the digits sent by the Thermal program
#include <pic.h>
#include <math.h>
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & UNPROTECT &\
UNPROTECT & BORDIS & IESODIS & FCMDIS);

const char LEDDigit[ ] = 
 { 0b0000001,                  //  "0"
    0b1001111,                  //  "1"
    0b0010010,                  //  "2"
    0b0000110,                  //  "3"
    0b1001100,                  //  "4"
    0b0100100,                  //  "5"
    0b0100000,                  //  "6"
    0b0001111,                  //  "7"
    0b0000000,                  //  "8"
    0b0001100,                  //  "9"
    0b0001000,                  //  "A"
    0b1100000,                  //  "B"
    0b0110001,                  //  "C"
    0b1000010,                  //  "D"
    0b0110000,                  //  "E"
    0b0111000  };              //  "F"

int  Value=0;
int Dig [ 4 ];
int i=0,t=0, x = 0, y = 0, z = 0;
int in = 0;	// built up inputed data Temp
int s = 0;	// recieved bit
const j[ ]={0,1,0,1};
const k[ ]={0,0,1,1};

main(void)
{
	CMCON0 = 7;			//  Turn off comparators
	ANSEL = 0;			//  disable  analog
	PORTA = 0b00001100;
	TRISA = 0b00001100;		//  RA2 & RA3 are inputs
	PORTC = 0;
	TRISC = 0b00000000;		//  PORTC is all outputs	
	
	


ADC:	if (!RA3) 
	{
		in = 0;
		for ( i = 0; i < 12; i ++)
		{ 	
			while ( ! RA3) //wait for HI sync pluse
				{NOP();}
			{ s = RA2; in = (in | ( s << i));} // get the bit
			while (RA3) //wait for LO sync pluse
				{NOP();}
		} // get next bit
		while ( ! RA3) // wait for HI sync pluse
		NOP();		
		Value = 0;				
		Value =  in;	// make display numbers array	
		if (Value < 1000)
			{	z = 1;
				Dig [ 0 ] = 0;
				goto JUMP1;
			}
		else z = 0;
			NOP();	
		Dig [ 0 ] = Value/1000;
JUMP1:	Dig [ 1 ] = Value / 100 - (Dig[0] * 10);
		Dig [ 2 ] = Value / 10- (( Dig[0] * 100 )+ ( Dig[1] * 10 ));
		Dig [ 3 ] = Value  - (( Dig[0] * 1000 )+ ( Dig[1] * 100 ) +( Dig[2]*10));
	}
	for (y=0; y < 4; y++) // Display the digits
	{	
		if ( y == 0 & z == 1 ) 
			 y = 1;// if F < 100 skip first digit	
		PORTC = LEDDigit [ Dig [ y ] ];
		RA5 = LEDDigit [ Dig [ y ] ] >> 6;
		RA0 = j [ y ];		//select which digit
		RA1 = k[ y ];
		if  (y == 2)
			RA4=0; // turn on decimal point
		else RA4=1;						
		NOP();
		for (t=0; t<327; t++);// display delay
		NOP();		
	} // end for
	PORTC = 0b11111111;
	RA5 = 1;
	goto ADC;
} // End
Notice the lookup table for the digits.