📄 okey.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 + -