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

📄 key.c

📁 键盘程序实例,包括键盘按键检测和键盘扫描码返回以及密码处理等.
💻 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 + -