按鍵事件處理

我們需要實現單擊、長按、雙擊。事件的定義正如我們PPT中所說的。這邊提供一種思路的實現。

其實還有很多方法。大家都可以去嘗試。另外由於一個任務要控制別的任務的工作方式,這個需要怎麼做呢?大家可以看看uc/os-ii多任務程序設計指導

void AppTaskKeyScan(void * pdata)
{
	/***************************
	 *keyCode 1 up 2 down 3 left 4 right 5 ok 6 cancel
	 **************************/
	
	uint8_t keyCode;
	clock_time_t time;
	
	pdata = pdata;
	while(1)
	{
		
		
	keyCode = 0;
	if(key_up())
	{
		_DBG_("UP");
		time = OSTimeGet();
		while(key_up())
		{
			if(OSTimeGet()-time>LONGPressTime) 
			{ 
				keyCode = keyUpLong;
			}
		}
		if(keyCode != keyUpLong)
				keyCode = keyUp;
		
		if(keyCode == keyUp)
		{
			my_printf("detect second");
			while(OSTimeGet()-time<DoubleClickTime)
			{
				if(key_up())
				{
					keyCode = keyUpDouble;
					break;
				}
			}
			if(keyCode==keyUpDouble)
			my_printf("up double click ");
		}
	}
	else if(key_down())
	{
		time=OSTimeGet();
		while(key_down())
		{
			if(OSTimeGet()-time>LONGPressTime) 
			{ 
				keyCode = keyDownLong;
			}
		}
		if(keyCode != keyDownLong)
				keyCode = keyDown;
		if(keyCode == keyDown)
		{
			my_printf("detect second");
			while(OSTimeGet()-time<DoubleClickTime)
			{
				if(key_down())
				{
					keyCode = keyDownDouble;
					break;
				}
			}
			if(keyCode==keyDownDouble)
			my_printf("down double click ");
		}
	}
	else if(key_left())
	{
		time = OSTimeGet();
		while(key_left())
		{
			if(OSTimeGet()-time>LONGPressTime) 
			{ 
				keyCode = keyLeftLong;
			}
		}
		if(keyCode != keyLeftLong)
				keyCode = keyLeft;
	}
	else if(key_right())
	{
		time = OSTimeGet();
		while(key_right())
		{
			if(OSTimeGet()-time>LONGPressTime) 
			{ 
				keyCode = keyRightLong;
			}
		}
		if(keyCode != keyRightLong)
				keyCode = keyRight;
	}
	else if(key_ok())
	{

		time = OSTimeGet();
		while(key_ok())
		{
			if(OSTimeGet()-time>LONGPressTime) 
			{ 
				keyCode = keyOkLong;
			}
			
		}
		if(keyCode != keyOkLong)
				keyCode = keyOk;
		if(keyCode == keyOk)
		{
			my_printf("detect second ok");
			while(OSTimeGet()-time<DoubleClickTime)
			{
				if(key_ok())
				{
					keyCode = keyOkDouble;
					break;
				}
			}
			if(keyCode==keyOkDouble)
			my_printf("key cancel click ");
		}
	}
	else if(key_cancel())
	{
		time = OSTimeGet();
		while(key_cancel())
		{
			if(OSTimeGet()-time>LONGPressTime) 
			{ 
				keyCode = keyCancelLong;
				break;
			}
		}
		if(keyCode != keyCancelLong)
			keyCode = keyCancel;
	}
	if(keyCode>0)
	{
		sprintf(_db,"code = %d",keyCode);
		DB;
		OSMboxPost(mBoxKeyCode,(void*)(0xff000000 |keyCode ));
	}
	
	//_DBG_("C");
	OSTimeDly(10);
	//_DBG_("B");
	//看門狗喂狗
	WDT_Feed();
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章