#include <pic.h>
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & UNPROTECT & BORDIS);
const unsigned char COMP1[4] = {0x94, 0x95, 0x96, 0x97};
const unsigned char COMP2[4] = {0xA0, 0xA1, 0xA2, 0xA3};
#define NUM_BTTNS 4
#define ON 0
#define OFF 1
#define AVG_DELAY 16
#define PCT_ON 65
#define PCT_OFF 60
#define PCT_AVG 18
#define TRISC2OUT TRISA5
#define TRISC2OUT TRISA5
#define TRISC12IN0 TRISA0
#define TRISC12IN1 TRISA1
#define TRISC12IN2 TRISB3
#define TRISC12IN3 TRISB1
#define LED1 RC1
#define LED2 RC2
#define LED3 RB4
#define LED4 RB5
#define SPA RB0///090217
#define TRISSPK TRISB0//090217
#define TRISLED1 TRISC1
#define TRISLED2 TRISC2
#define TRISLED3 TRISB4
#define TRISLED4 TRISB5
unsigned char index;
long percent;
unsigned int RAW[NUM_BTTNS];
unsigned int AVERAGE[NUM_BTTNS];
unsigned char INDEX;
unsigned char first;
unsigned int value;
#define B1 0
#define B2 1
#define B3 2
#define B4 3
typedef struct {
char B11 :1;
char B22 :1;
char B33 :1;
char B44 :1;
}BButtons;
BButtons Buttons;
void Abit_init(void);
void Abit_capinit(void);
void Abit_restart_timers(void);
void interrupt isr(void);
void Abit_next_channel(void);
void AbitDisplayLEDs(char i);
void AbitDisunplayLEDs(char i);
void main(void)
{
Abit_init();
LED1=OFF;
LED2=OFF;
LED3=OFF;
LED4=OFF;
SPA=OFF;
while(1)
{
Buttons.B11==1 ? AbitDisplayLEDs(0):AbitDisunplayLEDs(0);
Buttons.B22==1 ? AbitDisplayLEDs(1):AbitDisunplayLEDs(1);
Buttons.B33==1 ? AbitDisplayLEDs(2):AbitDisunplayLEDs(2);
Buttons.B44==1 ? AbitDisplayLEDs(3):AbitDisunplayLEDs(3);
}
}
void Abit_init(void)
{
TRISC2OUT=0;
TRISC12IN0=1;
TRISC12IN1=1;
TRISC12IN2=1;
TRISC12IN3=1;
TRISSPK=0;
TRISLED1=0;
TRISLED2=0;
TRISLED3=0;
TRISLED4=0;
Buttons.B11 = 0;
Buttons.B22 = 0;
Buttons.B33 = 0;
Buttons.B44 = 0;
Abit_capinit();
GIE=1;
}
void Abit_restart_timer(void)
{
TMR1L = 0;
TMR1H = 0;
TMR1ON = 1;
TMR0 = 0;
T0IF = 0;
}
void Abit_next_channel(void)
{
INDEX = (++INDEX) & 0x03;
CM1CON0 = COMP1[INDEX];
CM2CON0 = COMP2[INDEX];
}
void Abit_capinit(void)
{
for(INDEX=0;INDEX< NUM_BTTNS;INDEX++)
{
RAW[INDEX]=0;
AVERAGE[INDEX]=0;
}
first=50;
OSCCON=0X7F;//内部8M晶振
INDEX=0;
CM1CON0=COMP1[INDEX];
CM2CON0=COMP2[INDEX];
CM2CON1=0X32;
ANSEL=0X05;
ANSELH=0X00;
VRCON = 0x8d;
SRCON = 0xF0;
T1CON = 0x06;
OPTION = 0x82;
Abit_restart_timer();
INTCON = 0;
T0IE = 1;
}
void interrupt isr(void)
{
if (T0IF==1 && T0IE==1)
{
TMR1ON = 0;
value = TMR1L + (unsigned int)(TMR1H << 8);
RAW[INDEX]=value;
if (first > 0)
{
first--;
AVERAGE[INDEX] = value;
Abit_next_channel();
Abit_restart_timer();
return;
}
percent=((long)AVERAGE[INDEX]-(long)value);
if(percent<0)
{
percent=0;
}
else
{
percent=percent*1000;
percent=percent/AVERAGE[INDEX];
}
if (percent > PCT_ON)
{
switch (INDEX)
{
case B1: Buttons.B11 = 1; break;
case B2: Buttons.B22 = 1; break;
case B3: Buttons.B33 = 1; break;
case B4: Buttons.B44 = 1; break;
default: break;
}
}
else if (percent < PCT_OFF)
{
switch (INDEX)
{
case B1: Buttons.B11 = 0; break;
case B2: Buttons.B22 = 0; break;
case B3: Buttons.B33 = 0; break;
case B4: Buttons.B44 = 0; break;
default: break;
}
}
if (value > AVERAGE[INDEX])
AVERAGE[INDEX] = value;
if (percent < PCT_AVG)
{
if (index< AVG_DELAY) index++;
else index = 0;
if (index == AVG_DELAY)
AVERAGE[INDEX] = AVERAGE[INDEX] + ((long)(value) - (long)(AVERAGE[INDEX]))/8;
}
Abit_next_channel();
Abit_restart_timer();
}
}
void AbitDisplayLEDs(char i)
{
switch (i)
{
case 0xFF:
case 0: LED1 = ON;SPA=ON; break;
case 1: LED2 = ON;SPA=ON; break;
case 2: LED3 = ON; SPA=ON;break;
case 3: LED4 = ON; SPA=ON;break;
default: break;
}
}
void AbitDisunplayLEDs(char i)
{
switch (i)
{
case 0xFF:
case 0: LED1 = OFF;SPA=OFF; break;
case 1: LED2 = OFF;SPA=OFF; break;
case 2: LED3 = OFF;SPA=OFF; break;
case 3: LED4 = OFF; SPA=OFF;break;
default: break;
}
}