4 digit 7- segment with 16f676

sahu

Member
i have need read more then 1 adc ,but no left adc pin on this code .if i use 7447 BCD to 7 Segment driver IC .then it possible with this code .
Code:
#include <htc.h>
__CONFIG (FOSC_INTRCIO & MCLRE_OFF & BOREN_ON & CP_OFF & CPD_OFF & WDTE_OFF & PWRTE_ON );



#define SPORT PORTA
#define DPORT PORTC
const char SegCode[11] ={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xFF};// {0x40,0x57,0x22,0x06,0x15,0x0C,0x08,0x56,0x00,0x04,0xFF};
    //                       0    1    2    3    4    5    6    7    8    9
const char Column[3]   = {0x02,0x01,0x04};
static char Segment[3] = {0x7f,0x7f,0x7f};   
static unsigned char ColCount=0x00;
void CPU_SETUP(void);
void Display(void);
void HTO7S(unsigned int Num);
void delayMs(int x);

unsigned int result;
unsigned int readAdc(void);
void interrupt  timer1_isr(void)
{
if(PIR1bits.TMR1IF==1)
{
PIR1bits.TMR1IF = 0;
    TMR1H=0xDF;
Display();
}
}
void main()
{       
    unsigned char i;
   
    CPU_SETUP();
    while(1)
    {           
        result=0;
        for (i=0;i<3;i++)
        {
           
            delayMs(1);
            result=result+readAdc();
        }
                HTO7S(result/3);                               
       
        delayMs(200);           
    }
   
}

void CPU_SETUP()
{
    CMCON =0x07;        //Turn off comparator module
    ANSEL =0x8;            //AN3 as analog input
    ADCON1 =0x60;         //clock/64
    ADCON0 = 0x8D;
       TRISA=0b00011000;
       PORTA=0x27;
       TRISC=0b00000000;
       PORTC=0x37;
  
   T1CON= 0x00;
      TMR1H=0xDF;
       INTCONbits.GIE =1;
    INTCONbits.PEIE=1;
    PIE1bits.TMR1IE =1;
     T1CONbits.TMR1ON=1;
}
unsigned int readAdc()
{
unsigned int res;
ADCON0bits.GO_DONE =1;
while(ADCON0bits.GO_DONE ==1);
res=ADRESL+(ADRESH*0x100);
return(res);
}
//-------------------------------------
// Display routine
//-------------------------------------
void Display()
{
    PORTA = 0b00100111;      // off all digits column and Segment G
    PORTC = 0b00111111;   // off segment a-f   

   

    if (ColCount>=3)
    ColCount=0;
       
    DPORT = Segment[ColCount];
    SPORT = ((Segment[ColCount] & 0b01000000)>>1) | (Column[ColCount]^0x07);
    ColCount++;               
}   

//--------------------------------------
// Convet HEX 2 byte to 7-Segment code
//--------------------------------------
void HTO7S(unsigned int Num)
{
   
    unsigned int res;

    res = ((30*Num)%1023)/100;
    if(res==10)
    {
    Num=Num+1;
    res=0;
    }
    Segment[2]=SegCode[res];

    res = (30*Num)/1023;
    Segment[1]=SegCode[res%10];

    Segment[0]=SegCode[res/10];
    if (Segment[0]==0x40)
    Segment[0]=0xFF;   
   
}   

void delayMs(int x)
{
int i;
for (x ;x>0;x--)
{
for (i=0;i<=110;i++);
}
}
we can use 7447 BCD to 7 Segment driver IC with 16f676 as
Code:
                     _______
                vdd | 1  14 | Vss
DIGIT_1000 <-- RA5 | 2  13 | AN0 <-- ADC0
  DIGIT_100 <-- RA4 | 3  12 | AN1 <-- ADC1
               MCLR | 4  11 | AN2 <-- ADC2
   DIGIT_10 <-- RC5 | 5  10 | RC0 --> A
    DIGIT_0 <-- RC4 | 6   9 | RC1 --> B
          D <-- RC3 | 7   8 | RC2 --> C
                     _______
any body can guide me ?
 
or we can use 74595 to 7 Segment driver IC with 16f676 as
Code:
                     _______
                vdd | 1  14 | Vss
DIGIT_1000 <-- RA5 | 2  13 | AN0 <-- ADC0
  DIGIT_100 <-- RA4 | 3  12 | AN1 <-- ADC1
               MCLR | 4  11 | AN2 <-- ADC2
   DIGIT_10 <-- RC5 | 5  10 | RC0 --> DS
    DIGIT_0 <-- RC4 | 6   9 | RC1 --> ST_CP
            <-- RC3 | 7   8 | RC2 --> SH_CP
                     _______
 
I cannot help you with the code, but have you looked at the MAX7221? This takes a lot of the 7 segment driving headache away
 
while using a microcontroller, was it so essential to reduce pins by using discrete device . You could well use multiplexed seven segment code itself.
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…