单片机
返回首页

LPC1788的外部中断和GPIO中断

2017-01-13 来源:eefocus

首先是gpio中断,这一点和1768不同,1768使用的中断时和eint3共用中断通道,到了1788,专门为gpio开辟了中断

#ifndef __JOYPAD_H_

#define __JOYPAD_H_

 

#include 'sys.h'

#include 'delay.h'

 

#define JOYPAD_A        0X01

#define JOYPAD_B        0X02

#define JOYPAD_C        0X03

#define JOYPAD_D        0X04

#define JOYPAD_ENTER    0X05

 

extern u8 joypadValue;

 

void Joypad_Scan_Init(void);

 

void Joypad_Exti_Init(void);

 

u8 Joypad_Get_Key(void);

 

 

#endif

 

 

 

 

 

 

 

#include 'joypad.h'

 

u8 joypadValue = 0;

 

void Joypad_Exti_Init(void)

{

    //p4没有中断通道,所以只有key1和key2拥有中断

    LPC_SC->PCONP |= (1<<15);//打开时钟

   

    //选择管脚模式,1788为每个管脚都设计了一个寄存器来选择管脚模式

    LPC_IOCON->P2_25 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

    LPC_IOCON->P2_25 |= (2<<3);//上拉

    P2dir(25) = 0;  //输入

    LPC_GPIOINT->IO2IntEnF |= (1<<25);//使能IO口下降沿触发

    LPC_GPIOINT->IO2IntClr |= (1<<25);//清除io口中断

   

    LPC_IOCON->P2_26 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

    LPC_IOCON->P2_26 |= (2<<3);//上拉

    P2dir(26) = 0;  //输入

    LPC_GPIOINT->IO2IntEnF |= (1<<26);//使能IO口下降沿触发

    LPC_GPIOINT->IO2IntClr |= (1<<26);//清除io口中断

   

    LPC_IOCON->P2_23 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

    LPC_IOCON->P2_23 |= (2<<3);//上拉

    P2dir(23) = 0;  //输入

    LPC_GPIOINT->IO2IntEnF |= (1<<23);//使能IO口下降沿触发

    LPC_GPIOINT->IO2IntClr |= (1<<23);//清除io口中断

   

    LPC_IOCON->P2_19 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

    LPC_IOCON->P2_19 |= (2<<3);//上拉

    P2dir(19) = 0;  //输入

    LPC_GPIOINT->IO2IntEnF |= (1<<19);//使能IO口下降沿触发

    LPC_GPIOINT->IO2IntClr |= (1<<19);//清除io口中断

   

    //P0.14 与usb2_connect冲突,所以使用usb2连接的时候不用p0.14

//  LPC_IOCON->P0_14 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

//  LPC_IOCON->P0_14 |= (2<<3);//上拉

//  P0dir(14) = 0;  //输入

//  LPC_GPIOINT->IO0IntEnF |= (1<<14);//使能IO口下降沿触发

//  LPC_GPIOINT->IO0IntClr |= (1<<14);//清除io口中断

   

    NVIC_ClearPendingIRQ(GPIO_IRQn);

    NVIC_SetPriority(GPIO_IRQn,NVIC_EncodePriority(PriorityGroup2,GPIO_PreemptPriority,GPIO_SubPriority));

    NVIC_EnableIRQ(GPIO_IRQn);

}

 

void Joypad_Scan_Init(void)

{

    //p2.25 p2.26 p2.23 P2.19 P0.14

    LPC_SC->PCONP |= (1<<15);//打开时钟

   

    //选择管脚模式,1788为每个管脚都设计了一个寄存器来选择管脚模式

    LPC_IOCON->P2_25 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

    LPC_IOCON->P2_25 |= (2<<3);//上拉

    P2dir(25) = 0;  //输入

   

    LPC_IOCON->P2_26 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

    LPC_IOCON->P2_26 |= (2<<3);//上拉

    P2dir(26) = 0;  //输入

   

    LPC_IOCON->P2_23 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

    LPC_IOCON->P2_23 |= (2<<3);//上拉

    P2dir(23) = 0;  //输入

   

    LPC_IOCON->P2_19 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

    LPC_IOCON->P2_19 |= (2<<3);//上拉

    P2dir(19) = 0;  //输入

   

//  LPC_IOCON->P0_14 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

//  LPC_IOCON->P0_14 |= (2<<3);//上拉

//  P0dir(14) = 0;  //输入

}

 

