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

📄 keyscan.c

📁 基于单片机的数控开关电源设计
💻 C
字号:
//*************************************************************************************************
//*************************************************************************************************
//**<程序名>:键盘扫描子程序																 	 **
//**<功能>:当有外部中断0时调用此函数,使用列扫描的方式获取键码,键码由2位数字组成。高位为行号   **
//**		低位为列号。		 																 **
//*************************************************************************************************
//*************************************************************************************************


//*************************************************************************************************
//*																								  *
//*			 ******************************头文件及宏定义**************************				  *
//*																								  *
//*************************************************************************************************
#include <at89x51.h>

#define SCANPORT P1				  //4×4键盘扫描端口,低4位是行线,高4位是列线。
								  //采用逐列扫描的方法,无按键时,低4位输出1,高4位输出0。
								  //当有按键时,高4位输出扫描电位,低4位输入扫描结果。


//*************************************************************************************************
//*																								  *
//*			  ********************************全局变量******************************			  *
//*																								  *
//*************************************************************************************************
unsigned char uca_LineScan[4]={0xEF,0xDF,0xBF,0x7F};		//列线扫描电压,分为第1,2,3,4根列线
 															//为低电平,其他为高电平。
//*************************************************************************************************
//*																								  *
//*			  ********************************函数实现******************************			  *
//*																								  *
//*************************************************************************************************
unsigned char ucKeyScan()
{
	unsigned char ucTemp=0;			  	//扫描状态暂存。
	unsigned char ucRow=0,ucLine=0;	    //行号,列号。

	EX0=0;			 					//在键扫描处理时,关闭外部中断0,防抖动。

	for(ucLine=0;ucLine<4;ucLine++)		//列扫描
		{
			SCANPORT=uca_LineScan[ucLine];			   //输出扫描电位。
			ucTemp=SCANPORT&0x0F;					   //输入扫描电位,并屏蔽高4位。
			if(ucTemp!=0x0F)		 
				{									  //判断该列是否有按键按下。
				switch(ucTemp)
					{
					case 0x0E: ucRow=10;break;		  //如果有,则判断行号。
					case 0x0D: ucRow=20;break;
					case 0x0B: ucRow=30;break;
					case 0x07: ucRow=40;break;
					default:   ucRow=50;break;
					}
				break;
				}
		}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢复键扫描处理前初始状态>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	SCANPORT=0x0F;	  					//恢复P2口
	EX0=1;							//恢复按键中断。
	return ucRow+ucLine+1;			 //返回按键编码。格式为2位数,高位为行号,低位为列号。
}

⌨️ 快捷键说明

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