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

📄 key1.c

📁 mp3播放器软件
💻 C
字号:

sbit	P32 = P3^2;
#define PRESSTIME	700
#define TREMBLETIME 40
#define PLAYKEY P32 
sbit KeyAdd_P14 = P1^4;
sbit KeyAdd_P15 = P1^5;
sbit KeyAdd_P16 = P1^6;
sbit KeyAdd_P17 = P1^7;
bit PlayKeyState=0;
xdata unsigned char KeyState = 0;
xdata unsigned char TempKey=0;
bit Key;
void ScanKey(void)
{
	unsigned char Temp;
	if(!Key)return;
	P1 = 0xf0;
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	Temp = P1;
	P1 = 0xff;
	if((Temp&0xf0)!= 0xf0)
		IntEntry = 1;
}
//-----------------------------------------------------------
//scan keybroad code
//intput:BIOS function
//P10-113:input port
//p14-p17:output port
//output:keybroad code
//___________________________________________________________
//73pin ,key0,p11
//72pin,key1,p12
//71pin,key2,p13
//70pin,key3,p14
//69pin,key4,p15
unsigned char ScanKeyCode()
{	data unsigned char i,k=0,Temp=0;
	for(i = 0; i < 4;i++)
	{	switch(i)
		{	case 0:
				P1 = 0xFE;
				break;
			case 1:
				P1 = 0xFD;
				break;
			case 2:
				P1 = 0xFB;
				break;
			case 3:
				P1 = 0xF7;
				break;
		}
		_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		k++;
		if(!KeyAdd_P14)//key3 low:(key0-key3,s3,5),(key1-key3,s7,9),(key2-key3,s1,d)
		{
			if(Temp)  return 0xFF;//pressed the keys more than one at the same time,turn failture
			Temp = k;
		}

		k++;
		if(!KeyAdd_P15)//key4 low:(key0-key4,s6,6),(key1-key4,s5,a),(key2-key4,s4,e)
		{
			if(Temp)  return 0xFF;//pressed the keys more than one at the same time,turn failture
			Temp = k;
		}

		k++;
//		if(!KeyAdd_P16)
//		{	if(Temp)  return 0xFF;//pressed the keys more than one at the same time,turn failture
//			Temp = k;
//		}

		k++;
//		if(!KeyAdd_P17)
//		{	if(Temp)  return 0xFF;//pressed the key more than one at the same time,turn failture
//			Temp = k;
//		}
	}
	return Temp;
	P1 &= 0xF0;
}

//----------------------------------------------------------
//Get key value
//input:key code
//output:The key value
//Description:
//----------------------------------------------------------
void	GetKeyValue(void)
{	data unsigned char Temp;
	if(IntEntry)
		IntExecute();
	if(!KeyState)	//don't check play key
	{	if(!PlayKeyState)	
		{	if(PLAYKEY)
			{	PlayKeyState = 1;
				KeyState = 1;
				Key = 0;
				KeyTimer = 0;
				TempKey = 0x11;
			}
		}
	}
	
	if(!KeyState) return;

	if(PlayKeyState)	
	{	if(PLAYKEY)
			Temp = 0x11;
		else
			Temp = 0;
	}
	else
		Temp = ScanKeyCode();

	switch (KeyState)
	{	case 1:
			if (KeyTimer > TREMBLETIME)
			{	if(TempKey == Temp)
				{	KeyTimer = 0;
					KeyState++;
				}
				else
				{	KeyState = 0;
					P1 &= 0xF0;
					Key = 1;	//Enalbe key interrupter
					PlayKeyState = 0;
				}
			}
			break;
		case 2:
			if(KeyTimer > PRESSTIME)
			{	if(TempKey == Temp)
				{	NewKey = TempKey;
					NewKey |= 0x20;//mark continue key
				}

				KeyTimer = 0;
				KeyState = 4;
			}
			else
			{	if(!Temp){
					KeyTimer = 0;
					KeyState++;
				}
				else if(Temp != TempKey)//find invalid key
					KeyTimer = 0;
			}
			break;
		case 3://single key release terrible program
			if(KeyTimer > TREMBLETIME)
			{	if(Temp)//single key release
				{	KeyState = 2;//key jitter
				}
				else
				{	NewKey = TempKey;//output a new single key
					KeyState = 0;
					P1 &= 0xF0;
					Key = 1;//Enalbe key interrupter
					PlayKeyState = 0;
				}
			}
			break;
		case 4://countinue key state
			if(KeyTimer > PRESSTIME)
			{	if(Temp == TempKey)
				{	NewKey = TempKey;
					NewKey |= 0x20;
				}
				KeyTimer = 0;
			}
			else
			{	if(!Temp)
				{	KeyTimer = 0;
					KeyState++;
				}
			}
			break;
		case 5://continue key release
			if(KeyTimer > TREMBLETIME)
			{	if(Temp)
				{	KeyState = 4;
				}
				else
				{	
					NewKey = TempKey;
					NewKey |= 0x40;
					KeyState = 0;
					P1 &= 0xF0;
					Key = 1;//Enalbe key interrupter
					PlayKeyState = 0;
				}
			}
			break;
		default:
			break;
	}
}
//-----------------------------------------------------------------
//interrupt 2 execute function
//input:none
//output:none
//-----------------------------------------------------------------
void IntExecute()
{	TempKey = ScanKeyCode();
	if(!TempKey) return;
	Key = 0;		//INT1 disable
	KeyState = 1;
	KeyTimer = 0;
	IntEntry = 0;
}

⌨️ 快捷键说明

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