两个IO口共用一个中断处理函数
这个是按键初始化的函数:#include "KEY.h"
/*按键初始化*/
void KEY_Init(void)
{
GPIO_Init(KEY1_PORT, KEY1|KEY2|KEY3|KEY4|KEY5, GPIO_Mode_In_PU_IT);//中断方式
GPIO_Init(KEY5_PORT, KEY5, GPIO_Mode_In_PU_IT);//中断方式
EXTI_SetPinSensitivity(EXTI_Pin_2|EXTI_Pin_3|EXTI_Pin_4|EXTI_Pin_5, EXTI_Trigger_Falling_Low ); //配置外部中断触发方式
}
bool KEY_Down(GPIO_TypeDef* GPIOx,GPIO_Pin_TypeDefGPIO_Pin)
{
/*检测是否有按键按下 */
if( GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == 0 )
{
delay_ms(5); // 延时消抖
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==0)
{
while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==0); //等待按键释放
return true; //如果有键盘按下,就返回真值,否则返回假值
}
}
return false;
}
下面是中断2线的处理函数:
INTERRUPT_HANDLER(EXTI2_IRQHandler,10)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
if(KEY_Down(GPIOA,KEY1) == 0 )
{
GPIO_ToggleBits(GPIOC, GPIO_Pin_5);//LED1
printf ("01.\r\n");
EXTI_ClearITPendingBit(EXTI_IT_Pin2); //清除中断。
}
if(KEY_Down(GPIOD,KEY5) == 0 )
{
GPIO_ToggleBits(GPIOD, GPIO_Pin_4);//LED5
printf ("05.\r\n");
EXTI_ClearITPendingBit(EXTI_IT_Pin2); //清除中断。
}
}
现在发现的现象是:当KEY1键按下时,LED1状态有时翻转,有时不翻转。当KEY5按键按下时,LED1状态翻转 应该可以的 判断是哪个io口就可以啊
进入中断后可以判断io口的标志位就知道是哪个了
楼上的正解
请问根据什么可以判断是那个IO口?
通过中断标志判断是哪个GPIO产生中断
STM8没有中断标志位
STM8没有中断标志位
怎么可能呢,我还没有发现没有的
据我了解到的,我是共用中断2线函数的,有Externalinterruptstatusregister1(EXTI_SR1)这个寄存器。但是这只能判断是哪个中断线发生中断,没有具体到哪个IO口。
去看相关的寄存器就明白了
那我就不知道了 我记得stm32是有的
判断一下io的按下电平
判断2个IO引脚电平来处理
没有去抖动就去搞LED了,其实LED已经被搞很多次了,而且次数随机,所以最终状态不确定。
判断的有问题吧
应该是可以的
可以精确到bit啊
看来对stm8不太了解啊
STM8中断寄存器里面有相关数据位,可以再确认一下
页:
[1]
2