#include <XC.h>
#pragma config BOREN = OFF, CPD = OFF, FOSC = INTRCIO, MCLRE = OFF, WDTE = OFF, CP = OFF, PWRTE = OFF
#define _XTAL_FREQ 4000000 // 4MHz clock
#define SPORTA PORTA
#define SPORTC PORTC
#define TICKS_BETWEEN_INTERRUPTS 5000 //5000
#define INTERRUPT_OVERHEAD 35
#define TMR1RESET (0xFFFF-(TICKS_BETWEEN_INTERRUPTS-INTERRUPT_OVERHEAD))
const char SegCode[11] = {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);
int read_adc(void);
void Display(void);
void HTO7S(unsigned long Num);
unsigned long result;
void interrupt Timer1(void)
{
TMR1L = (unsigned char) (TMR1RESET & 0xFF);
TMR1H = (unsigned char) (TMR1RESET >> 8);
Display();
TMR1IF = 0;
}
void main()
{
unsigned char i;
CPU_SETUP();
while(1)
{
result=0;
for (i=0;i<20;i++)
{
ADCON0 = 0x8D;
__delay_ms(1);
result=result+read_adc();
}
//result = 0x3fe;
HTO7S(result/20);
__delay_ms(200);
}
}
int read_adc()
{
unsigned int res;
GO = 1;
while(GO);
res = (int)ADRESH << 8;
res+= ADRESL;
return res;
}
void CPU_SETUP()
{
CMCON = 7; // not use comparator module
ANSEL = 0x8;
ADCON1 = 0x50;
TRISA=0b00011000;
PORTA=0x27;
TRISC=0b00000000;
PORTC=0x37;
T1CON = 1;
TMR1L = (unsigned char) (TMR1RESET & 0xFF);
TMR1H = (unsigned char) (TMR1RESET >> 8);
TMR1IE = 1;
PEIE = 1;
GIE = 1;
}
//-------------------------------------
// Display routine
//-------------------------------------
void Display()
{
PORTA = 0b00100111; // off all digits column and Segment G
PORTC = 0b00111111; // off segment a-f
NOP();
NOP();
if (ColCount>=3)
ColCount=0;
SPORTC = Segment[ColCount];
SPORTA = ((Segment[ColCount] & 0b01000000)>>1) | (Column[ColCount]^0x07);
ColCount++;
}
//--------------------------------------
// Convet HEX 2 byte to 7-Segment code
//--------------------------------------
void HTO7S(unsigned long Num)
{
unsigned long res;
Segment[0]=SegCode[30*Num/10230];
if (Segment[0]==0x40)
Segment[0]=0xFF;
res = 30*Num%10230;
Segment[1]=SegCode[10*res/10230];
res=10*res%10230;
Segment[2]=SegCode[10*res/10230];
}