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

📄 get_key.c

📁 用凌阳单片机编写用超声波水位测量程序
💻 C
字号:
/*******************************************************
文件:key.c
描述:键盘
开发环境:unSP IDE184
修改信息:2005-07-25		nevsaynev		Initial Version
********************************************************/

#include "Get_Key.H"

/**************************************************
函数:void Get_Key()
描述:对4*5的并行键盘进行扫描,取得键码
硬接口:IOA0-IOA4为5列状态输入,IOA5-IOA8为4行电平输出
	*P_IOA_Dir = 0x01e0;
	*P_IOA_Attrib = 0x01e0;
软接口:主函数中请定义char型指针 *pchKeyValue,
	 调用本函数后可直接访问此指针得到键码
输入:指向键码的指针 *pchKeyValue
输出:取得的键码,置于指针 *pchKeyValue指向处 
返回值:按键状态(是否有键按下),有则返回1,无则返回0
***************************************************/

uchar Get_Key(char *pchKeyValue)
{
	int keyvalue,keyvalue_buf;
	uchar flag=0,count_out=0,count=0,ii=0,row;

	/*使所有行输出0,快速检测是否有键按下*/
	*IOA_Data &= 0xfe1f;
	if((*IOA_Data & 0x1f) == 0x1f)
		return(0);

	/*有键按下,则依次使各行输出零,取得键码*/
	*IOA_Data |= 0x01e0;//首先使各输出全为高
	while( ii < 4 )
	{
		CLRPORTA(ii + 5);
		keyvalue = *IOA_Data & 0x1f;
		if( keyvalue != 0x1f)
		{
			flag = 1;
			row = ii;
			keyvalue_buf=keyvalue;
			break;
		}
		SETPORTA(ii + 5);
		ii += 1;
		*Wd_Clr=1;
	}
	
	if( !flag)
		return(0);

	/*进行去抖*/
	flag=0;
	while(count_out<10)//设置超时计数器
	{	
		keyvalue = *IOA_Data & 0x1f;
		if( keyvalue_buf != keyvalue)
		{
			flag = 0;
			break;
		}
		count += 1;
		count_out += 1;
		keyvalue_buf = keyvalue;
		if( count == 3)
		{//去抖完成
			flag=1;
			break;
		}
		*Wd_Clr=1;
	}

	if(!flag)
		return(0);	

	/*计算键值,并赋值给输出指针*/
	*pchKeyValue = 0;
	while(row)		//取得各行首码
	{
		*pchKeyValue += 5;
		row--;
		*Wd_Clr=1;
	}		
	switch(keyvalue)//计算偏置
	{
		case 0x1e:
			*pchKeyValue += 1;			
			break;
		case 0x1d:
			*pchKeyValue += 2;
			break;
		case 0x1b:
			*pchKeyValue += 3;
			break;
		case 0x17:
			*pchKeyValue += 4;
			break;
	   	case 0x0f:
			*pchKeyValue += 5;
			break;	
	}
	*Wd_Clr=1;
	return(1);
}

⌨️ 快捷键说明

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