📄 mtouch727.c
字号:
// ********************************************************************************
// Inititialize for Timer2 time base **********************************************
// ********************************************************************************
#if METHOD==2 // Timer2 set as time base
// Tmr2 setup
// module setup
T2CON = 0b00000100; // T2ON, prescale & postscale = 1:1
T2CON |=0b00000001; // adjust prescalar
T1CON = 0b01000101; // Timer1 enable, system clock, 1:1 prescale,
T1GCON = 0b11100001; // Timer1 gate init
T1GCON &=0b11111100; // clr T1GSS bits
T1GCON |=0b00000010; // set T1GSS for Timer2 match PR2
PR2 = 0xB4; // pr2 for use w/timer2 .. w/pres.1:4, 0xB4 sets 500us scan rate.
TMR2IF = 0;
TMR2IE = 1;
#endif
// **********************************************************************************
// Initialize for WDT time base *****************************************************
// **********************************************************************************
#if (METHOD==3 | METHOD==4)
OPTION = 0b11001000; // Assign Prescaler to WDT
T1CON = 0b01000101; // Timer1 enable, system clock, 1:1 prescale,
T1GCON = 0b11100011; // Set T1GSS for WDT gate
#endif
// **********************************************************************************
// Cap Sense Module *****************************************************************
// **********************************************************************************
CPSCON0 = 0b10001100; // control settings
CPSCON1 = 0x00; // init to channel select = 0 (4 LSb's)
index = CPSCON1; // Start program ready to scan first channel
// **********************************************************************************
// Gate Setup ***********************************************************************
// **********************************************************************************
TMR1GIF = 0; // clear gate intpt flag
TMR1GIE = 1; // enable gate intpt
PEIE = 1; // enable peripheral intpts
}
//********************************************************************
// ISR() *************************************************************
// Interrupt Service Routine
// Reads values of TMR1 corresponding to each button/sensor
// and makes decision if button/sensor has been touched.
//********************************************************************
//********************************************************************
void interrupt isr(void)
{
CLRWDT();
// Timer0 Interrupt
// ...
if (T0IE && T0IF)
{
T0IF = 0; // Clear T0IF every time
}
// Timer2 Interrupt
// ...
if (TMR2IE && TMR2IF)
{
TMR2IF = 0; // Clear T2IF every time
}
// Timer1 Gate Interrupt
if (TMR1GIF && TMR1GIE)
{
// Perform touch reading
TMR1GIF = 0; // clear intpt flag
TMR1ON = 0; // Timer1 off
bigval = TMR1L + (unsigned int)(TMR1H << 8);
bigval = bigval * 16;
reading[index] = bigval;
smallavg = average[index] / 16;
threshold128 = average[index] >> 7; // avg >> 7 = 1/128 = 0.78% as a threshold value below average
threshold64 = average[index] >> 6; // avg >> 6 = 1/64 = 1.56% as a threshold value below average
threshold32 = average[index] >> 5; // avg >> 5 = 1/32 = 3.12% as a threshold value below average
threshold16 = average[index] >> 4; // avg >> 4 = 1/16 = 6.25% as a threshold value below average
threshold8 = average[index] >> 3; // avg >> 3 = 1/8 = 12.5% as a threshold value below average
threshold4 = average[index] >> 2; // avg >> 2 = 1/4 = 25% as a threshold value below average
threshold2 = average[index] >> 1; // avg >> 1 = 1/2 = 50% as a threshold value below average
threshold = threshold4; // ratiometric threshold from avail above (& combinations)
if (bigval < average[index] - threshold)
{
switch (index)
{
case 0: Buttons.BTN0 = 1; break; // The current button is pressed
case 1: Buttons.BTN1 = 1; break; // Relay button pressed information to application
case 2: Buttons.BTN2 = 1; break;
case 3: Buttons.BTN3 = 1; break;
case 4: Buttons.BTN4 = 1; break;
case 5: Buttons.BTN5 = 1; break;
case 6: Buttons.BTN6 = 1; break;
case 7: Buttons.BTN7 = 1; break;
case 8: Buttons.BTN8 = 1; break;
case 9: Buttons.BTN9 = 1; break;
case 10: Buttons.BTN10 = 1; break;
case 11: Buttons.BTN11 = 1; break;
case 12: Buttons.BTN12 = 1; break;
case 13: Buttons.BTN13 = 1; break;
case 14: Buttons.BTN14 = 1; break;
case 15: Buttons.BTN15 = 1; break;
default: break;
}
}
else
{
// Button unpressed (no hysteresis provided)
switch (index)
{
case 0: Buttons.BTN0 = 0; break; // The current button is unpressed
case 1: Buttons.BTN1 = 0; break; // Relay button pressed information to application
case 2: Buttons.BTN2 = 0; break;
case 3: Buttons.BTN3 = 0; break;
case 4: Buttons.BTN4 = 0; break;
case 5: Buttons.BTN5 = 0; break;
case 6: Buttons.BTN6 = 0; break;
case 7: Buttons.BTN7 = 0; break;
case 8: Buttons.BTN8 = 0; break;
case 9: Buttons.BTN9 = 0; break;
case 10: Buttons.BTN11 = 0; break;
case 12: Buttons.BTN10 = 0; break;
case 11: Buttons.BTN12 = 0; break;
case 13: Buttons.BTN13 = 0; break;
case 14: Buttons.BTN14 = 0; break;
case 15: Buttons.BTN15 = 0; break;
default: break;
}
// Perform average after detection comparison
average[index] += bigval/16 - smallavg;
}
SetNextChannel(); // Set up for next channel
RestartTimer1(); // Restart timer1
}
}
//*********************************************************************
//Function: RestartTimers() *******************************************
// Purpose: Resets and restarts timers 0 & 1 used for capacitive sensing.
// Based on original method before Timer1 Gate peripheral features
//. added to 72x. *****************************************************
//*********************************************************************
void RestartTimers(void)
{
TMR1L = 0; // reset Timer1
TMR1H = 0; // " "
TMR1ON = 1; // restart Timer1
TMR0 = 0; // reset Timer0
T0IF = 0; // clear the interrupt
}
// ********************************************************************
// RestartTimer1() ****************************************************
// Resets and restarts timer 1 (used for capacitive sensing).
// Used for Timer0 and T1GCON in toggle mode for automatic shutoff
// of Timer1 (better for consistent and repeated measurements).
// Also has same use with toggle & single pulse mode Tmr1 gate.
// ********************************************************************
void RestartTimer1(void)
{
TMR1L = 0; // Reset Timer1
TMR1H = 0; // " "
TMR1ON = 1; // Restart Timer1
CLRWDT();
}
//**********************************************************************
// SetNextChannel() **************************************************
// Sets the next channel for the oscillator to measure, ***********
// configures all hardware appropriately, internal, and if ************
// applicable external. ***********************************************
// *********************************************************************
void SetNextChannel(void)
{
index = (++index) & 0x0F; // cycle index state 0-15 w/rollover
// if (index >> 0x0E)
// index = 0;
CPSCON1 = index; // Select external pin CPS0..CPS15
}
//************************************************************************
// Function: DisplayLEDs() ***********************************************
// Display ouput button on LEDS based ************************************
// binary button number **************************************************
// ***********************************************************************
void DisplayLEDs(char i)
{
// Display the
switch (i)
{
case 0xFF: // 0xFF is special value for off (same as 0).
case 0: LED0 = OFF; LED1 = OFF; LED2 = OFF; LED3 = OFF; break; // Binary counting
case 1: LED0 = ON; LED1 = OFF; LED2 = OFF; LED3 = OFF; break; // for LEDs
case 2: LED0 = OFF; LED1 = ON; LED2 = OFF; LED3 = OFF; break;
case 3: LED0 = ON; LED1 = ON; LED2 = OFF; LED3 = OFF; break;
case 4: LED0 = OFF; LED1 = OFF; LED2 = ON; LED3 = OFF; break;
case 5: LED0 = ON; LED1 = OFF; LED2 = ON; LED3 = OFF; break;
case 6: LED0 = OFF; LED1 = ON; LED2 = ON; LED3 = OFF; break;
case 7: LED0 = ON; LED1 = ON; LED2 = ON; LED3 = OFF; break;
case 8: LED0 = OFF; LED1 = OFF; LED2 = OFF; LED3 = ON; break;
case 9: LED0 = ON; LED1 = OFF; LED2 = OFF; LED3 = ON; break;
case 10: LED0 = OFF; LED1 = ON; LED2 = OFF; LED3 = ON; break;
case 11: LED0 = ON; LED1 = ON; LED2 = OFF; LED3 = ON; break;
case 12: LED0 = OFF; LED1 = OFF; LED2 = ON; LED3 = ON; break;
case 13: LED0 = ON; LED1 = OFF; LED2 = ON; LED3 = ON; break;
case 14: LED0 = OFF; LED1 = ON; LED2 = ON; LED3 = ON; break;
case 15: LED0 = ON; LED1 = ON; LED2 = ON; LED3 = ON; break;
default: break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -