📄 key.c
字号:
/*************************************************
Description: 键盘键值处理流程
History:
*************************************************/
#ifndef MASTER_FILE
#include <include.h>
#endif
#include "bian.h"
uchar code KeyTab[3][4]={'0','1','6','7',
'2','3','E','C',
'4','5','8','9',
};
extern bit send_framekey(uchar msg_type);
extern void Delay_50us(uchar i);
/*************************************************
Function: // Beep()
Description: // 蜂鸣器发声函数
Called By: // 调用本函数的函数清单
Input: // uchar num
Output: // 无
Return: // 无
Author:
*************************************************/
void Beep(uchar num)
{
uchar i;
for(i=0;i<num;i++)
{
BUZ_CON=1;
Delay_50us(3);
BUZ_CON=0;
Delay_50us(3);
}
}
/*************************************************
Function: // GetKeyx()函数名称
Description: // 键盘扫描程序
Called By: // 调用本函数的函数清单
TimeCount0()
Input: // 无
Output: // 无
Return: // 无
Author:
*************************************************/
void ScanKey(void) using 2
{
uchar i,j,k,m,n,keybyte;
BYTE8000 &= 0xc7; //置sc0 sc1 sc2=0
XBYTE[PRN_MOT] = BYTE8000;
_nop_();
_nop_();
j = P3&0x3c;
if(j==0x3c){
PressNum=0;
if(WaitKeyLose==1){ //有键弹起
keytemp[0]=0;
HoldKey=0;
WaitKeyLose=0;
}
}
else{ //有键按下,去抖动
if( WaitKeyLose==0) {
_nop_();
_nop_();
_nop_();
keybyte = 0x08; //sc0 = 0
for(i=0;i<3;i++){
BYTE8000 |= 0x38;
BYTE8000 &= (~keybyte);
XBYTE[PRN_MOT] =BYTE8000;
keybyte <<= 1;
_nop_();
_nop_();
_nop_();
k=0x04;
n=0;
j=P3&0x3c;
for(m=0;m<4;m++){
if( (j&k) == 0 ){
keytemp[0]=KeyTab[i][m];
n=1;
break;
}
k=k<<1;
k=k&0x3c;
}
if(n==1) break;
}
if(i==4){ //无键按下
keytemp[0]=0xff;
return;
}
}
if(PressNum==0){
keytemp[1]=keytemp[0];
PressNum++;
}
else{
if(keytemp[1]!=keytemp[0]){
keytemp[0]=0;
keytemp[1]=0xff;
PressNum=0;
}
else{
if(PressNum>2){
if(WaitKeyLose==0)
{
if(KeyEnd==&Buf[9])
{
if(KeyHead!=0)
{
*KeyEnd=keytemp[1];
KeyEnd=&Buf[0];
}
}
else if( (KeyEnd+1)!=KeyHead){
*KeyEnd=keytemp[1];
KeyEnd++;
}
WaitKeyLose=1;
}
}
PressNum++;
if(PressNum>300){
keytemp[1]=0Xff;
HoldKey=1;
PressNum--;
}
}
}
}
}
/*************************************************
Function: // GetInputKey()
Description: // 从键盘缓冲区取键值程序
Called By: // 调用本函数的函数清单
FeedPaper(),CheckEnterKey(),CheckTask(),
Input: // 无
Output: // 无
Return: // 键值i或0.
Usage: // HaveKey,KeyEnd,KeyHead,Buf,ET0
Others: // 其它说明
*************************************************/
uchar GetInputKey()
{
uchar xdata i;
uchar xdata flag,flag1;
flag=0;flag1=0;
if(HaveKey!=0){
HaveKey=0;
flag1=1;
}
if( KeyEnd!=KeyHead){
i=*KeyHead;
if(KeyHead==&Buf[9]) KeyHead=&Buf[0];
else KeyHead++;
flag=1;
}
if(flag1==1) HaveKey=1;
if(flag==1){
// WATCHDOG;
OpenLED2;
Beep(90);
Delay(50);
CloseLED2;
//flash_led(1);
return i;
}
else return 0;
}
/*************************************************
Function: // DisableKey()
Description: // 清键盘缓冲,按键无效程序
Input: // 无
Output: // 无
Return: // 无
Usage: // HaveInputDot,KeyNum,WaitKeyLose,PressNum,KeyEnd,Buf,PaperKey,HoldKey,HaveKey
Others: // 其它说明
*************************************************/
void DisableKey()
{
HaveKey = 0;
KeyHead = &Buf[0];
KeyEnd = &Buf[0];
PressNum = 0;
WaitKeyLose = 0;
HoldKey = 0;
ms10_cnt = 0;
BYTE8000 |= 0x38;
BYTE8000 &= 0xF7; //置sc0 =0
XBYTE[PRN_MOT] = BYTE8000;
}
/*************************************************
Function: // EnableKey()
Description: //
Input: // 无
Output: // 无
Return: // 无
*************************************************/
void EnableKey()
{
KeyHead = &Buf[0];
KeyEnd = &Buf[0];
PressNum = 0;
WaitKeyLose = 0;
HoldKey = 0;
ms10_cnt = 0;
HaveKey = 1;
BYTE8000 |= 0x38;
XBYTE[PRN_MOT] = BYTE8000;
}
/***********************************************************************************
*** 函 数 名: void GetKeyCountPIN(void)
*** 功能描述: 获取输入密码并加密计算pin
*** 全局变量:
*** 参 数: 输入:
*** 输出:
*** 功能模块:
*** 返 回 值:
*** 模块信息:
** 修改信息:
*************************************************************************************/
void GetKeyCountPIN(void)
{
uchar i,ret,j;
i=GetInputKey();
switch(i)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
if((CountIndex==0) || (CountIndex==0x55))
{
j = 12;
}
else j = 6; //限制密码的长度不超过6位
if(passwordcnt<j)
{
password[passwordcnt]=i;
passwordcnt++;
while (!send_framekey(RETURNMIKEY));
}
break;
case 'E':
if((CountIndex==0) || (CountIndex==0x55))
{
j = 12;
}
else j = 6; //限制密码的长度不超过6位
if((passwordcnt == 0) || ((passwordcnt>=4) && (passwordcnt <= j)))
{
DisableKey(); //不能再按键
FlowMode = 0;
CloseLED1;
if(passwordcnt == 0)
{
MimaNum_flag = 0;
ret = TRUE;
}
else
{
MimaNum_flag = 1;
ret = CountPIN(password);
}
if(ret==TRUE)
{
while (!send_framekey(PINJIAMIOK)); //加密pin成功
}
else
{
while (!send_framekey(PINJIAMIER)); //发送算PIN错误
}
memset(password,0,sizeof(password));
passwordcnt = 0;
}
break;
case 'C':
if(passwordcnt !=0 )
{
passwordcnt--;
password[passwordcnt]=0;
while (!send_framekey(RETURNMIKEY));
}
else
{
if((CountIndex==0) || (CountIndex==0x55))
{
DisableKey(); //不能再按键
FlowMode = 0;
CloseLED1;
memset(password,0,sizeof(password));
passwordcnt = 0;
SaveKey = 0x43;
while (!send_framekey(DEXPENDRET));
}
}
break;
default:break;
}
}
/***********************************************************************************
*** 函 数 名: void ReturnKeyVal(void)
*** 功能描述: 回送按键值
*** 全局变量:
*** 参 数: 输入:
*** 输出:
*** 功能模块:
*** 返 回 值:
*** 模块信息:
** 修改信息:
*************************************************************************************/
void ReturnKeyVal(void)
{
uchar i;
i=GetInputKey();
switch(i)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case 'E':
case 'C':
SaveKey = i;
//flash_led(0);
while (!send_framekey(DEXPENDRET));
break;
default:break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -