📄 key.c
字号:
#include <my_key.h>
#include "fpconfig.h"
#include "fpcontrol.h"
#define U8 unsigned char
#define lcd_ctrl_port *(unsigned char *)0xbfbf00b7
#define data_port *(unsigned int *)0xa8000000
#define lcd_cs1_high lcd_ctrl_port |= 0x10
#define lcd_cs1_low lcd_ctrl_port &= 0xef
#define lcd_cs2_high lcd_ctrl_port |= 0x08
#define lcd_cs2_low lcd_ctrl_port &= 0xf7
#define lcd_rs_high lcd_ctrl_port |= 0x04
#define lcd_rs_low lcd_ctrl_port &= 0xfb
#define lcd_rw_high lcd_ctrl_port |= 0x02
#define lcd_rw_low lcd_ctrl_port &= 0xfd
#define lcd_enab_high lcd_ctrl_port |= 0x01
#define lcd_enab_low lcd_ctrl_port &= 0xfe
#define lcd_rst_high *(unsigned int *)0xbfbf00a4 |= 0x00000001;
#define lcd_rst_low *(unsigned int *)0xbfbf00a4 &= 0xfffffffe;
#define lcd_reset_high *(unsigned int *)0xbfbf00a4 |= 0x00000020;
#define lcd_reset_low *(unsigned int *)0xbfbf00a4 &= 0xffffffdf;
extern int gID;
unsigned char PW_buffer[8];
extern unsigned char menu_flag;
void delay1(U16 ii);
void press_reset();
void input_reset();
int password_input(int PW_mode);
static int first_time_count =0;
char conform_function();
char conform_Super_function();
char cmp_buffer(unsigned char *p1,unsigned char *p2,int num);
char Input_other_buffer(unsigned char *p1,unsigned char *p2,int num);
//**********************************************************************************
void delay1(U16 ii)
{
U16 di;
for (di=0;di<ii*60;di++)
{
asm(" nop");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" nop");
}
}
U8 key_chufa()
{
U8 chufa_status;
if(FPindex.back_light_ctrl==1) return 0;
chufa_status=*(U8 *)0xbfbf00a7;
if((chufa_status & 1)==1)
{
*(unsigned int *)0xbfbf00a4 &= 0xfefffefe;//0xfffffefe;
return 1;
}
else return 0;
}
//**********************************************************************************
void key_init()
{
*(unsigned int *)0xbfbf00b0 = 0xffff0fff; //0xbfbf00a8
keydown = 0;
keyup = 0;
keyvalue=0;
oldvalue=0xff;
}
U8 key_scan()
{
//unsigned int temp;
U8 keyi;
feed_dog();
array_keyout[3]= 0x0e; //0x07;
array_keyout[2]= 0x0d; //0x0b;
array_keyout[1]= 0x0b; //0x0d;
array_keyout[0]= 0x07; //0x0e;
for (keyi=0;keyi<4;keyi++) // ki: 循环变量
{
*(U8 *)0xbfbf00b3 = array_keyout[keyi];
keystatus = *(U8 *)0xbfbf00b3; //0xbfbf00ab
keystatus=(keystatus & 0xf0)>>4; // keystatus: 键输入状态
if (keystatus!=0x0f)
{
keyup=1;
keydown=1;
if (keystatus==0x07) keyvalue=keyvalue1=keyi+12;
if (keystatus==0x0b) keyvalue=keyvalue1=keyi+8;
if (keystatus==0x0d) keyvalue=keyvalue1=keyi+4;
if (keystatus==0x0e) keyvalue=keyvalue1=keyi;
break; //keyvalue: 键值
}
}
if ((keydown==1) && (keyup==1))
{
if(keyvalue1==0) keyvalue=15; //7
else if(keyvalue1==1) keyvalue=11;
else if(keyvalue1==2) keyvalue=7; //3
else if(keyvalue1==3) keyvalue=3; //15
else if(keyvalue1==4) keyvalue=8;
else if(keyvalue1==5) keyvalue=9;
else if(keyvalue1==6) keyvalue=10;
else if(keyvalue1==7) keyvalue=14;
else if(keyvalue1==8) keyvalue=4;
else if(keyvalue1==9) keyvalue=5;
else if(keyvalue1==10) keyvalue=6;
else if(keyvalue1==11) keyvalue=12;
else if(keyvalue1==12) keyvalue=0;
else if(keyvalue1==13) keyvalue=1;
else if(keyvalue1==14) keyvalue=2;
else if(keyvalue1==15) keyvalue=13;
delay1(1000);
feed_dog();
delay1(1000);
feed_dog();
delay1(1000);
feed_dog();
delay1(1000);
feed_dog();
delay1(1000);
feed_dog();
delay1(1000);
feed_dog();
delay1(1000);
feed_dog();
return 1;
}
else
{
return 0;
}
/*
array_keyout[3]=0x07;//0x0e;
array_keyout[2]=0x0b;//0x0d;
array_keyout[1]=0x0d;//0x0b;
array_keyout[0]=0x0e;//0x07;
for (keyi=0;keyi<4;keyi++) // ki: 循环变量
{
*(U8 *)0xbfbf00b3 = array_keyout[keyi];
keystatus = *(U8 *)0xbfbf00b3; //0xbfbf00ab
keystatus=(keystatus & 0xf0)>>4; // keystatus: 键输入状态
if (keystatus!=0x0f)
{
keyup=1;
keydown=1;
if (keystatus==0x07) keyvalue=keyvalue1=keyi+12;
if (keystatus==0x0b) keyvalue=keyvalue1=keyi+8;
if (keystatus==0x0d) keyvalue=keyvalue1=keyi+4;
if (keystatus==0x0e) keyvalue=keyvalue1=keyi;
break; //keyvalue: 键值
}
}
if ((keydown==1) && (keyup==1))
{
delay1(250);
delay1(250);
delay1(250);
feed_dog();
delay1(250);
delay1(250);
delay1(250);
feed_dog();
return 1;
}
else
{
return 0;
} */
}
//******************************************************
// change date :2004-1-14
// purpose : get password input date
// input: 0:login input; 1: save input
//******************************************************
void get_num()
{
switch (keyvalue)
{
case 0:
keybuffer[buf_count]=1;//0xe010;//'1';
break;
case 1:
keybuffer[buf_count]=2; //0xe020;//'2';
break;
case 2:
keybuffer[buf_count]=3;//0xe030;//'3';
break;
case 4:
keybuffer[buf_count]=4;//0xe040;//'4';
break;
case 5:
keybuffer[buf_count]=5;//0xe050;//'5';
break;
case 6:
keybuffer[buf_count]=6;//0xe060;//'6';
break;
case 8:
keybuffer[buf_count]=7;//0xe070;//'7';
break;
case 9:
keybuffer[buf_count]=8;//0xe080;//'8';
break;
case 10:
keybuffer[buf_count]=9;//0xe090;//'9';
break;
case 13:
keybuffer[buf_count]=0;//0xe000;//'0';
break;
default:
break;
}
}
//*****************************************************************/
// 采集键盘输入字符=> 键盘缓冲区(10个字符)
// 入口: keyvalue(键值),keycount: keyvalue 对应的字符选择
// bufcount: 键盘缓冲区记数
// 出口: keybuffer[10]
// input : nPwdMode ,0:login input; 1: save input
//*****************************************************************/
int password_input(int PW_mode)
{
if(PW_mode==1) disp_input_S_password();
else if(PW_mode==2) disp_input_user_password();
else if(PW_mode==3) disp_verify_S_password(); //确认
else if(PW_mode==4) disp_verify_user_password();
else if(PW_mode==5) disp_check_S_password(); //核对
buf_count=0;
clear_keybuffer();
while(1)
{
if (key_scan_loop(0)==1) //
{
if (keyvalue==15) //enter
{
if(buf_count!=SUPER_PW_LEN)
{
disp_wuxiao_PW();
if(PW_mode==1) disp_input_S_password();
else if(PW_mode==2) disp_input_user_password();
else if(PW_mode==3) disp_verify_S_password();
else if(PW_mode==4) disp_verify_user_password();
else if(PW_mode==5) disp_check_S_password(); //核对
buf_count=0;
clear_keybuffer();
continue;
}
return 1;
}
if ((keyvalue==11)||(keyvalue== 3)) //esc menu
{
return -1;
}
if (((keyvalue<=10&&keyvalue!=3&&keyvalue!=7)||(keyvalue==13))) //number key
{
if(buf_count>=SUPER_PW_LEN) continue;
get_num();
Show_better(2,buf_count,40);
buf_count++;
continue;
}
if (keyvalue==7) //clr
{
if(buf_count<=0) continue;
buf_count--;
keybuffer[buf_count]=36;
Show_better(2,buf_count,keybuffer[buf_count]);
continue;
}
}
}
}
//***************************************************************************************
// 用户密码输入、相似度比较、确认函数
// User_PW_mode:1:单密码方式;2:指纹、密码方式
//***************************************************************************************
int Input_User_password_function(int User_PW_mode)
{
User_password_loop:
if(1 == password_input(2))
{
if(-1==conform_Super_function()) //与超级密码相似
{
disp_conform_much();
goto User_password_loop;
}
if(-1==conform_function()) //与用户密码相似
{
disp_conform_much();
goto User_password_loop;
}
else
Input_other_buffer(PW_buffer,keybuffer,SUPER_PW_LEN);
User_password_loop1:
if(1 == password_input(4)) //校验
{
if (cmp_buffer(keybuffer,PW_buffer,SUPER_PW_LEN)==0) //密码一致?
{
if(User_PW_mode==1)
{
gID= find_free_user_index();
Current_FP_buffer.userID=gID;
Current_FP_buffer.openmode = USE_PW;
}
if(User_PW_mode==2)
{
Current_FP_buffer.openmode = USE_ALL;
fp(FP_SETFPDATA, (long)&gFpdataBuff[0], (long)gID, 0); //分配空间
}
memcpy(Current_FP_buffer.password, keybuffer, MAX_USER_PW_LEN);
FPsave(gID);
disp_PW_set_finish(); //密码存储成功
disp_user_ID();
//esc_ctrl();
//keyvalue=0;
return 1;
}
else
{
disp_wuxiao_PW();
goto User_password_loop1;
}
}
// esc_ctrl(); //esc menu
// keyvalue=0;
return -1;
}
// esc_ctrl(); //esc menu
// keyvalue=0;
return -1;
}
//**********************************************************************************************
// last change date : 2003-11-27
// purpose : map aplha
//**********************************************************************************************
void get_char()
{
switch (keyvalue)
{
case 0:
keybuffer[buf_count]=1; //空格
break;
case 1:
if (keycount==0) keybuffer[buf_count]=10; //'a';
if (keycount==1) keybuffer[buf_count]=11; //'b';
if (keycount==2) keybuffer[buf_count]=12; //'c';
if (keycount==3) keybuffer[buf_count]=2; //'2';
break;
case 2:
if (keycount==0) keybuffer[buf_count]=13;//0xe0d0;//'d';
if (keycount==1) keybuffer[buf_count]=14;//0xe0e0;//'e';
if (keycount==2) keybuffer[buf_count]=15;//0xe0f0;//'f';
if (keycount==3) keybuffer[buf_count]=3; //'3';
break;
case 4:
if (keycount==0) keybuffer[buf_count]=16;//0xe100;//'g';
if (keycount==1) keybuffer[buf_count]=17;//0xe110;//'h';
if (keycount==2) keybuffer[buf_count]=18;//0xe120;//'i';
if (keycount==3) keybuffer[buf_count]=4; //'4';
break;
case 5:
if (keycount==0) keybuffer[buf_count]=19;//0xe130;//'j';
if (keycount==1) keybuffer[buf_count]=20;//0xe140;//'k';
if (keycount==2) keybuffer[buf_count]=21;//0xe150;//'l';
if (keycount==3) keybuffer[buf_count]=5; //'5';
break;
case 6:
if (keycount==0) keybuffer[buf_count]=22;//0xe160;//'m';
if (keycount==1) keybuffer[buf_count]=23;//0xe170;//'n';
if (keycount==2) keybuffer[buf_count]=24;//0xe180;//'o';
if (keycount==3) keybuffer[buf_count]=6; //'6';
break;
case 8:
if (keycount==0) keybuffer[buf_count]=25;//0xe190;//'p';
if (keycount==1) keybuffer[buf_count]=26;//0xe1a0;//'q';
if (keycount==2) keybuffer[buf_count]=27;//0xe1b0;//'r';
if (keycount==3) keybuffer[buf_count]=28;//0xe1c0;//'s';
if (keycount==4) keybuffer[buf_count]=7; //'7';
break;
case 9:
if (keycount==0) keybuffer[buf_count]=29;//0xe1d0;//'t';
if (keycount==1) keybuffer[buf_count]=30;//0xe1e0;//'u';
if (keycount==2) keybuffer[buf_count]=31;//0xe1f0;//'v';
if (keycount==3) keybuffer[buf_count]=8; //'8';
break;
case 10:
if (keycount==0) keybuffer[buf_count]=32;//0xe200;//'w';
if (keycount==1) keybuffer[buf_count]=33;//0xe210;//'x';
if (keycount==2) keybuffer[buf_count]=34;//0xe220;//'y';
if (keycount==3) keybuffer[buf_count]=35;//0xe230;//'z';
if (keycount==4) keybuffer[buf_count]=9; //'9';
break;
case 12:
keybuffer[buf_count]=75; //空格
break;
case 13:
keybuffer[buf_count]=0;
break;
case 14:
keybuffer[buf_count]=75; //空格
break;
default:
break;
}
if( ((menu_flag==1)&&(keyvalue!=0)&&(keyvalue!=13))&&
((((keyvalue==1)||(keyvalue==2)||(keyvalue==4)||(keyvalue==5)||(keyvalue==6)||(keyvalue==9))
&&(keycount!=3))||(((keyvalue==8)||(keyvalue==10))&&(keycount!=4))) )
keybuffer[buf_count]+=32;
}
//**************************************************************************************
// last change date :2003-11-27
// purpose : to reset the input abouut param
//**************************************************************************************
void input_reset()
{
buf_count =0;
keycount = 0;
first_time_count = 0;
bHaveInput = 0;
}
void press_reset()
{
SetRTcount(0); //时钟复位
keydown=FALSE;
keyup =FALSE;
//keyvalue=0;
my_delay(40); //12
}
//*********************************************************
// last change date :2003-12-1
// purpose :compare two buffer
//*********************************************************
char cmp_buffer(unsigned char *p1,unsigned char *p2,int num)
{
U16 ii;
for (ii=0;ii<num;ii++)
{
if (*p1 != *p2)
return -1;
else
{
p1++;
p2++;
}
}
return 0;
}
char Input_other_buffer(unsigned char *p1,unsigned char *p2,int num)
{
U16 ii;
for (ii=0;ii<num;ii++)
{
*p1 = *p2;
p1++;
p2++;
}
return 0;
}
char conform_function()
{
int i,j,k;
unsigned char *p1,*p2;
for(i=1;i<MAX_USER_NUM+1;i++) //1000
{
if((FPindex.FP_index[i].exsit == FP_EXSIT)&&(FPindex.FP_index[i].storemode!=USE_FP))
{
p1=keybuffer;
p2=FPindex.FP_index[i].password;
k=0;
for(j=0;j<MAX_USER_PW_LEN;j++)
{
if (*p1 == *p2)
{
k++;
if(k>=5) return -1;
}
p1++;
p2++;
}
}
}
return 0;
}
char conform_Super_function()
{
int j,k;
unsigned char *p1,*p2;
p1=keybuffer;
p2=FPindex.super_Password;
k=0;
for(j=0;j<MAX_USER_PW_LEN;j++)
{
if (*p1 == *p2)
{
k++;
if(k>=5) return -1;
}
p1++;
p2++;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -