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

📄 main.c

📁 51MCU检测按键动作,实现软件去抖,很好用
💻 C
字号:
#include <common.h>
#include <scom.h>

uint  delay;
uchar T0Count=0;       //用作T0定时1s计数器,每次定时10ms,累计100次
uchar T0Count1=0;	   //用作T0定时60ms计数器,每次定时10ms,累计6次
uchar T0_1S_Out=NO;    //用作定时1s到标志
uchar KeyPressCount=0; //用作按键次数累计 
#ifndef OffINT0
uchar T0_60mS_Out=NO;
#endif

#ifdef TestRS485

#define ReBufLen 10
#define TrBufLen 10
uchar data ReBuf[ReBufLen]={0,0,0,0,0,0,0,0,0,0};
uchar data TrBuf[TrBufLen]={0xee,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0xff};

#endif



/******************** Key Test **************************/
#ifndef TestRS485

#ifndef OffINT0
void int_int0(void) interrupt 0 using 2
{
	EX0 = 0;

	if(KeyPressCount==0) 	//只有1s内第一次按键可以启动T0,开始定时1s
	{	
		TH0=0xD8 ; 
		TL0=0xF0 ; 
		TR0=1;				//启动T0开始定时
		KeyPressCount++;	//第1次有效按键,按键次数累计
	}
	
	if( (KeyPressCount>=1) && (T0_60mS_Out==YES) ) //第2,3,4...次有效按键
	{ 
		KeyPressCount++;	//2次按键以上
	  //KeyPressCount=2;
		T0Count1=0;
		T0_60mS_Out=NO;
	}

	EX0 = 1;
}

void int_t0( void ) interrupt 1 using 3  
{

	TH0 = 0xD8 ;  	//定时10ms
	TL0 = 0xF0 ; 
	T0Count++; 
	T0Count1++; 

	if( (T0Count1<99) && (T0Count1>6) ) // 60ms time out
	{
		T0_60mS_Out = YES;
	}

	if(T0Count > 99)//1S time out
	{
		TR0 = 0;
		T0Count = 0;
		T0Count1 = 0;
		T0_60mS_Out = NO;
		T0_1S_Out = YES;
	}
	
}
#endif

//////////////////////////////////////////////////////////////////////

#ifdef OffINT0
void int_int0(void) interrupt 0 using 2
{
	EX0=0;
	if(KeyPressCount==0) //只有1s内第一次按键可以启动T0,开始定时1s
	{	
		TH0=0xD8 ; 
		TL0=0xF0 ; 
		TR0=1;			//启动T0开始定时
	}
	KeyPressCount++;	//有效按键,按键次数累计
	T0Count1=0;
}

void int_t0( void ) interrupt 1 using 3  
{

	TH0 = 0xD8 ;  	//定时10ms
	TL0 = 0xF0 ; 
	T0Count++; 
	T0Count1++; 

	if( (T0Count1<99) && (T0Count1>15) ) // 150ms time out
	{
		EX0=1;
	}

	if(T0Count >= 99)//1S time out
	{
		TR0 = 0;
		EX0 = 0;
		T0Count = 0;
		T0Count1 = 0;
		T0_1S_Out = YES;
	}
	
}
#endif

void main( void )
{
	IT0 = 0;	//INT0 is triggered by LOW level
	EA = 1;		//IE=0x83, EA=1,ET0=1,EX0=1,the rest are all zero 
	ET0 = 1;
	EX0 = 1;
	IP = 0x01 ;   	//PX0=1,PT0=0                                     
	TMOD |= 0x01; 	//T0 is 16-bit timer(mod 1),and T1 is UART's BaudGenerator,T2 is not used
 	UARTInit_T1( ); //T1 as UART's BaudrateGenerator

	while( 1 )
	{
		if(T0_1S_Out == YES)	// 1S is time out
		{
			TI = 0;
			SBUF = 0xaa;
			while( TI==0 );	
			TI = 0;

			SBUF = KeyPressCount;
			while( TI==0 );
			TI = 0;

			T0_1S_Out = NO;
			KeyPressCount = 0;

			#ifdef OffINT0
			EX0=1;
			#endif
		}

	}	
}
#endif	


/**********************************************************************/
/**********************************************************************/
/**********************************************************************/
/*************** RS485 interface Test *********************************/
#ifdef TestRS485
#pragma rb(2)
void receive( uchar idata *p , uchar data count )
{
	uchar i;
	RI=0;
	i=0;
	while(i<count)
	{
		if( _testbit_(RI) )
		{	 
			*p++ = SBUF;
			i++;
		}
	}

}

#pragma rb(2)
void transmit( uchar idata *p , uchar data count )
{
	uchar i;
	TI = 0;
	for(i=0; i<count; i++)
	{
		SBUF = *p;
		while( TI==0 ) ;
		TI = 0;
		p++;
	}

}

void int_int0( void ) interrupt 0 using 2
{
	EX0 = 0;

	RT_CONT_485=1;
	for(delay=650;delay>0;delay--) ;
	transmit( TrBuf,TrBufLen ); 
	for(delay=650;delay>0;delay--) ;
	
	RT_CONT_485=0;
	for(delay=650;delay>0;delay--) ;
	receive(ReBuf,ReBufLen);
	for(delay=650;delay>0;delay--) ;

	if(ReBuf[0]==0xaa)
	{
		RT_CONT_485=1;
		for(delay=650;delay>0;delay--) ;
		transmit( ReBuf,ReBufLen ); 
		for(delay=650;delay>0;delay--) ;
		RT_CONT_485=0;
		ReBuf[0]=0;
	}

	EX0 = 1;
}

void main( void )
{
	IT0=0;	//INT0 and INT1 is triggered by LOW level
 	IE = 0x8B;	//EA=1,ET1=1,ET0=1,EX0=1,the rest are all zero                                      
	TMOD = 0x11;//T0 and T1 are both 16-bit timer(mod 1)
	IP = 0x09;  //PX0=1,PT1=1,PT0=0,INT0 is high,T1 is middle, T0 is low 
 	UARTInit_T2();
	while(1)
	{
		_nop_();
	}
}

#endif

⌨️ 快捷键说明

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