📄 keypass.cpp
字号:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include "lcd_api.h"
#include "keypass.h"
#include "keymenu.h"
#include "keyscan.h"
#include "menu.h"
#define UNLOCKTIMETICK 10 //0.5S
#define PASSWDTIMETICK 180 //10S
#define NOKEYPRESSTIMETICK 1200 //60S
KPState KeyPassState=SHOW;
unsigned char InPutPass[9];
unsigned int PassNum=0;
KPState KeyPass()
{
KEYSTATE PADKEYST;
KEY InKey;
unsigned char InChar=0;
static unsigned long StlockTime=0;
switch( KeyPassState )
{
case SHOW:
case LOCK: //0
if(clock()>=(StlockTime+UNLOCKTIMETICK))
{
StlockTime=clock(); ////在键盘锁定状态每隔一段时间进行键盘扫描,以节约系统时间
PADKEYST=KeyPadScan();
//printf("PADKEYST=%d\n",PADKEYST);
if (PADKEYST!=READY) KeyPassState=UNLOCK;
}
break;
case UNLOCK: //1
if (KeyPadScan()==READY)
{
if (GetKey()==_Menu)
{
KeyPassState=PASSWORD;
LCD_Clearup();
PassNum=0;
SCanPassWord(PassNum );
}
else KeyPassState=LOCK;
StlockTime=clock();
}
break;
case PASSWORD: //2
KeyPadScan( );
InKey=GetKey();
if ((InKey==_NOP)&&(clock()>=(StlockTime+PASSWDTIMETICK)))
{
//////10s no key pressed
KeyPassState=LOCK;
StlockTime=clock();
LCD_Clearup();
break;
}
if (InKey==_Enter)
{
//compare passwords
StlockTime=clock();
if (ComparePass(PassNum))
{
KeyPassState=MENU;
LCD_Clearup();
MENUManager.ShowMenu( 0 );
}
else
{
PassNum=0;
SCanPassWord(0 );
}
break;
}
if((InKey>=_Key0)&&(InKey<=_Key9))
{
StlockTime=clock();
InChar=(unsigned char)(InKey -_Key0)+48;
InPutPass[PassNum]=InChar;
PassNum++;
SCanPassWord(PassNum );
if (PassNum>=8)
{
//////////////////////compare passwords
if (ComparePass(8))
{
KeyPassState=MENU;
LCD_Clearup();
MENUManager.ShowMenu( 0 );
}
else
{
PassNum=0;
SCanPassWord(0 );
}
}
}
break;
case MENU: //3
//keyroutine();
KeyPadScan( );
if(clock()<=StlockTime+NOKEYPRESSTIMETICK)
{
if (KeyPadScan()!=READY) StlockTime=clock();
}
else
{
KeyPassState=LOCK;
LCD_Clearup();
StlockTime=clock();
} //////60s no key pressed
break;
}
return KeyPassState;
}
void SCanPassWord(unsigned int Pass_num )
{
// goto graghic mode
int x, y;
char OutputPass[9];
// show chinese char at center position
char BufStr[20];
LCD_Clearup();
strcpy( BufStr, "*水文集控器*" );
x = (128-strlen(BufStr)*8)/2;
y = 8;
LCD_WriteString( x, y, BufStr, 1 );
if (Pass_num>8) Pass_num=8;
for(int i=0;i<Pass_num;i++)
OutputPass[i]='*';
OutputPass[i]='\0';
sprintf( BufStr, "密码:%s",OutputPass );
x = 0;
y = 24;
LCD_WriteString( x, y, BufStr, 1 );
}
int ComparePass(unsigned int Pass_num)
{
if (Pass_num>8) Pass_num=8;
InPutPass[Pass_num]='\0';
if(strcmp(PasswordBuff, InPutPass)==0) return 1;
else return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -