我参考了一下别人的电子锁程序,想将一个矩阵键盘的按键配置为中断,可是程序写完之后发现,一旦进入其中一个中断,再按其他键已经没有反应了,但是矩阵键盘的16个值的确是正确的,经过我的测试,应该不是退不出中断的问题啊,请问各位能帮忙看出错误在哪吗?
[mw_shl_code=c,true]// 矩阵键盘接口配置
void KeyBoard_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
// 列线上拉输入 PC
GPIO_InitStructure.GPIO_Pin = 0x000f;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
// 行线推挽输出 PA
GPIO_InitStructure.GPIO_Pin = 0x000f;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//行线转换为上拉输入,中断点转换为推挽输出
void KeyBoard_Conv(u16 GPIO_Pin)
{
GPIO_InitTypeDef GPIO_InitStructure;
//中断脚转换为推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
//行线转换为上拉输入
GPIO_InitStructure.GPIO_Pin = 0x000f;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
// PC.0 列线0中断
void EXTI0_IRQHandler(void)
{
u16 keycol;
if(EXTI_GetITStatus(EXTI_Line0))
{
KeyBoard_Conv(GPIO_Pin_0);
GPIO_ResetBits(GPIOC,GPIO_Pin_0);
delay_ms(1);
keycol = GPIO_ReadInputData(GPIOA)&0x000f;
if(keycol)
{
delay_ms(10);
if(keycol == (GPIO_ReadInputData(GPIOA)& 0x000f))
{
keyflag = 1;
switch(keycol)
{
case 0x0E: keyval = 1; break;
case 0x0D: keyval = 4; break;
case 0x0B: keyval = 7; break;
case 0x07: keyval = '*';break;
default :break;
}
}
}
// GPIO_SetBits(GPIOC,GPIO_Pin_0);
KeyBoard_Config();
EXTI_ClearITPendingBit(EXTI_Line0);
}
}[/mw_shl_code]
|