========================================================
// PA2-PA5 PC3-PC5作为引脚
//行扫描法:从PA2开始逐行置低电压
//双键扫描:K1 K5 K9为同一列PA2控制,如果为同一列,例如K1 K5同时按下,PC5 PC4 PC3的电压为 100 此时PA5 PA4 PA3 PA2 1110
//如果只是K1按下,PC5 PC4 PC3的电压为 110 此时PA5 PA4 PA3 PA2 1110
void GetKeyStatus()
{
u8 i,j, k=0;
u8 tmp,sccode,recode;
u8 TmpCode,TmpPreCode = 0;
u8 KeyCode[4] = 0;
u8 ComplexFlag = 0;
//设置单片机输入输出,此为芯片仿真所用,在板子上调试
PAOutputMode();
PCInputModePush();
xPORT_A=xPORT_A&(~0x3C); //0x3C(111100)
Wait_ms(10);
tmp=xPORT_C;
tmp=tmp&0x38; //00111000
if(0x38 != tmp)
{
Wait_ms(10); // Eliminating shiver
if(0x38 != (tmp & 0x38))
{
Wait_ms(30);
sccode = ~0x04; //从PA2开始扫描
while(0x3C != (sccode & 0x3C))
{
xPORT_A = sccode;
tmp = xPORT_C;
tmp = tmp & 0x38 ;
if(0x38 != tmp)
{
recode = ((sccode & 0x3C) >> 2) & 0x0f | 0xf0; //PA: xxxx 00 >>2 = xxxx 11111101
TmpCode = (~((tmp << 1) & 0xf0 | 0x0f)) & 0x7f | (~recode); //Mode:xxx(pc) xxxx(pa)
if(TmpPreCode != TmpCode)
{
KeyCode[k] = TmpCode;
k++;
TmpPreCode = TmpCode;
}
}
sccode = (sccode << 1)|0x01;
}
}
for(i=0,j = 0;i<(sizeof(KeyCode) /sizeof(u8)); i++)
{
if(0 != KeyCode[i])
{
KeyNo[j] = fnKeycode(KeyCode[i]);
j++;
}
}
if(j < 2 && 0x0B >= KeyNo[0])//00:Sigle Button 01:Multi Button
{
KeyCode[0] = '0';
KeyCode[1] = '0';
KeyCode[2] = KeyNo[0];
}
else
{
KeyCode[0] = '0';
KeyCode[1] = '1';
if( 0x0B < KeyNo[0])
{
KeyCode[2] = KeyNo[0] & 0xF0;
KeyCode[3] = KeyNo[0] & 0x0F;
}
else
{
KeyCode[2] = KeyNo[1] ;
KeyCode[3] = KeyNo[2] ;
}
}
}
}
u8 fnKeycode(u8 key)
{
switch(key)
{
case 0x11:
key = 0x01;
break;
case 0x12:
key = 0x02;
break;
case 0x14:
key = 0x03;
break;
case 0x18:
key = 0x04;
break;
case 0x21:
key = 0x05;
break;
case 0x22:
key = 0x06;
break;
case 0x24:
key = 0x07;
break;
case 0x28:
key = 0x08;
break;
case 0x41:
key = 0x09;
break;
case 0x42:
key = 0x0A;
break;
case 0x44:
key = 0x0B;
break;
//===Fuction Keytable===//
case 0x31:
key = 0x15; //K1+K5=15
break;
case 0x51:
key = 0x19; //K1+K9=19
break;
case 0x61:
key = 0x59; //K5+K9=59
break;
case 0x32:
key = 0x26; //k2+k6
break;
case 0x52:
key = 0x2A; //k2+ka
break;
case 0x62:
key = 0x6A;//k6+ka
break;
case 0x34:
key =0x37; //k3+k7
break;
case 0x54:
key =0x3B;// k3+kb
break;
case 0x64:
key = 0x7B; //k7+kb
break;
case 0x38:
key = 0x48; //k4+k8
break;
default:
key = 0x00;
break;
}
return key;
}