//如果按键值没有变化KeyValue=0 ModiFlag =0;按键按下ModiFlag置1 值在ModiFlag里 用完请清ModiFlag和ModiFlag
KeyVal[]是做消抖用。
unsigned char keytable[] ={3,2,1,5,4,8,7,6,10,9,13,12,11,16,15,14,,19,18,17,22,21,20};
void TIM4_IRQHandler(void)
{
static uint32_t KeyVal[6],KeyOldVal=0,KeyValue;
static uint8_t KeyPoint=0,ModiFlag=0;
if(TIM_GetITStatus(TIM4, TIM_IT_Update) == SET)
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
GPIO_SetBits(GPIOE,GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5); GPIO_ResetBits(GPIOE, GPIO_Pin_6 ); delay_us(XD);
new_KeyVal = (~((GPIO_ReadInputData(GPIOE) & 7) + ((GPIO_ReadInputData(GPIOB)&0x0300) >>5))) & 0x1f ;
GPIO_SetBits(GPIOE,GPIO_Pin_6 | GPIO_Pin_3 | GPIO_Pin_4);GPIO_ResetBits(GPIOE, GPIO_Pin_5 ); delay_us(XD);
new_KeyVal |= (((~((GPIO_ReadInputData(GPIOE) & 7) + ((GPIO_ReadInputData(GPIOB)&0x0300) >>5))) & 0x1f) << 5);
GPIO_SetBits(GPIOE,GPIO_Pin_6 | GPIO_Pin_5 | GPIO_Pin_3); GPIO_ResetBits(GPIOE, GPIO_Pin_4 ); delay_us(XD);
new_KeyVal |= (((~((GPIO_ReadInputData(GPIOE) & 7) + ((GPIO_ReadInputData(GPIOB)&0x0380) >>4))) & 0x3f) << 10);
GPIO_SetBits(GPIOE,GPIO_Pin_6 | GPIO_Pin_4 | GPIO_Pin_5); GPIO_ResetBits(GPIOE, GPIO_Pin_3 ); delay_us(XD);
new_KeyVal |= (((~((GPIO_ReadInputData(GPIOE) & 7) + ((GPIO_ReadInputData(GPIOB)&0x0380) >>4)))& 0x3f ) << 16);
GPIO_ResetBits(GPIOE,GPIO_Pin_6 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_3);
KeyVal[KeyPoint++]= new_KeyVal;
if(KeyPoint >= 6) KeyPoint =0;
if((KeyVal[0] == KeyVal[1])&&(KeyVal[0] == KeyVal[2])&&&&(KeyVal[0] == KeyVal[3])&&(KeyVal[0] == KeyVal[4])&&(KeyVal[0] == KeyVal[5]))
{ for(i=0;i<22;i++)
{
if(KeyVal[0] &(1<<i))
break;
}
if(i >=22)
KeyValue =0;
else
KeyValue =keytable[i];
if(KeyValue != KeyOldVal)
{
KeyOldVal=KeyValue;
ModiFlag=1;
}
}
}
}
|