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

📄 keyboard.c

📁 Keil c工程
💻 C
字号:
//***********************//
//  8*3 matrix keyboard	 //
//	2004/03/08		     //
//  version 1.0			 //
//finished on 2004/03/16 //
//***********************//

#include "..\H\key.h "
extern void Delay100uS(word);


byte KEYVALUE=NULLKEY;	//扫描获得非NULLKEY值的存放字节,程序取值后应写入NULLKEY,初始值为NULLKEY

byte ScanOnce(void)				//不带去抖程序的键盘扫描,返回值为扫描的键值,无键按下时,返回NULLKEY值
{
//code byte TABLE[14]={NUM_9,NUM_6,NUM_3,CANCEL,START,uS_mS_S,MODE,NUM_7,NUM_4,NUM_1,NUM_0,NUM_2,NUM_5,NUM_8};
code byte TABLE[3][8];//={{},{},{}};

byte input_buffer=NULLKEY;
byte i;
bit j=0;
byte scan_const=0xfe;		//1111 1110B

for(i=0;(i<8)&&(j==0);i++)
  {
  XBYTE[kb_adds]=scan_const;
  switch(P1&0x1c)			//P1.2,P1.3,P1.4 are the keyboard wires
   {
    case 0x1c:break;     		//no key pressed
	case 0x0c:					//P1.4 pressed
		{
        input_buffer=TABLE[0][i];
	    j=1;
		break;
		}
    case 0x18:					//P1.3 pressed
		{
        input_buffer=TABLE[1][i];
	    j=1;
	    break;
    	 }
    case 0x14:				//P1.2 pressed
		{
        input_buffer=TABLE[2][i];
	    j=1;
	    break;
    	 }
    default:break;				//多个键同时按下,无效
    }
   if(i!=7)    scan_const=_crol_(scan_const,1);		//左移一位,循环移动
 
  }
return(input_buffer);
}



bit ScanKey(void)			//带去抖程序的键盘扫描,按键的键值存入KEYVALUE,无按键提示音,若有键按下,返回值为1,否则,0
{
extern byte ScanOnce();
extern byte KEYVALUE;
byte temp1,temp2;
bit j=0;

do{temp1=ScanOnce();

  Delay100uS(100);				// delay10mS();			   //去抖程序,******需要优化******

  temp2=ScanOnce();

  }while(!(temp1==temp2));		//若两次扫描结果不一样,则继续扫描,直到获得正确数据

if(temp1!=NULLKEY) 
	{
	KEYVALUE=temp1;
	j=1;
	}
return(j);

}

bit KeyInput(byte type,byte interval,byte *KeyCode)		//interval时间间隔单位为100mS,add on 2004/06/01
{
word oldtime,newtime;
switch(type)
	{
	 case 0: 		//type 0,按下键后取值,松开键后返回
	 	while(ScanKey());
		*KeyCode=KEYVALUE;
		while(!ScanKey());
		return(0);
	 case 1:		//type 1,按下键后取值,松开键后返回,若按键时间大于interval,返回1
	 	while(ScanKey());
		*KeyCode=KEYVALUE;
		oldtime=GetCurruntTime();
		while(!ScanKey());
		newtime=GetCurruntTime();
		newtime-=oldtime;
		if(newtime<=0)newtime+=0xffff;
		if(newtime>interval*10)
		return(1);
		else return(0);
		//break;
	 case 2:		//type 2,延时1秒,然后每interval时间取值一次
	 	while(ScanKey());
		*KeyCode=KEYVALUE;
		Delay100uS(10000);
		if(ScanKey())
		{
		*KeyCode=KEYVALUE;
		Delay100uS(interval*1000);
		}
		return(0);
	 	//break;
	 case 3:break;
	 default:break;
	}

}

byte KeyboardInputNumbers(byte number,byte *p)  
//number为允许输入的数字数目,*p指向数字的存放空间,返回值为非CANCEL的功能键值
{
extern bit ScanKey();
extern bit ComRecieve();
extern byte KEYVALUE;
byte i=0,i2;					//i为输入数字的个数,1<=i<=number有效
byte keyvalue;				//存放每次扫描的键值,即ScanKey()返回值
byte rtn=0;


do
  {
     while(!ScanKey());	
	 keyvalue=KEYVALUE;
	 KEYVALUE=NULLKEY;
     if((keyvalue&0x80)==0) 		//输入为数字???????????????????????
           {
			 if((i==0)&&(keyvalue==0))error_sound();	//第一个输入的数字不能是0
			else{
		   
			   if(i<number)					//数字输入未完成
			   {
				for(i2=i;i2>0;i2--){*(p+i2)=*(p+i2-1);}		
			   *p=keyvalue;
			    i++;
    		    sound();
				//LcdPutChar(keyvalue);
     		     }
				else error_sound();
			  }
			}
     else 						//输入为功能键
		{
		     switch(keyvalue)
			   {
			   case CANCEL:
			   		 if(i>0) 
				   {
					for(i2=0;i2<i;i2++){*(p+i2)=*(p+i2+1);}
					i--;
					sound();
					//LcdPutChar(BACKSPACE);			//刚才显示的数字应该清除
					}
					else error_sound();
					break;
					
			   case START:					//number input finished,return to main function.
					if(i==0) error_sound();
					else {sound();rtn=START;}
					break;
			   default:
			   		break;
			   } //switch(keyvalue)
		}//else
  }while(rtn==0);
   
return(rtn);
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -