本帖最后由 yzzly 于 2012-3-12 14:57 编辑
void KeyScan(void)
{
Uint16 KeySta;
GPIOE->ODR = GPIOE->ODR & 0xFFF8 | 0x0078; //整体扫描,使KeyC0~C2为0,KeyR0~KeyR3为1
DelayUs(5);
KeySta = GPIOE->IDR & 0x78;
if((KeySta != 0x78)&&(KeySta != LastKey)) //整体扫描发现有键按下则置扫描次数
{
if(ScanCnt++>4) //扫描次数到则置位扫描标志
{
ScanCnt=0;
LastKey=KeySta;
Flags.ScanBit=1;
}
}
else
{
LastKey=KeySta;
}
if(Flags.ScanBit) //位扫描
{
Flags.ScanBit=0;
if(KeyValue==0)
{
KEYC2=1;KEYC1=1;KEYC0=0;
DelayUs(5);
KeySta = GPIOE->IDR & 0x7F;
if((KeySta & 0x7F) != 0x7E)
{
Flags.KeyFlag=1;
KeyValue=KeySta & 0x7F;
}
}
if(KeyValue==0)
{
KEYC2=1;KEYC1=0;KEYC0=1;
DelayUs(5);
KeySta = GPIOE->IDR & 0x7F;
if((KeySta & 0x7F) != 0x7D)
{
Flags.KeyFlag=1;
KeyValue=KeySta & 0x7F;
}
}
if(KeyValue==0)
{
KEYC2=0;KEYC1=1;KEYC0=1;
DelayUs(5);
KeySta = GPIOE->IDR & 0x7F;
if((KeySta & 0x7F) != 0x7B)
{
Flags.KeyFlag=1;
KeyValue=KeySta & 0x7F;
}
}
Flags.KeyScan=0;
}
扫描思路是:先整体扫描,如果发现有变化且时间够长,则进行位扫描,确定是哪一个按键按下。
|