最近在做矩阵键盘,按下按键后,通过sci观察会看多100多个数据,始终无法解决。我设置的是gioPORTB的0、2、4、6具有下降沿中断功能,另外的几个口用hetPORT1,不具备中断功能。由于键盘扫描中有这样一步gioSetPort(gioPORTB,0x00);,使得程序会发生4次中断,异味着即使消抖很好每次至少要发送5个数据。我想问一下,如何关中断,就是在进入中断处理服务函数之后,程序不再响应中断。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
最近在做矩阵键盘,按下按键后,通过sci观察会看多100多个数据,始终无法解决。我设置的是gioPORTB的0、2、4、6具有下降沿中断功能,另外的几个口用hetPORT1,不具备中断功能。由于键盘扫描中有这样一步gioSetPort(gioPORTB,0x00);,使得程序会发生4次中断,异味着即使消抖很好每次至少要发送5个数据。我想问一下,如何关中断,就是在进入中断处理服务函数之后,程序不再响应中断。
你的理解是对的,但我按照你的方法貌似没用,以下是我中断
#pragma CODE_STATE(gioLowLevelInterrupt, 32)
#pragma INTERRUPT(gioLowLevelInterrupt, IRQ)
/* SourceId : GIO_SourceId_011 */
/* Requirements : HL_SR131 */
void gioLowLevelInterrupt(void)
{
sint32 offset = gioREG->OFFSET1 - 1U;
/* USER CODE BEGIN (17) */
gioDisableNotification(gioPORTB,0);
/* USER CODE END */
if (offset >= 8)
{
gioNotification(gioPORTB, offset-8);
}
else
{
gioNotification(gioPORTA, offset);
}
/* USER CODE BEGIN (18) */
gioEnableNotification(gioPORTB,0);
/* USER CODE END */
}
下面是我中断服务程序的键盘扫描的部分程序
uint8 key_scan()
{
uint32 key_temp0=0;
uint32 key_temp1=0;
uint32 key_num=0;
wait(2000);
key_temp0=gioGetPort(gioPORTB);
if(key_temp0!=0x55)
{
wait(2000);
key_temp0=gioGetPort(gioPORTB);
if(key_temp0!=0x55)
{
gioSetPort(hetPORT1,0x091120FE);
gioSetPort(gioPORTB,0x00);//程序在执行到这一步的时候,IntFlag会变成0x5500,本次中断结束后仍然继续执行gioNotification(gioPORTB, offset-8);直到IntFlag的值变为0x0000;
key_temp1=gioGetPort(hetPORT1);
我用示波器看了一下波形,gioPORTB口从高电平变为低电平,但是会出现尖峰,SCI传输的也是很多重复的数字。
或者你有矩阵键盘的例程吗,我想参考下
问题已经解决。我用的gioPORTB和hetPORT1做的4*6矩阵键盘,用的是gioPORTB的0、2、4、6口作下降沿中断;
但是在键盘扫描中有这样一句话gioSetPort(gioPORTB,0x00);,使得B口由高电平变为低电平,产生了4个下降沿中断,IntFlag中断标志寄存器的值变为0x5500,在本次中断结束之后仍然会进入中断,所以在中断处理程序末尾加上这样一句话
gioREG->FLG = 0xFFFFU;把中断标志寄存器清零即可。