📄 touch sensor.c
字号:
#include "main.h"
#define NumSensor 2
unsigned char Count,i;
bank2 unsigned int Raw ;
bank2 unsigned int Average[2]; // Can't fit all in one bank. Only 96 bytes per Banks 2|3, (Max 24 bttns)
bank3 unsigned int Trip [2]; // "
//volatile BButtons Buttons;
volatile unsigned char First; // first variable to 'discard' first N samples
volatile unsigned char Index; // Index of what button is being checked.
extern volatile BButtons Buttons;
volatile signed int Value; // current button value
volatile signed int Bigval; // current button bigval
volatile signed int Smallavg; // current button smallavg
volatile unsigned int j; // Global incrementer variable.. use with caution to interrupts.
const unsigned char Comp1[NumSensor] = {0x94, 0x95}; // comparator preset values for each button
const unsigned char Comp2[NumSensor] = {0xA0, 0xA1};
void
CapInit(void) {
TRISA6=0;
TRISA7=0;
Led0=OFF;
Led1=OFF;
// Load defaults for buttons
for (Index=0; Index < NumSensor; Index++) { // Load Default GB/TRP
// Normal Buttons
Average[Index] = 1325;
}
Trip[0] = 135;
Trip[1] = 160;
First = 160; // first pass flag to reach steady state average before enabling detection
Index=0;
// All TRIS Registers set up in INIT() Routine
// Capacitively this requires to set up C2OUT as o/p, and T1CKI=i/p, C12INx- pins used = analog i/p., C2+ pin = analog i/p
VRCON=0X8D;
//ANS2=1;
RA2=0; //确定C1,C2的参考电压
TRISA5 = 0; // C2OUT = output
TRISC0=1;
TRISA0 = 1; // Comparator Cin- input for individual button.
TRISA2 = 1;
//TRISC0 = 1;
//RC0=1;
ANSEL=0X27;
ANSELH=0X00;
CM1CON0 = Comp1[0]; // preset the comparators for first channel (and set appropriate enable bits)
CM2CON0 = Comp2[0];
CM2CON1=0X32;
SRCON=0XF0;
T1CON=0X07;
OPTION = 0x84; // setup the timer0 prescalerTSCAN = 256 x (4 x TOSC) x PS=4.096ms//04C9//354.6k
RestartTimers(); // Turn on and start timers
INTCON = 0; // clear the interrupt register
T0IE = 1; // turn on the timer0 interrupt
GIE=1;
}
void interrupt isr(void)
{
// Timer 0 Interrupt
if (T0IF == 1 && T0IE == 1) { // Timer 0 Overflow Occurred,
TMR1ON = 0; // stop Timer1
CapISR(); // Service Routine {resets/restarts tmrs}
}
if (T0IF == 1) // Catch if timer interrupt during ssp? Handled at end of ISR.
RestartTimers(); // (Clears T0IF)
}
// Assume the sensor we designed for has an index 6 and there are 16 buttons.
void
CapISR(void)
{
unsigned int Value;
unsigned char AvgIndex;
//T0IE=0;
//LcdSet();
//DispByte(2,1,TMR1H);
//DispByte(2,31,TMR1L);
//do{}while(1);
Value = TMR1L + (unsigned int)(TMR1H << 8);
Raw =Value;
if (Raw <(Average[Index]-Trip[Index])) {
switch(Index) {
case 0: Buttons.Btn0 = 1; break;
case 1: Buttons.Btn1 = 1; break;
default : break;
}
}else if (Raw > (Average[Index]-Trip[Index]+64)){
// Button unpressed
// 1. Clear Button Flag for Sensor # index
// 2. Perform Slow Average
// 1
switch(Index) {
case 0: Buttons.Btn0 = 0; break;
case 1: Buttons.Btn1 = 0; break;
default : break;
}
// 2
if (AvgIndex < 2) AvgIndex++;
else AvgIndex = 0;
if (AvgIndex == 2)
Average[Index] = Average[Index] + ((long)Raw -(long)Average[Index])/16;
}
SetNextSensor();
RestartTimers();
}
void
SetNextSensor(void) {
if (Index < 2)
Index++;
else
Index = 0;
//Configure comparators for the new sensor
if (Index == 0) {
CM1CON0 = Comp1[0]; // Power button, Index 0 is on CIN0-
CM2CON0 = Comp2[0];
} else {
CM1CON0 = Comp1[1]; // All others (MUXes), are on CIN1-
CM2CON0 = Comp2[1];
}
}
void
RestartTimers(void) {
TMR1L = 0; // reset Timer1
TMR1H = 0; // " "
TMR1ON = 1; // restart Timer1
TMR0 = 0; // reset Timer0
T0IF = 0; // clear the interrupt
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -