打印

LPC1768 GPIO中断

[复制链接]
3290|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
RingKing|  楼主 | 2014-5-19 16:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近做关于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++;
}


相关帖子

沙发
RingKing|  楼主 | 2014-5-19 16:37 | 只看该作者
再申明一下,我驱动数码管用的事595,可以正常显示,但是两个程序联调出现问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