// Global variables for sensing
unsigned int base_cnt[Num_Sen];
unsigned int meas_cnt[Num_Sen];
int delta_cnt[Num_Sen];
unsigned char key_press[Num_Sen];
const unsigned int KEY_lvl_S[5]={4000,40,40,90,100};
const unsigned int KEY_lvl_W[5]={4000,40,40,90,100};
char key_pressed, key_loc;
int cycles;
unsigned int LEDCount = 4000;
unsigned int LEDTimer = 10;
unsigned int swjudge = 0;
// System Routines
void measure_count(void); // Measures each capacitive sensor
void pulse_LED(void); // LED gradient routine (for demo only)
// Main Function
void main(void)
{
volatile unsigned int i,j;
measure_count(); // Establish an initial baseline capacitance
for (i = 0; i
{
if(meas_cnt>1000)
swjudge++;
}
for (i = 0; i
base_cnt = meas_cnt;
for(i=15; i>0; i--) // Repeat and average base measurement
{ measure_count();
for (j = 0; j
base_cnt[j] = (meas_cnt[j]+base_cnt[j])/2;
}
// Main loop starts here
while (1)
{
key_pressed = 0; // Assume no keys are pressed
measure_count(); // Measure all sensors
for (i = 0; i
{ delta_cnt = base_cnt - meas_cnt; // Calculate delta: c_change
// Handle baseline measurment for a base C decrease
if (delta_cnt < 0) // If negative: result increased
{ // beyond baseline, i.e. cap decreased
delta_cnt = 0; // Zero out delta for position determination
}
if(swjudge == 1)
{
if (delta_cnt > KEY_lvl_W) // Determine if each key is pressed per a preset threshold
{
key_press = 1; // Specific key pressed
key_pressed = 1; // Any key pressed
P2OUT ^= LED2;
while(LEDTimer--)
{
LEDCount -= 5;
if(LEDCount<10)LEDCount=4000;
pulse_LED();
}
LEDTimer=10;
}
else
key_press = 0;
}
else if(swjudge == 2)
{
if (delta_cnt > KEY_lvl_S) // Determine if each key is pressed per a preset threshold
{
key_press = 1; // Specific key pressed
key_pressed = 1; // Any key pressed
P2OUT ^= LED2;
while(LEDTimer--)
{
LEDCount -= 5;
if(LEDCount<10)LEDCount=4000;
pulse_LED();
}
LEDTimer=10;
}
else
key_press = 0;
}
else
key_press = 0;
}
WDTCTL = WDT_delay_setting; // WDT, ACLK, interval timer
LPM3; // accomodate for genuine changes in sensor C
}
} // End Main
// Measure count result (capacitance) of each sensor
// Routine setup for four sensors, not dependent on Num_Sen value!
void measure_count(void)
{
char i;
TACTL = TASSEL_0+MC_2; // TACLK, cont mode
TACCTL1 = CM_3+CCIS_2+CAP; // Pos&Neg,GND,Cap
CACTL1 |= CAON; // Turn on comparator
for (i = 0; i
{
switch (i)
{
case 1: // Sensor 1
CAPD = CA_Ref+S_1; // Diable I/Os for CA1 ref, 1st sensor
CACTL2 = CA_1+CA_2; // CA1 ref, CAx sensor
break;
case 2: // Sensor 2
CAPD = CA_Ref+S_2; // Diable I/Os for CA1 ref, 2nd sensor
CACTL2 = CA_1+CA_3; // CA1 ref, CAx sensor
break;
case 3: // Sensor 3
CAPD = CA_Ref+S_3; // Diable I/Os for CA1 ref, 3rd sensor
CACTL2 = CA_1+CA_4; // CA1 ref, CAx sensor
break;
case 4: // Sensor 4
CAPD = CA_Ref+S_4; // Diable I/Os for CA1 ref, 4th sensor
CACTL2 = CA_1+CA_5; // CA1 ref, CAx sensor
break;
case 0: // Sensor 5
CAPD = CA_Ref+S_5; // Diable I/Os for CA1 ref, 4th sensor
CACTL2 = CA_1+CA_6; // CA1 ref, CAx sensor
break;
}
WDTCTL = WDT_meas_setting; // Set duration of sensor measurment
TACTL |= TACLR; // Clear Timer_A TAR
LPM0; // Wait for WDT interrupt
meas_cnt = TACCR1; // Save result
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
}
CACTL1 &= ~CAON; // Turn off comparator
CAPD = CA_Ref; // Re-init Mux: all sensors = GND
}
void pulse_LED(void)
{
TACTL = TACLR;
CCR0 = 5000;
CCTL0 = OUTMOD_4;//+CCIE;
CCR1 = LEDCount;
CCTL1 = OUTMOD_4+CCIE;
TACTL = TASSEL_2 + MC_3;
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}
// Watchdog Timer interrupt service routine
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
TACCTL1 ^= CCIS0; // Create SW capture of CCR1
LPM3_EXIT; // Exit LPM3 on reti
}