|
发表于 2008-7-19 10:04:40
|
显示全部楼层
有效按键执行完的时候清最好。
给一个4*3的扫描程序你参考,我在项目中用到的。
按键功能可区分长/短键,按键分辨率可以调节
//==========================================================================//
//按键代码读取;KeysetCode的bit7为长键标志,bit6-0为键值.此函数要10ms执行一次 //
//==========================================================================//
void KeysetCodeRead(void)
{
static unsigned char KeysetScanOutputState, KeysetScanInputState; //键盘扫描输出(x)/输入(y)状态
static unsigned char KeysetPressCount; //键盘前后两次状态相同计数
static unsigned char KeysetPressTime=0xFF; //按键压时时间
unsigned char i, StateX, StateY;
for(i=0;i<4;i++){
KEYSET_SCAN_PORT |= 0x7F;
KEYSET_SCAN_PORT &= ~(1<<i);
asm("nop");
StateX=0xFF;
if((KEYSET_SCAN_PIN & 0x70) != 0x70){
StateX =i;
StateY =KEYSET_SCAN_PIN & 0x70;
break;
}
}
if((KeysetScanOutputState== StateX) && (KeysetScanInputState== StateY)){
if(KeysetPressTime < KEYSET_PRESS_MAX_TIME){
KeysetPressTime++;
}
else if(KeysetPressTime == KEYSET_PRESS_MAX_TIME){
KeysetPressTime++;
if(!(SysFlag & KEY_LOCK_FLAG) || ((KeysetCode&0x7F) == KEY_LOCK)) BeepTaskMode=2;//键盘锁定后只有开锁键有提示
}
if(KeysetPressCount < KEYSET_PRESS_MAX_COUNT){
KeysetPressCount++;
}
else if(KeysetPressCount == KEYSET_PRESS_MAX_COUNT){
KeysetPressCount++;
//采样到有效按键
if(StateX==0){ //X0
if(StateY==KEY_Y0) i =KEY_1; //Y0
else if(StateY==KEY_Y1) i =KEY_CH1; //Y1
else if(StateY==KEY_Y2) i =KEY_LOCK; //Y2
}
else if(StateX==1){ //X1
if(StateY==KEY_Y0) i =KEY_2;
else if(StateY==KEY_Y1) i =KEY_CH2;
else if(StateY==KEY_Y2) i =KEY_OUT;
}
else if(StateX==2){ //X2
if(StateY==KEY_Y0) i =KEY_3;
else if(StateY==KEY_Y1) i =KEY_PARA;
else if(StateY==KEY_Y2) i =KEY_FINE_V;
}
else if(StateX==3){ //X3
if(StateY==KEY_Y0) i =KEY_4;
else if(StateY==KEY_Y1) i =KEY_SER;
else if(StateY==KEY_Y2) i =KEY_FINE_I;
}
else{ i=KEY_NO; //无按键
}
if(i == 0){
if(KeysetPressTime >= KEYSET_PRESS_MAX_TIME){
KeysetCode |=0x80;
}
else{
KeysetCode &=0x7F;
if(!(SysFlag & KEY_LOCK_FLAG)) BeepTaskMode=1;
}
KeysetPressTime = KEYSET_PRESS_MAX_TIME+1;
TaskFlag |= KEYSET_READ_FLAG;
}
else{
KeysetPressTime=0;
KeysetCode =i; //保存键值代码
}
}
}
else{
if(KeysetPressCount >= KEYSET_PRESS_MAX_COUNT) KeysetPressCount=0;
else KeysetPressCount= KEYSET_PRESS_MAX_COUNT+1;
KeysetScanOutputState =StateX;
KeysetScanInputState =StateY;
}
} |
|