资源描述:
《键盘消抖相关资料》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、采用调度器,每隔xxms查询一次采用先让列线为高(或低),令行线依次为低(或高),查询列线状态如果有键按下,则返回键值函数uCHARKey_Number_Check(void){staticdataCHAROld_Key;CHARKey=KEYPAD_NO_NEW_DATA;uCHARindex;R1=0;if(C1==0)index=0;if(C2==0)index=1;if(C3==0)index=2;if(C4==0)index=3;R1=1;R2=0;if(C1==0)index=4;if(C2==0)index=5;if(C3==0)index=6;if(C
2、4==0)index=7;R2=1;R3=0;if(C1==0)index=8;if(C2==0)index=9;if(C3==0)index=10;if(C4==0)index=11;R3=1;R4=0;if(C1==0)index=12;if(C2==0)index=13;if(C3==0)index=14;if(C4==0)index=15;R4=1;if(Key==Old_Key)//Checktwicetoassurethereisakeypressed{//AvalidKeycheckedif(Key!=Last_valid_key_G)//NewKey!
3、Last_valid_key_G=Key;while(C1==0
4、
5、C2==0
6、
7、C3==0
8、
9、C4==0);returnindex;}else{Old_Key=Key;returnindex;}}888888888888888888888888888888888888888888888888888888888888888888888888888其实都是单片机教材的错啦。比如动不动就用行例矩阵键盘一样,呵呵……键盘扫描和任何中断处理一样,要尽量快的处量完,尽量不要做无谓的等待工作,降低系统响应效率。不过要达到好的系统效果,能用RTOS的情况下,最好尽量用OS,可以大大
10、提高CPU的调度能力和系统实时性。顺便发一个我用的键盘程序吧。基于UCOSII,在系统时钟HOOK函数中调用。键可用时发送键盘值到队例。有长按键处理,并随着按键时间的增加而加快重复产生键值能的频率,对一些少键系统调节数值时很有用。voidKeyScan(void){staticINT32UbPreKeyBuf=0x3f,bCurKeyBuf=0x3f,bKeyOK=FALSE,bLongKey=FALSE,bKeyRepeatDelay;staticINT32UbTickCount=0;INT32UdwTemp;dwTemp=IO0PIN;bCurKeyBuf=0;b
11、CurKeyBuf=bCurKeyBuf
12、((dwTemp>>22)&0x08);//Key1(ESC_KEY)P0.25bCurKeyBuf=bCurKeyBuf
13、((dwTemp>>24)&0x04);//Key2(UP_KEY)P0.26bCurKeyBuf=bCurKeyBuf
14、((dwTemp>>29)&0x02);//Key3(DOWN_KEY)P0.30dwTemp=IO1PIN;bCurKeyBuf=bCurKeyBuf
15、((dwTemp>>16)&0x01);//Key4(ENTER_KEY)P1.16if(bCurKeyBuf!=0x0f){if(
16、bCurKeyBuf!=bPreKeyBuf){bPreKeyBuf=bCurKeyBuf;bTickCount=0;bKeyOK=FALSE;bLongKey=FALSE;if(bKeyRepeat==1){bKeyRepeat=0;OSQPost(KeyQueue,(void*)UPDATE_KEY);}}else{bTickCount++;if(bLongKey==FALSE){if(bTickCount==2){bKeyOK=TRUE;OSQPost(KeyQueue,(void*)bPreKeyBuf);}if(bTickCount==LONG_KEY_DE
17、LAY){bLongKey=TRUE;bKeyRepeatDelay=KEY_REPEAT_DELAY;bKeyOK=FALSE;OSQPost(KeyQueue,(void*)(bPreKeyBuf
18、0x80));bTickCount=0;}}else{if(bKeyRepeat==TRUE){if(bTickCount>=(bKeyRepeatDelay)){OSQPost(KeyQueue,(void*)(bPreKeyBuf
19、0x80));bTickCount=0;if(bKeyRepeatDelay>4)bKeyRepeatDelay--;