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

📄 key.c

📁 本人用C51做的一个按键的检测,并能够显示响应的数字.
💻 C
字号:
#include<reg52.h>

typedef unsigned char	uchar;
typedef	unsigned int	uint;

uchar 	Data[] = {2,3,4,5};		//欲显示的数据
uchar 	KeyScan;				//最新扫描出来的组合码
uchar	KeyScanCode;			//暂存待定的码值
uchar 	KeyFlag = 0;			//按键状态指示
uchar 	KeyVal;					//最终得到的键值

uchar code DisCode[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//-----------------------------------------------
void Delay1()
{
	uchar i = 0x3f;
	while(i--);
}

//+++++++++++++++++++++++++++++++++++++++=

void Display(uchar *P)
{
	
	P0 = DisCode[*P];
	P2 = 0xfe;
	Delay1();
	P0 = DisCode[*(P+1)];
	P2 = 0xfd;
	Delay1();
	P0 = DisCode[*(P+2)];
	P2 = 0xfb;
	Delay1();
	P0 = DisCode[*(P+3)];
	P2 = 0xf7;
	Delay1();
}

/***********************************************************************************
			移位程序
************************************************************************************/
void PositionChange()
{
	Data[0] = Data[1];
	Data[1] = Data[2];
	Data[2] = Data[3];
	Data[3] = KeyVal;
}
/***********************************************************************************
			按键翻译
************************************************************************************/
uchar KeyCode(uchar Key)
{
	switch(Key)
	{
		case 0xee:		//根据按键编码返回对应的键值
			return 0;
		break;

		case 0xde:
			return 1;
		break;

		case 0xbe:
			return 2;
		break;

		case 0x7e:
			return 3;
		break;

		case 0xed:
			return 4;
		break;

		case 0xdd:
			return 5;
		break;

		case 0xbd:
			return 6;
		break;

		case 0x7d:
			return 7;
		break;

		case 0xeb:
			return 8;
		break;

		case 0xdb:
			return 9;
		break;

		case 0xbb:
			return 0x0a;
		break;

		case 0x7b:
			return 0x0b;
		break;

		case 0xe7:
			return 0x0c;
		break;

		case 0xd7:
			return 0x0d;
		break;

		case 0xb7:
			return 0x0e;
		break;

		case 0x77:
			return 0x0f;
		break;

		default: break;
	}
}			
/***********************************************************************************
			按键检测
************************************************************************************/
void KEY_Check()
{
	Delay1();
	P1 = 0x0f;
	KeyScan=P1;
	P1 = 0xf0;
	KeyScan |= P1;
	switch( KeyFlag )
	{
		case 0:	
			if( KeyScan != 0xff )				//可能有按键
				{ 								//防止多键同时按下
					KeyFlag=1; 
					KeyScanCode=KeyScan; 
				}
			break;

		case 1:
			if( KeyScanCode == KeyScan )		//去抖后确为键按下
			{
				KeyFlag = 2;
				KeyVal = KeyCode(KeyScanCode);	//返回键值
				PositionChange();
			}
			else								//否则认为是干扰,重新检测
				KeyFlag = 0;
			break;

		case 2:
			if( KeyScanCode != KeyScan )		//检测松开按键
			{
				if( KeyScan == 0xff ) 
					KeyFlag=3;
			}
			break;
												//按键超过1秒认为是连续按键
												//其后每0.2秒一次键,直到松开为止
												//要处理组合按键(即0.1秒后确认读键,保证所有组合键到位
												//还可能保持不松开全部按键的情况下,转换按其它键组合
												//	
		case 3:
			if( KeyScan == 0xff ) 
				KeyFlag=0;						//去抖后确为松开按键
			else 
				KeyFlag=2;						//是干扰
			break;
	}
}
//++++++++++++++++++++++++++++++++++++++++++++

main()
{
	while(1)
	{
		Display(Data);
		KEY_Check();
	}
}



⌨️ 快捷键说明

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