/***************************************** Program for 7segment voltmeter Program written by MKDas, email: mithun060@gmail.com; MCU: PIC16F73B, X-Tal: 8MHz (external). ************************************************/ unsigned int adc_rd0,tlong; unsigned short mask(int num) { switch (num) { case 0 : return 0xC0; case 1 : return 0xF9; case 2 : return 0xA4; case 3 : return 0xB0; case 4 : return 0x99; case 5 : return 0x92; case 6 : return 0x82; case 7 : return 0xD8; case 8 : return 0x80; case 9 : return 0x90; case 10: return 0x40; case 11: return 0x79; case 12: return 0x24; case 13: return 0x30; case 14: return 0x19; case 15: return 0x12; case 16: return 0x02; case 17: return 0x78; case 18: return 0x00; case 19: return 0x10; } } unsigned short shifter, portb_index; unsigned int digit, number; unsigned short portb_array[4]; void interrupt() { PORTC = 0; PORTB = portb_array[portb_index]; PORTC = shifter; shifter <<= 1; if(shifter > 8u) shifter = 1; portb_index ++ ; if (portb_index > 3u) portb_index = 0; TMR0 = 0; INTCON = 0x20; } void display() { digit = number % 10u; portb_array[0] = mask(digit); digit = (number / 10u) % 10u; portb_array[1] = mask(digit); digit = (number / 100u) % 10u+10; portb_array[2] = mask(digit); digit = number / 1000u; portb_array[3] = mask(digit); } void main() { // port initialization... TRISB = 0x00; // Set PORTB direction to be output PORTB = 0xff; // Turn OFF LEDs on PORTB TRISC= 0x00; // Set PORTB direction to be output PORTC = 0x00; TRISA = 0xFF; // all input digit = 0; portb_index = 0; shifter = 1; number = 0; //initial value; ADCON1 = 0x00; // tiemr0 settings... OPTION_REG = 0x80; // Set timer TMR0; TMR0 = 0; INTCON = 0xA0; // Disable interrupt PEIE,INTE,RBIE,T0IE while(1) { // Read Battery voltage ADCON0 = 0b00000001; adc_rd0 = ADC_Read(0); // A/D conversion. Pin RA2 is an input. tlong = (float)adc_rd0 *1.96078431372549; // Convert the result in millivolts number = tlong; display(); }//Endless loop; }//End.