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

📄 key.c

📁 此代码是定时扫描按键、按键时蜂鸣器叫一声、及按键转换成asc码的程序代码
💻 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 + -