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

📄 mtouch4.c~

📁 用pic16f883做的4个键的触摸按键(MTOUCH)实现电容式触摸按键的代码。有mtouch4.h和mtouch4.c构成
💻 C~
字号:
#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			54
#define PCT_OFF			49
#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 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 main(void)
{
	Abit_init();
	LED1=OFF;
	LED2=OFF;
	LED3=OFF;
	LED4=OFF;
	while(1)
	{
		LED1=(Buttons.B11==1) ? ON :OFF;
		LED2=(Buttons.B22==1) ? ON :OFF;
		LED3=(Buttons.B33==1) ? ON :OFF;
		LED4=(Buttons.B44==1) ? ON :OFF;
	}
}
void Abit_init(void)
{
	TRISC2OUT=0;
	TRISC12IN0=1;
	TRISC12IN1=1;
	TRISC12IN2=1;
	TRISC12IN3=1;
	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;
		TRIP[INDEX]=138;//20090119
	}
	first=60;
	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();

}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -