最近做关于LPC1768的项目,遇到这样的问题,我用GPIO的外部中断做实验,进一次中断a+1,然后用数码管显示,可是加上LED_GPIOINIT这个函数以后,就会出现多次进中断的情况,数码管显示的数字就是不正确的,我的外部中断接的是一个旋转开关编码器。自己看程序的时间太长了,找不到bug,所以想请用过lpc1768的同志们帮忙解决一下谢谢哈,程序付下
/*数码管的IO口初始化,P0.4=LEDSD(串行数据输入) P0.5=LEDSTB(存储器时钟) P0.6=LEDSCK(移位寄存器的时钟)*/
void LED_Gpioinit(void)
{
//LPC_PINCON -> PINMODE_OD0 &=0xffffff8f;//数码管指示,设置设置P0.4 P0.5 P0.6为开漏输出模式
LPC_GPIO0 -> FIODIR |=0xffffffff;//设置P0.4 P0.5 P0.6为输出引脚
LPC_GPIO0 -> FIOSET |=0x00000070;//设置P0.4 P0.5 P0.6的初始值为高电平,其余位保持不变
}//proc
/*移位寄存器写入串行的数据*/
void Led_write(uint8_t Data)
{
uint8_t i;
LPC_GPIO0 -> FIOCLR |=SD;//将0.4 P0.5 P0.6都清零
LPC_GPIO0 -> FIOCLR |=SCK;
LPC_GPIO0 -> FIOCLR |=STB;
for(i=0;i<8;i++)
{
if(Data&0x01)//先发送低位
LPC_GPIO0 ->FIOSET |=SD;
else
LPC_GPIO0 ->FIOCLR |=SD;
delay_time(1);
LPC_GPIO0 -> FIOCLR |=SCK;//清零移位寄存器的时钟信号
Data=Data>>1;
delay_time(1);
LPC_GPIO0 -> FIOSET |=SCK;//置位移位寄存器的时钟信号,出现移位寄存器时钟的上升沿,数据写入移位寄存器
}
}///proc
/*存储寄存器写入串行的数据*/
void Led_buffer_write(uint8_t a[],uint8_t byte)
//byte写入的字节数
{
uint8_t m;
for(m=byte-1;m>0;m--)
//for(m=0;m<byte;m++)
{
Led_write(a[m]);
}
Led_write(a[m]);
LPC_GPIO0 -> FIOCLR |=STB; //清零存储器的时钟信号
delay_time(5);
LPC_GPIO0 -> FIOSET |=STB; //置位存储器的时钟信号,出现存储寄存器时钟的上升沿,数据写入存储寄存器
}//proc
void Display_to_led(uint8_t l_b[],const uint8_t l_w[],const uint8_t l_i[],uint16_t dat,uint8_t flag,uint8_t fp_flag)
//fp_flag==0x01 0x10 0x11 0x00 指示是否显示小数点。
{
uint16_t res;
uint8_t a,b,c;
res=dat;
if(flag==1)
{
a=res/100;
res=res%100;
l_b[l_i[0]-1]=l_w[a];
a=res/10;
res=res%10;
l_b[l_i[1]-1]=l_w[a];
if(fp_flag&0x10) //加小数点
l_b[l_i[1]-1]+=0x80;
l_b[l_i[2]-1]=l_w[res];
}
else
if(flag==0)
{
a=res/100;
res=res%100;
l_b[l_i[4]-1]=l_w[a];
a=res/10;
res=res%10;
l_b[l_i[5]-1]=l_w[a];
if(fp_flag&0x01)
l_b[l_i[5]-1]+=0x80;
l_b[l_i[6]-1]=l_w[res];
}
}//proc
void EINTInit()
{
// LPC_PINCON -> PINSEL4 |= 0x00400000; /* set P2.11 as EINT1 and P2.13 as EINT3*/
// LPC_GPIOINT -> IO2IntEnF |= (1<<8); /* P0.10 is rising edge interrupt*/
LPC_GPIOINT -> IO2IntEnF |=(1<<8); /* P0.10 is rising edge interrupt*/
// LPC_SC -> EXTMODE = 0x02; /* INT1-3 边沿触发模式 */
// LPC_SC -> EXTINT |=EINT3;
// LPC_SC -> EXTINT |=EINT1;
// NVIC_EnableIRQ(EINT1_IRQn);
NVIC_EnableIRQ(EINT3_IRQn);
}//proc
void EINT3_IRQHandler (void) //电压编码器的控制
{
uint8_t encoder_dir_flag;
//NVIC_DisableIRQ(EINT3_IRQn);
LPC_GPIOINT -> IO2IntClr|= (1<<8);
// NVIC_EnableIRQ(EINT3_IRQn);
/* if(LPC_GPIO2 ->FIOPIN&0x00000200)
{
encoder_dir_flag=1;//顺时针旋转 数值加
}
else if(!(LPC_GPIO2->FIOPIN&0x00000200))
{
encoder_dir_flag=0;//逆时针旋转 数值减
} */
a++;
}
|