• 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类似了

  • 相关阅读:
    Enterprise Library3.1 使用数据访问模块时,调用Microsoft.Practices.EnterpriseLibrary.Data报出源文件与当前应用程序不一致和创建dataconfiguration的配置节处理程序出错
    net精华:C#中对注册表的操作
    [翻译]使用Enterprise Library 3.0的日志程序块
    分布式应用程序概述
    调整Oracle数据库print_bill表字段BillMKID的顺序,并判断表print_bill是否存在及字段billMKID是否存在
    Win32下注册COM组件后对注册表产生的变动
    vc 字符串与指针
    SQL Server不允许进行远程连接的解决办法
    vc上字符串,CString ,string,char数组&char指针
    如何用Visual C#来创建、修改注册信息
  • 原文地址:https://www.cnblogs.com/dengxiaojun/p/4338705.html
Copyright © 2020-2023  润新知