⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mtouch727.c

📁 电容式触摸按键的有效方法
💻 C
📖 第 1 页 / 共 2 页
字号:
	// ********************************************************************************
	// 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 + -