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

📄 keyscan.c

📁 使用3个分散的通用IO口扫描12个按键
💻 C
字号:
/*
KEY SCAN ROUTIN:Scan 12 keys only in 3 I/O pin.
*/
#dfeine 		KeySTBPin=p1^2;
#dfeine 		KeyClkPin=p3^7;
#dfeine 		KeyDataPin=p1^4;		
enum 
{
KEY_0=0,
KEY_1,
KEY_2,
KEY_3,
KEY_4,
KEY_5,
KEY_6,
KEY_7,
KEY_8,
KEY_9,
KEY_A,
KEY_MAX=IR_NONE
};
enum
{
KEY_SCAN;
KEY_JITTER;
KEY_RELEASE
};
static BYTE bIOKeyPress=IR_NONE;
static BYTE bIOKeyRoutineState=KEY_SCAN;
static void vKeyDelay(BYTE t)
{
	BYTE i;
		for(i=0;i<t;i++)
		 {
		 nop;
		 nop;
		 nop;
		 nop;
		 
		 }
}
static void vIOkey_init(void)
{
	bIOKeyRoutineState=KEY_SCAN;
	bIOKeyPress=IR_NONE;
	KeySTBPin=HIGH_LVL;
	KeyClkPin=HIGH_LVL;
	KeyDataPin=HIGH_LVL;	
	
}
BOOL bIOKey_Scans(void)
{
	unsigned char keyh,keyc,keyd;
	KeySTBPin=HIGH_LVL;
	 vKeyDelay(5);
	if(KeySTBPin==LOW_LVL)
	{
	if((KeyClkPin==HIGH_LVL)&&(KeyDataPin==HIGH_LVL))
		{
			bIOKeyPress=KEY_A;
			return TRUE;
		}
			
	}
		KeySTBPin=LOW_LVL;
		KeyClkPin=HIGH_LVL;
		KeyDataPin=HIGH_LVL;		
		 vKeyDelay(5);
		
		keyc=KeyClkPin;
		keyd=KeyDataPin;
		
		 if((keyc==LOW_LVL)&&(keyd==LOW_LVL))
		 	{
		 	bIOKeyPress=KEY_0;
			return TRUE;
			}
		 else if(keyc==LOW_LVL)
		 	{
		 	bIOKeyPress=KEY_1;
			return TRUE;
			}
		 else if(keyd==LOW_LVL)
			{
			bIOKeyPress=KEY_2;
			return TRUE;
			}
		KeyClkPin=LOW_LVL;
		KeySTBPin=HIGH_LVL;
		KeyDataPin=HIGH_LVL;	
		vKeyDelay(5);
		keyh=KeySTBPin;
		keyd=	KeyDataPin;
		 if((keyh==LOW_LVL)&&(keyd==LOW_LVL))
		 	{
		 	bIOKeyPress=KEY_3;
			return TRUE;
			}
		else if(keyh==LOW_LVL)
		 	{
		 	bIOKeyPress=KEY_4;
			return TRUE;
			}
		 else if(keyd==LOW_LVL)
			{
			bIOKeyPress=KEY_5;
			return TRUE;
			}
		
		 KeyDataPin=LOW_LVL;
		 KeySTBPin=HIGH_LVL;
		 KeyClkPin=HIGH_LVL;
		vKeyDelay(5);
		keyh=KeySTBPin;
		keyc=KeyClkPin;
		 if((keyc==LOW_LVL)&&(keyh==LOW_LVL))
		 	{
		 	bIOKeyPress=KEY_6;
			return TRUE;
			}
		else if(keyh==LOW_LVL)
		 	{
		 	bIOKeyPress=KEY_7;
			return TRUE;
			}
		 else if(keyc==LOW_LVL)
			{
			bIOKeyPress=KEY_8;
			return TRUE;
			}
		
		  vIOkey_init();
		  return FALSE;
}
BOOL bIOKey_Jitter(void)
{
unsigned char keyh,keyc,keyd;

	switch(bIOKeyPress)
		{
			case KEY_0:
			case KEY_1:
			case KEY_2:	
			
			keyc=KeyClkPin;
			keyd=KeyDataPin;
			if(bIOKeyPress==KEY_0)
			{
			 if((keyc==LOW_LVL)&&(keyd==LOW_LVL))
			 	{
			 	return TRUE;
				}
			}
			 else if(bIOKeyPress==KEY_1)
			 {
			 if(keyc==LOW_LVL)
			 	{
			 	return TRUE;
				}
			 }
			 else if(bIOKeyPress==KEY_2)
			 {
			 if(keyd==LOW_LVL)
			 	{
			 	return TRUE;
				}
			 }
			 
			break;
			
			case KEY_3:
			case KEY_4:
			case KEY_5:	
			
			keyh=KeySTBPin;
			keyd=	KeyDataPin;
			if(bIOKeyPress==KEY_3)
			{
			 if((keyh==LOW_LVL)&&(keyd==LOW_LVL))
			 	{
			 	return TRUE;
				}
			}
			else if (bIOKeyPress==KEY_4)
			{
				if(keyh==LOW_LVL)
			 	{
			 	return TRUE;
				}
			}
			else if (bIOKeyPress==KEY_5)
			{
				if(keyd==LOW_LVL)
			 	{
			 	return TRUE;
				}
			}
			
			break;
			case KEY_6:
			case KEY_7:
			case KEY_8:	
				
			keyh=KeySTBPin;
			keyc=KeyClkPin;
			if(bIOKeyPress==KEY_6)
			{
			 if((keyc==LOW_LVL)&&(keyh==LOW_LVL))
			 	{
			 	return TRUE;
				}
			}
			else if(bIOKeyPress==KEY_7)
			{
				if(keyh==LOW_LVL)
			 	{
			 	return TRUE;
				}
			}
			else if(bIOKeyPress==KEY_8)
			{
				if(keyc==LOW_LVL)
			 	{
			 	return TRUE;
				}
			}
			
			break;
			case KEY_A:
				if((KeySTBPin==LOW_LVL)&&(KeyClkPin==HIGH_LVL)&&(KeyDataPin==HIGH_LVL))
				{
				return TRUE;

				}
			break;
			default: 
				bIOKeyPress=IR_NONE;
				break;
		}
		bIOKeyPress=IR_NONE;
		return FALSE;
}
BYTE bKXD_Check_IOKey_Release(void)
{
BYTE bKey=IR_NONE;
unsigned char keyh,keyc,keyd;

	switch(bIOKeyPress)
		{
			case KEY_0:
			case KEY_1:
			case KEY_2:	
			keyc=KeyClkPin;
			keyd=KeyDataPin;	
			 if((keyc==HIGH_LVL)&&(keyd==HIGH_LVL)&&(bIOKeyPress==KEY_0))
			 	{
				bKey=bIOKeyPress;
				}
			else if(keyc==HIGH_LVL&&(bIOKeyPress==KEY_1))
			 	{
				bKey=bIOKeyPress;
				}
			else if(keyd==HIGH_LVL&&(bIOKeyPress==KEY_2))
			 	{
				bKey=bIOKeyPress;
				}
			break;
			case KEY_3:
			case KEY_4:
			case KEY_5:	
				keyh=KeySTBPin;
				keyd=	KeyDataPin;
			 if((keyh==HIGH_LVL)&&(keyd==HIGH_LVL)&&(bIOKeyPress==KEY_3))
			 	{
				bKey=bIOKeyPress;
				}
			else if(keyh==HIGH_LVL&&(bIOKeyPress==KEY_4))
			 	{
				bKey=bIOKeyPress;
				}
			else if(keyd==HIGH_LVL&&(bIOKeyPress==KEY_5))
			 	{
				bKey=bIOKeyPress;
				}
			break;
			case KEY_6:
			case KEY_7:
			case KEY_8:	
				 keyh=KeySTBPin;
				keyc=KeyClkPin;
			 if((keyc==HIGH_LVL)&&(keyh==HIGH_LVL)&&(bIOKeyPress==KEY_6))
			 	{
				bKey=bIOKeyPress;
				}
			else if(keyh==HIGH_LVL&&(bIOKeyPress==KEY_7))
			 	{
				bKey=bIOKeyPress;
				}
			else if(keyc==HIGH_LVL&&(bIOKeyPress==KEY_8))
			 	{
				bKey=bIOKeyPress;
				}
			break;
			case KEY_A:
				if((KeySTBPin==HIGH_LVL)&&(KeyClkPin==HIGH_LVL)&&(KeyDataPin==HIGH_LVL))
				{
				bKey=bIOKeyPress;
				}
				break;
			default: 
				KeyDataPin=HIGH_LVL;
				KeyClkPin=HIGH_LVL;
				KeySTBPin=HIGH_LVL;
				bIOKeyPress=IR_NONE;
				break;
		}
	if(bKey!=IR_NONE)	
		bIOKeyPress=IR_NONE;	
	return bKey;

}
BYTE  bKXD_IOKey_Routine(void)
{
		BYTE bKeyValue=IR_NONE;
		switch(bIOKeyRoutineState)
		{
			case KEY_SCAN:
				if(bIOKey_Scans()==TURE)
					bIOKeyRoutineState=KEY_JITTER;	
				break;	
			case KEY_JITTER:	
				if(bIOKey_Jitter()==TURE)
					bIOKeyRoutineState=KEY_RELEASE;
				else 
					bIOKeyRoutineState=KEY_SCAN;
				break;
			case KEY_RELEASE:
				bKeyValue=bKXD_Check_IOKey_Release();
				if(bKeyValue!=IR_NONE)	
					bIOKeyRoutineState=KEY_SCAN;
				break;
			default:
				bIOKeyRoutineState=KEY_SCAN;
				break;
		}
		return bKeyValue;
}

⌨️ 快捷键说明

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