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

📄 main.c

📁 HT45R35在触控按键中的应用 - 使用C语言
💻 C
字号:
/*====================File Name:main.asm================
;;Program Name: 	TouchSwitch.Prj
;;File Name:		main.c
;;MCU Body:			HT45R35
;;Programer:		guoxj
;;Email:			guoxj@holteksz.com.cn
;;HT_IDE Version: 	V7.0
;;-----------------------------------------------
;;Mask Option:
;;-----------------------------------------------
;;SysVolt:			5V
;;SysFreq:			4M
;;Package:			28SSOP-A
;;Wake-up PA0-7:	None-Wake-up
;;Pull-high pA0-7:	None-Pull-high
;;PA0- Function Option:RC
;;PA4 Function Option:RC
;;PA5 Function Option:RC
;;PA6 Function Option:RC
;;PA7 Function Option:RC
;;Pull-high PB0-7:	None-Pull-high
;;WDT clock source:	WDTOSC
;;WDT:				Disable
;;CLR WDT:	 		1 instruction
;;LVR:				Disable
;;LVR voltage:		3.0V
;;OSC mode:			XTAL mode
;;INTO trigger edge:disable
;;INT1 trigger edge:disable
;;======================================================*/


#include <ht45r35.h>

#define sensitive			40
#define sensitive_high		200 	

#pragma rambank0
bit key_flag;
bit scan_flag;
bit update_flag;
#pragma norambank

unsigned char rf_cx;
unsigned char cnt1;
unsigned char cnt2;
unsigned char cnt3;
unsigned char cnt4;
unsigned char sure_key;
unsigned char current_key;
unsigned char last_key;
unsigned char sure_cnt;
unsigned char total_key;

signed long   data_temp;
unsigned long base_temp;
unsigned long interrupt;

unsigned char press_on[12];
unsigned long base[12];
unsigned long base_current[12];


const unsigned char table[14]={0x0e,0x16,0x26,0x46,0x0d,0x15,0x43,0x23,0x13,0x0b,0x45,0x25,0x78,0x07}; //...,all on,all off		

#pragma vector isr_c @ 0x0c		//timer interrupt

/*-----------------------------------------------------
delay
-----------------------------------------------------*/
void delay_ms(unsigned long tmp)
{
	unsigned long i;
	for(i=0;i<tmp;i++)
		_delay(1000);			//1ms
}

/*-----------------------------------------------------
wait for overflow
-----------------------------------------------------*/
void wait_overflow(void)
{
	unsigned long count;
	count=65535-1000;
	_rcoccr=0;
	_rcocr=3;
	_rcocf=0;
	_tmrbl=count;
	_tmrbh=count>>8;
	_tmral=0;
	_tmrah=0;
	_rcoccr=0x10;
	
	while(_rcocf==0)
		_nop();
	_rcocf=0;
}

/*-----------------------------------------------------
first timer setup
-----------------------------------------------------*/
void first_time_setup(void)
{	
	for(rf_cx=0;rf_cx<12;rf_cx++)
	{
		switch(rf_cx)
		{
			case 0:
				_ascr0=0xfe;
				_ascr1=0xff;
				break;
			case 1:
				_ascr0=0xfd;
				_ascr1=0xff;
				break;
			case 2:
				_ascr0=0xfb;
				_ascr1=0xff;
				break;
			case 3:
				_ascr0=0xf7;
				_ascr1=0xff;
				break;
			case 4:
				_ascr0=0xef;
				_ascr1=0xff;
				break;
			case 5:
				_ascr0=0xdf;
				_ascr1=0xff;
				break;
			case 6:
				_ascr0=0xbf;
				_ascr1=0xff;
				break;
			case 7:
				_ascr0=0x7f;
				_ascr1=0xff;
				break;
			case 8:
				_ascr0=0xff;
				_ascr1=0xfe;
				break;
			case 9:
				_ascr0=0xff;
				_ascr1=0xfd;
				break;
			case 10:
				_ascr0=0xff;
				_ascr1=0xfb;
				break;
			case 11:
				_ascr0=0xff;
				_ascr1=0xf7;
				break;
		}
		wait_overflow();
		base[rf_cx]=_tmrah;
		base[rf_cx]<<=8;
		base[rf_cx]+=_tmral;
	}
}

/*-----------------------------------------------------
initial
-----------------------------------------------------*/
void initial(void)
{
	unsigned char i;
	delay_ms(300);
	
	key_flag=0;
	scan_flag=0;
	update_flag=0;
	interrupt=0;
	rf_cx=0;
	sure_key=0;
	total_key=0;
	current_key=0;
	last_key=0;
	
	for(i=0;i<12;i++)
	{
		_mp0=press_on[i];
		_iar0=0;	
	}	
	
	_pbc=0;
	_pb=0;
	
	first_time_setup();
	_pb=0x78;			//all on
	delay_ms(1000);
	_pb=0x07;			//all off
	
	_emi=1;
	_eti=1;
	_tmr=131;			//1ms
	_tmrc=0x85;
	_ton=1;
	
	rf_cx=0;
}

