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

📄 keyboardscan.c

📁 //使用前请先定义keyscan为单片机的 //某个端口,如#define keyscan P1 //程序中扫描信号从keyscan高4位输出
💻 C
字号:
//----------------------------
//-----------------------------
//键盘扫描子程序
//-----------------------------
//使用说明:
//使用前请先定义keyscan为单片机的
//某个端口,如#define keyscan P1
//程序中扫描信号从keyscan高4位输出,
//键值返回信号从keyscan低4位读入,
//故使用时硬件电路需要与之相对,
//或者把软件中相应地方修改即可

//-----------------------------
//-----------------------------
//键值定义,使用时需注意设置键值
//-----------------------------
#define keyscan P4
/*uchar code key_tab[]=
{
	0x07,0x08,0x09,0x0a,
	0x04,0x05,0x06,0x0b,
	0x01,0x02,0x03,0x0c,
	0x00,0x0f,0x0e,0x0d
};
*/
uchar code key_tab[]=
{
	0x0a,0x0b,0x0c,0x0d,
	0x03,0x06,0x09,0x0e,
	0x02,0x05,0x08,0x00,
	0x01,0x04,0x07,0x0f
};

//----------------------------
//----------------------------
//延时函数,一次大约延时10ms
//----------------------------
void mdelay(uchar j)
{
	uchar i;
	while(j--)
	{
		for(i=0;i<125;i++);		
	}
}


//-------------------------------
//检测有无按键按下子程序
//如果无键按下,返回0,否则返回1
//-------------------------------
bit test_key(void)
{
	uchar m;
	keyscan=0x0f;           //将扫描输出线全部拉低,并将键盘输入线全部置为输入
	m=keyscan;              //读键值
	m=m|0xf0;               //屏蔽掉扫描信号
	if(m==0xff) return 0;   //如果无键按下,返回0,否则返回1
	else return 1;
}


//-----------------------------------
//-----------------------------------
//键值读取子程序
//采用3中取2的原则来读出键值
//若三个值均不相等的话,返回0xff
//----------------------------------
uchar get_key(void)
{
	uchar val[3]={0xff,0xff,0xff};
	uchar i,j,row,mu;

	if(!test_key()) return(0xff);  //没有键按下就返回0xff

	mdelay(3);			//delay
	for(j=0;j<3;j++)      //连续取三次键值。
	{	
		row=0x7f;
		for(i=0;i<4;i++)
		{
			keyscan=row;
			mu=keyscan;
			mu=mu|0xf0;
			mu=~mu;

			if(mu!=0)
				switch(mu)
				{
					case 0x01:val[j]=*(key_tab+i);break;   //
					case 0x02:val[j]=*(key_tab+i+4);break;
					case 0x04:val[j]=*(key_tab+i+8);break;
					case 0x08:val[j]=*(key_tab+i+12);break;
				}
			row>>=1;
			row|=0x80;
		}
		mdelay(0);      //delay
	}

	while(test_key());//等待按键释放
	mdelay(3);          //delay
	
	if((val[0]==0xff)&&(val[1]==0xff)&&(val[2]==0xff)) return(0xff); //若无键按下,返回0xff;
	else if(val[0]==val[1]) return(val[0]);                 //采用3中取2的原则来读出键值
	else if(val[0]==val[2]) return(val[0]);                 //这样读出的键值更能准确
	else if(val[1]==val[2]) return(val[1]); 
	else return(0xff);                                      //如果3个均不相等,返回0xff
}

⌨️ 快捷键说明

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