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.
Bookmarks