合泰单片机按键的三种使用方法--短按、长按、双击-----BH67F5250\60\70

项目需要:

做了一个电子秤的项目,只有两个按键;要实现 :重量归零;关机;计时开始、暂停;计时归零;切换单位 这五个的功能。
于是我对其中一个按键的使用方法是:
1.短按清零(使用get_tare()函数)
2.长按关机
3.双击切换单位

话不多说,直接上代码(注意代码是在主循环里面的,我没有写出主循环)

// on_off_key_pin  代表单片机的pa6引脚,这里贴出代码		
#define		on_off_key_pin			_pa6
	if(on_off_key_pin==0)//右键按下,on_off_key_pin为0,因为接地
		{
			on_off_key_flag=1;
			
			on_off_count++;
 
			if(on_off_count>30)//按下这个按键,每次进入循环on_off_count会+1;on_off_count>30次,则表示长按
			{
				on_off_count=30;
				on_off_long_edge=1;//长按标志位置1
				sleep_f=1;//表示要关机(我要求的长按关机)
				on_off_key_flag=0;
			}
		}
		else
		{
			on_off_count=0;
			if(on_off_key_flag==1)//如果之前按下过,on_off_key_flag会置1,再抬起到这里
			{	
					on_off_key_edge=1;//右键抬起,短按标志位置1
					//--------------下面是双击的代码---------
					key_press_loop++;

				//-----------下面是双击的程序-------------
				/*
				双击的思路就是:第一次按下后,开始利用中断计数,在规定的时间内 再按下一次  表明双击;
				如果在按下一次后,规定的时间内没有再次按下,表明单次短按
				*/
					if(first_flag==0)//第一次按下的标志位
					{
						first_flag=1;
						key_flash_loop=0;//规定时间的计数器
						key_press_loop++;//按下的次数
					}
					else 
					{					
						if(key_flash_loop<8)	//如果在规定时间内
						{
							if(key_press_loop>1)//按下2次
							{
								Double_click_edge=1;//双击的标志位
								first_flag=0;
								key_press_loop=0;
								key_flash_loop=0;
							}
							
						}
						else//这里可以去掉
						{
							
						}

					}
		
					on_off_key_flag=0;
				}			
	 }

再在下面贴出计时器的初始化以及中断函数,可以看我上一面博文

以BH67F52 5060/70 为例子(其实都是相通的)

TM初始化

 	void time_init()//计时器初始化
{  
	
 	_stmrp=4;
 
	_stmc0=0b00110000;	// Fh/64= 4Mhz/64=62.5Khz=16us 
	_stmc1=0b11000001;	// TimeCnt Mode
	_stmal=6250%256; 	//;6250/62.5Khz=0.10s=100ms
	_stmah=6250/256;
	_ston=1;
	_stmae=1;
	_mf0e=1;
}

TM中断

 void	__attribute((interrupt(0x10)))	isr_time0(void)	//这里是100ms进入一次该中断
{	

	_stmaf=0;
 //-----------------------------	 
	if(first_flag)
	{
		key_flash_loop++;
		if(key_flash_loop>8)
		{
			first_flag=0;
			single_click_flag=1;//规定的时间到了,表明单击的标志位置1
		}
	}
	
} 

最后再贴出部分使用 双击、单击 标志位的代码

 				if(on_off_key_edge  && single_click_flag)//单击
   					{
   						 
    						get_tare();//清零重量的函数
    						single_click_flag=0;
   					}
//*******************************************************
   				if(Double_click_edge)//双击
   					{
   						unit++;//切换单位
   						Double_click_edge=0;
   						if(unit>1)
   						{
   							unit=0;
   						}
   					}

以上!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值