📄 keyboard.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 + -