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

📄 okey.c

📁 一种51单片机接收电话线上DTMF
💻 C
字号:
/*********************宏定义***************************/
#define OKey_Macro_MaxKeyNum            17  /*最大键码数*/   
#define OKey_Macro_ClearTrembleLength   10   /*消颤队列长度*/ 
#define OKey_Macro_NoKey                0xFF 
#define Macro_UnhandEvent               0x7F 
#define Macro_ScanErrorEvent		    0xFF 

/**********************数据****************************/
/********** 键盘扫描码定义 **********/
#define Macro_Scan0    	   77    /*扫描码0键*/
#define Macro_Scan1  	   30    /*扫描码1键*/
#define Macro_Scan2  	   29    /*扫描码2键*/
#define Macro_Scan3  	   27    /*扫描码3键*/
#define Macro_Scan4  	   46    /*扫描码4键*/
#define Macro_Scan5  	   45    /*扫描码5键*/
#define Macro_Scan6  	   43    /*扫描码6键*/
#define Macro_Scan7  	   62    /*扫描码7键*/
#define Macro_Scan8  	   61    /*扫描码8键*/
#define Macro_Scan9  	   59    /*扫描码9键*/

#define Macro_ScanA 	   23    /*扫描码A键*/
#define Macro_ScanB 	   39    /*扫描码B键*/
#define Macro_ScanC 	   55    /*扫描码C键*/
#define Macro_ScanD 	   71    /*扫描码D键*/

#define Macro_ScanStar     78    /*扫描码*键*/
#define Macro_ScanWell     75    /*扫描码#键*/

#define Macro_ScanUnhand   0x0F    /*扫描码键放开*/

struct OKey_RD_KeyTable_Struct
{
	uchar  ScanCode;
	uchar  KeyEventID;
};
code struct OKey_RD_KeyTable_Struct  OKey_RD_KeyTable [18] = /*键码表 OKey_Macro_MaxKeyNum + 1 */
{	
	{Macro_Scan0,       0},  {Macro_Scan1,         1},
	{Macro_Scan2,       2},  {Macro_Scan3,         3},
	{Macro_Scan4,       4},  {Macro_Scan5,         5},
	{Macro_Scan6,       6},  {Macro_Scan7,         7},
	{Macro_Scan8,       8},  {Macro_Scan9,         9},
	{Macro_ScanA,     0x0A},  {Macro_ScanB,       0x0B},
	{Macro_ScanC,     0x0C},  {Macro_ScanD,       0x0D},
	{Macro_ScanStar,  0x0E},  {Macro_ScanWell,    0x0F},
	{Macro_ScanUnhand,0x7F},  {OKey_Macro_NoKey,  0xFF}
};

uchar   OKey_RD_OldKey      ;
uchar   OKey_RD_CountKey    ;
uchar   OKey_RD_Counter     ;
/********************* Private Procedure ********************/
uchar OKey_MD_Read() 
{
	uchar  temp_data ;
	
	EA = 0 ;
	P1 = P1|0x0F ;
//	CS_IO1 = 0 ;
	temp_data = P1 ;     
//	CS_IO1 = 1 ;
	EA = 1 ;
 	return(temp_data) ;
}


uchar OKey_MD_TransKey (uchar  in_key)
{
	uchar   i      ;
	
    i = 0; 
    while ((in_key != OKey_RD_KeyTable[i].ScanCode) && (i < OKey_Macro_MaxKeyNum)) 
		i ++ ;
	return (OKey_RD_KeyTable[i].KeyEventID) ;     
}
/*********************** 公有函数 **********************/
/*************************************************/
/*    Name:       OKey_RP_Scan                   */
/*    Descrip:    键盘扫描                       */
/*    Input:      无                             */
/*    Output:     无                             */
/*************************************************/
uchar OKey_RP_Scan()   
{
	uchar  i, temp_code, temp_scan  ;
	
	P1 = 0x0F;
	temp_code = OKey_MD_Read() ;  /* 读列码 */
	temp_code &= 0x0F ;  
	if (temp_code == Macro_ScanUnhand)  /*没有键按下*/
    	{
		if (OKey_RD_OldKey == Macro_ScanUnhand)  /* 上次也没按下 */
		{
           	return (OKey_Macro_NoKey);  /*无键*/
		}
	}
    	else   /* 本次有键按下 */
    	{
		if (OKey_RD_OldKey != Macro_ScanUnhand)  /* 上次没按下 */
		{
           	return (OKey_Macro_NoKey);  /*无键*/
		}
   		P1 = 0xFF;
		temp_scan = 0x10; /* if GO THERE THEN 有键按下 */
        	for(i = 1;i < 5; i++) /* 扫描行 */
		{
			P1 &= (~temp_scan);
		   	temp_code = OKey_MD_Read() ;
           		temp_code &= 0x0F ; 
           		if (temp_code != Macro_ScanUnhand)  
			{
				temp_code |= (i <<4) ;
            			goto ClearTremBle;  /*退出扫描,已经发现 */
			}
         	temp_scan <<= 1 ; /* 扫描下一行 */
		}
	}

ClearTremBle:
	P1 = 0x0F;
    if (temp_code == OKey_RD_CountKey)  
    {
		OKey_RD_Counter ++ ;
      	if (OKey_RD_Counter >= OKey_Macro_ClearTrembleLength)  
		{
			OKey_RD_Counter = 0 ;
         	temp_scan = OKey_MD_TransKey(temp_code);
         	if (temp_scan != Macro_ScanErrorEvent)  
			{
				if (OKey_RD_CountKey == OKey_RD_OldKey)          
					return (OKey_Macro_NoKey);
				else  
				{
					OKey_RD_OldKey = OKey_RD_CountKey;
               		return (temp_scan) ;
				}
			}
         	else
				return (OKey_Macro_NoKey);
		}
      	else
			return (OKey_Macro_NoKey);
	}
    else 
    {
	 	OKey_RD_Counter = 0;
      	OKey_RD_CountKey = temp_code;
      	return (OKey_Macro_NoKey);
	}
}

/*************************************************/
/*    Name:       OKey_RP_Init                   */
/*    Descrip:    初始化                         */
/*    Input:      无                             */
/*    Output:     无                             */
/*************************************************/
void OKey_RP_Init()  
{

    OKey_RD_OldKey = OKey_Macro_NoKey;
    OKey_RD_CountKey = OKey_Macro_NoKey; 
    OKey_RD_Counter = 0;
}

⌨️ 快捷键说明

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