u8 Joypad_Get_Key(void)

{

    if(P2in(25) == 0)

    {

        Delay_Ms(5);

        if(P2in(25) == 0)

        {

            joypadValue = JOYPAD_A;

        }

    }

    if(P2in(26) == 0)

    {

        Delay_Ms(5);

        if(P2in(26) == 0)

        {

            joypadValue = JOYPAD_B;

        }

    }

    if(P2in(23) == 0)

    {

        Delay_Ms(5);

        if(P2in(23) == 0)

        {

            joypadValue = JOYPAD_C;

        }

    }

    if(P2in(19) == 0)

    {

        Delay_Ms(5);

        if(P2in(19) == 0)

        {

            joypadValue = JOYPAD_D;

        }

    }

//  if(P0in(14) == 0)

//  {

//      Delay_Ms(5);

//      if(P0in(14) == 0)

//      {

//          joypadValue = JOYPAD_ENTER;

//      }

//  }

    return joypadValue;

}

 

void GPIO_IRQHandler(void)

{

    NVIC_ClearPendingIRQ(GPIO_IRQn);

//  if((LPC_GPIOINT->IntStatus & (1<<0)))   //p0中断

//  {

//      if((LPC_GPIOINT->IO0IntStatF & (1<<14)))

//      {

//          //清除中断

//          LPC_GPIOINT->IO0IntClr |= (1<<14);

//          joypadValue = JOYPAD_ENTER;

//      }

//  }

    if((LPC_GPIOINT->IntStatus & (1<<2)))   //p2中断

    {

        if((LPC_GPIOINT->IO2IntStatF & (1<<25)))

        {

            //清除中断

            LPC_GPIOINT->IO2IntClr |= (1<<25);

            joypadValue = JOYPAD_A;

           

        }

        if((LPC_GPIOINT->IO2IntStatF & (1<<26)))

        {

            //清除中断

            LPC_GPIOINT->IO2IntClr |= (1<<26);

            joypadValue = JOYPAD_B;

           

        }

        if((LPC_GPIOINT->IO2IntStatF & (1<<23)))

        {

            //清除中断

            LPC_GPIOINT->IO2IntClr |= (1<<23);

            joypadValue = JOYPAD_C;

           

        }

        if((LPC_GPIOINT->IO2IntStatF & (1<<19)))

        {

            //清除中断

            LPC_GPIOINT->IO2IntClr |= (1<<19);

            joypadValue = JOYPAD_D;

           

        }

    }

   

}

 

 

 

然后是外部中断

 

void eint0_init(void)

{

    //p2.10

    LPC_SC->PCONP |= (1<<15);//打开时钟

    LPC_IOCON->P2_10 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

    LPC_IOCON->P2_10 |= (1<<0)|(2<<3);//上拉 eint0模式

    LPC_SC->EXTMODE |= 1<<0;//边沿触发 0为电平触发

    LPC_SC->EXTPOLAR |= 1<<0;//上升沿触发 0为下降沿触发

    LPC_GPIOINT->IO2IntEnR &= 1<<10;//使能GPIO 2.0上升沿触发

    LPC_SC->EXTINT |= (0x01<<0);    //清除中断

    NVIC_SetPriority(EINT0_IRQn,NVIC_EncodePriority(PriorityGroup2,EINT0_PreemptPriority,EINT0_SubPriority));

    NVIC_EnableIRQ(EINT0_IRQn);

}

 

中断函数就懒得写了,和1768类似了


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • PIC单片机控制的遥控防盗报警器电路

  • 短波AM发射器电路设计图

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 如何构建一个触摸传感器电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章