点击下载源码
上一篇杂记写了个扫描方式的键盘程序,但是最近在做一个小游戏对CPU响应速度有要求,于是再弄个简单的键盘中断检测程序吧。

总体思路:中断线为4行连接的GPIO口,先初始化矩阵的4行输出低电平4列输出高电平,当有按键按下时的上升沿触发中断;然后在相应的中断处理函数里面采取查询的方式(参考上篇)获得键值。
部分程序
void EXTI9_5_IRQHandler(void) //外部中断中断函数
{
if(EXTI_GetITStatus(EXTI_Line7) != RESET) //检测中断标志位
{
//行置高,列置低,扫描列
GPIO_SetBits ( ROW1_GPIO_PORT, ROW1_GPIO_PIN );
GPIO_ResetBits ( LINE1_GPIO_PORT, LINE1_GPIO_PIN );
GPIO_ResetBits ( LINE2_GPIO_PORT, LINE2_GPIO_PIN );
GPIO_ResetBits ( LINE3_GPIO_PORT, LINE3_GPIO_PIN );
GPIO_ResetBits ( LINE4_GPIO_PORT, LINE4_GPIO_PIN );
//取4列的状态
if(GPIO_ReadInputDataBit ( LINE1_GPIO_PORT, LINE1_GPIO_PIN ))
{
while(GPIO_ReadInputDataBit ( LINE1_GPIO_PORT, LINE1_GPIO_PIN )); //等待按键松开,不然出现连续进入中断的错误
KeyValue = 1;
}
if(GPIO_ReadInputDataBit ( LINE2_GPIO_PORT, LINE2_GPIO_PIN ))
{
while(GPIO_ReadInputDataBit ( LINE2_GPIO_PORT, LINE2_GPIO_PIN ));
KeyValue = 2;
}
if(GPIO_ReadInputDataBit ( LINE3_GPIO_PORT, LINE3_GPIO_PIN ))
{
while(GPIO_ReadInputDataBit ( LINE3_GPIO_PORT, LINE3_GPIO_PIN ));
KeyValue = 3;
}
if(GPIO_ReadInputDataBit (</