/*-----------------------------------------------------
update base
-----------------------------------------------------*/
void update_base(void)
{	
	for(rf_cx=0;rf_cx<12;rf_cx++)
	{
		switch(rf_cx)
		{
			case 0:
				_ascr0=0xfe;
				_ascr1=0xff;
				break;
			case 1:
				_ascr0=0xfd;
				_ascr1=0xff;
				break;
			case 2:
				_ascr0=0xfb;
				_ascr1=0xff;
				break;
			case 3:
				_ascr0=0xf7;
				_ascr1=0xff;
				break;
			case 4:
				_ascr0=0xef;
				_ascr1=0xff;
				break;
			case 5:
				_ascr0=0xdf;
				_ascr1=0xff;
				break;
			case 6:
				_ascr0=0xbf;
				_ascr1=0xff;
				break;
			case 7:
				_ascr0=0x7f;
				_ascr1=0xff;
				break;
			case 8:
				_ascr0=0xff;
				_ascr1=0xfe;
				break;
			case 9:
				_ascr0=0xff;
				_ascr1=0xfd;
				break;
			case 10:
				_ascr0=0xff;
				_ascr1=0xfb;
				break;
			case 11:
				_ascr0=0xff;
				_ascr1=0xf7;
				break;
		}
		wait_overflow();
		base_current[rf_cx]=_tmrah;
		base_current[rf_cx]<<=8;
		base_current[rf_cx]+=_tmral;
	}
	
	for(rf_cx=0;rf_cx<12;rf_cx++)
	{
		data_temp=base_current[rf_cx]-base[rf_cx];
		if(data_temp<sensitive)	
			base[rf_cx]=base_current[rf_cx];	
	}
	
	update_flag=0;
	rf_cx=0;
}

/*-----------------------------------------------------
scan all key
-----------------------------------------------------*/
void scan_key(void)
{	
	switch(rf_cx)
		{
			case 0:
				_ascr0=0xfe;
				_ascr1=0xff;
				break;
			case 1:
				_ascr0=0xfd;
				_ascr1=0xff;
				break;
			case 2:
				_ascr0=0xfb;
				_ascr1=0xff;
				break;
			case 3:
				_ascr0=0xf7;
				_ascr1=0xff;
				break;
			case 4:
				_ascr0=0xef;
				_ascr1=0xff;
				break;
			case 5:
				_ascr0=0xdf;
				_ascr1=0xff;
				break;
			case 6:
				_ascr0=0xbf;
				_ascr1=0xff;
				break;
			case 7:
				_ascr0=0x7f;
				_ascr1=0xff;
				break;
			case 8:
				_ascr0=0xff;
				_ascr1=0xfe;
				break;
			case 9:
				_ascr0=0xff;
				_ascr1=0xfd;
				break;
			case 10:
				_ascr0=0xff;
				_ascr1=0xfb;
				break;
			case 11:
				_ascr0=0xff;
				_ascr1=0xf7;
				break;
			default:
				break;
		}
	base_temp=base[rf_cx];
	wait_overflow();
	data_temp=_tmrah;
	data_temp<<=8;
	data_temp+=_tmral;
		
	key_flag=0;
	data_temp=data_temp-base_temp;
	if(data_temp>sensitive && data_temp<sensitive_high)
		key_flag=1;
	if(key_flag==1)
	{
		current_key=rf_cx;
		total_key++;
	}	
	else
		press_on[rf_cx]=0;
		
	rf_cx++;
	if(rf_cx==12)
	{
		rf_cx=0;	
		scan_flag=1;
	}
}

/*-----------------------------------------------------
key check
-----------------------------------------------------*/
void key_check(void)
{	
	if(total_key==1)
	{
		if(current_key==last_key)
		{
			sure_cnt++;
			if(sure_cnt>=3)
			{
				sure_key=current_key;
				_pb=table[sure_key];
			}
		}	
	}
	else
		_pb=0x07;		//all off
	last_key=current_key;
	total_key=0;
	rf_cx=0;
	scan_flag=0;
}

/*-----------------------------------------------------
1ms interrupt
-----------------------------------------------------*/
void isr_c(void)
{
	interrupt++;
	if(interrupt==2000)
	{
		update_flag=1;
		interrupt=0;
	}
}

/*-----------------------------------------------------
main
-----------------------------------------------------*/
void main(void)
{
	initial();
	while(1)
	{
		if(scan_flag==0)
			scan_key();
		else
			key_check();
	
		if(update_flag==1)
			update_base();
	}
}

⌨️ 快捷键说明

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