zoukankan      html  css  js  c++  java
  • LPC1788的外部中断和GPIO中断

    首先是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类似了

  • 相关阅读:
    Codeforces 749C【模拟】
    Codeforces 358D【DP】
    Lightoj1122 【数位DP】
    Codeforces 744C【DFS】
    大晚上就是想说说话
    HDU5997 【线段树】
    codeforces743D 【DFS】
    lightoj 1422【区间DP·分类区间首元素的情况】
    lightoj 1125【背包·从n个选m个】
    Lightoj 1147【DP】
  • 原文地址:https://www.cnblogs.com/dengxiaojun/p/4338705.html
Copyright © 2011-2022 走看看