打印
[8/16-bit MCU]

LPC54102 人机界面按键输入功能

[复制链接]
1104|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Messi1999|  楼主 | 2016-1-15 21:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目的:通过4个按键,设置基本参数!

占用端口:GPIO:通用输入输出端口

占用硬件资源   GINT:GPIO组中断块 (响应按键)

                     RIT :定时器 (去抖延时)



一、端口
#define BUTTON1_PORT        0        /* GPIO port number for SW1 */

#define BUTTON1_PIN         3        /* GPIO pin number for SW1 */



#define BUTTON2_PORT        0        /* GPIO port number for SW2 */

#define BUTTON2_PIN         4        /* GPIO pin number for SW2 */



#define BUTTON3_PORT        0        /* GPIO port number for SW3 */

#define BUTTON3_PIN         23        /* GPIO pin number for SW3 */



#define BUTTON4_PORT        0        /* GPIO port number for SW4 */

#define BUTTON4_PIN         24        /* GPIO pin number for SW4 */




相关帖子

沙发
Messi1999|  楼主 | 2016-1-15 21:38 | 只看该作者
二、初始化GINT
/*****************************************************************************

*

*初始化GINT中断组

*****************************************************************************/



void Init_Gint(void)

{

        /* 初始化GPIO组中断块 */

        Chip_GPIOGP_Init(LPC_GINT);



        /* Configure pins as GPIO */

        Chip_IOCON_PinMuxSet(LPC_IOCON, BUTTON1_PORT, BUTTON1_PIN,

                                                                                        (IOCON_FUNC0 | IOCON_DIGITAL_EN  |IOCON_MODE_PULLUP ));//IOCON_GPIO_MODE

        Chip_IOCON_PinMuxSet(LPC_IOCON, BUTTON2_PORT, BUTTON2_PIN,

                                                                                        (IOCON_FUNC0 |  IOCON_MODE_PULLUP| IOCON_DIGITAL_EN));//IOCON_MODE_INACT

        Chip_IOCON_PinMuxSet(LPC_IOCON, BUTTON3_PORT, BUTTON3_PIN,

                                                                                        (IOCON_FUNC0 | IOCON_DIGITAL_EN  | IOCON_MODE_PULLUP ));

        Chip_IOCON_PinMuxSet(LPC_IOCON, BUTTON4_PORT, BUTTON4_PIN,

                                                                                        (IOCON_FUNC0 | IOCON_DIGITAL_EN  | IOCON_MODE_PULLUP));

      

        /* Group GPIO interrupt 0 will be invoked when both SW1-WAKE and SW2-ISP buttons are pressed. */

        Chip_GPIO_SetPinDIRInput(LPC_GPIO, BUTTON1_PORT, BUTTON1_PIN);

        Chip_GPIO_SetPinDIRInput(LPC_GPIO, BUTTON2_PORT, BUTTON2_PIN);

  Chip_GPIO_SetPinDIRInput(LPC_GPIO, BUTTON3_PORT, BUTTON3_PIN);

        Chip_GPIO_SetPinDIRInput(LPC_GPIO, BUTTON4_PORT, BUTTON4_PIN);

      

        /* Button 1 Setup for falling edge*/

        //设置选择引脚组和端口为低电平触发

        Chip_GPIOGP_SelectLowLevel(LPC_GINT, 0, BUTTON1_PORT, 1UL << BUTTON1_PIN);

        //启用选择引脚组中断

        Chip_GPIOGP_EnableGroupPins(LPC_GINT, 0, BUTTON1_PORT, 1UL << BUTTON1_PIN);



        /* Button 2 Setup for falling edge*/

        //设置选择引脚组和端口为低电平触发

        Chip_GPIOGP_SelectLowLevel(LPC_GINT, 0, BUTTON2_PORT, 1UL << BUTTON2_PIN);

        //启用选择引脚组中断

        Chip_GPIOGP_EnableGroupPins(LPC_GINT, 0, BUTTON2_PORT, 1UL << BUTTON2_PIN);

使用特权

评论回复
板凳
Messi1999|  楼主 | 2016-1-15 21:40 | 只看该作者
//设置选择引脚组和端口为低电平触发

        Chip_GPIOGP_SelectLowLevel(LPC_GINT, 0, BUTTON3_PORT, 1UL << BUTTON3_PIN);

        //启用选择引脚组中断

        Chip_GPIOGP_EnableGroupPins(LPC_GINT, 0, BUTTON3_PORT, 1UL << BUTTON3_PIN);



        /* Button 2 Setup for falling edge*/

        //设置选择引脚组和端口为低电平触发

        Chip_GPIOGP_SelectLowLevel(LPC_GINT, 0, BUTTON4_PORT, 1UL << BUTTON4_PIN);

        //启用选择引脚组中断

        Chip_GPIOGP_EnableGroupPins(LPC_GINT, 0, BUTTON4_PORT, 1UL << BUTTON4_PIN);

        /* Trigger interrupt when both buttons are pressed */

        //触发选定的GPIO组功能上的所有匹配引脚组(AND模式)

        Chip_GPIOGP_SelectOrMode(LPC_GINT, 0);   //And

        //触发选定的GPIO组的功能在组(或模式)的引脚

        //选择GPIO功能组边沿触发模式

        Chip_GPIOGP_SelectEdgeMode(LPC_GINT, 0);



        /* Enable Group GPIO interrupt 0 */

        NVIC_EnableIRQ(GINT0_IRQn);

}
注意这里要求4个按键,有一个按下就触发中断,所以这里选择AND模式

使用特权

评论回复
地板
Messi1999|  楼主 | 2016-1-15 21:41 | 只看该作者
三、GINT中断响应
/*****************************************************************************

*

*GINT中断

*****************************************************************************/



void GINT0_IRQHandler(void)

{

        uint32_t value=0;

        uint32_t keyvalue=0;

      

      

        //选定组清除中断挂起状态

        Chip_GPIOGP_ClearIntStatus(LPC_GINT, 0);

        if (buttonDebounce == 1)

        {

                buttonDebounce = 2;

                 //开启定时器,定时中断关闭定时器 ,延时去抖

                Init_Rit();

                //获取端口状态值

                value=Chip_GPIO_GetPortValue(LPC_GPIO, 0);

               

                keyvalue = value & ((1<<BUTTON1_PIN) | (1<<BUTTON2_PIN) |(1<<BUTTON3_PIN) |(1<<BUTTON4_PIN));

      

                if((keyvalue & (1<<BUTTON1_PIN))==0)

                {gkeyvalue = 1;}

                else if((keyvalue & (1<<BUTTON2_PIN))==0)

                {gkeyvalue = 2;}

                else if((keyvalue & (1<<BUTTON3_PIN))==0)      

                {gkeyvalue = 3;}

                else if((keyvalue & (1<<BUTTON4_PIN))==0)         

                {gkeyvalue = 4;}

                else

                {gkeyvalue = 0;}

        }

         

      

        //Board_LED_Toggle(0);

}

使用特权

评论回复
5
Messi1999|  楼主 | 2016-1-15 21:42 | 只看该作者
四、定时器初始化


重复中断定时器(RIT)

250ms按键去抖,GINT触发
*******************************************************************/

void Init_Rit(void)

{



        /* Initialize RI Timer */

        Chip_RIT_Init(LPC_RITIMER);



        /* Setup timer period to 10Hz (100mS) */

        Chip_RIT_SetTimerInterval64(LPC_RITIMER, 250);//250ms

        /* Enable RI Timer */

        NVIC_EnableIRQ(RIT_IRQn);



        /* Enable RI Timer and clear on compare match or ....

           use Chip_RIT_EnableCTRL(LPC_RITIMER, RIT_CTRL_ENCLR | RIT_CTRL_TEN);

           to save space. */

        Chip_RIT_Enable(LPC_RITIMER);

        Chip_RIT_CompClearEnable(LPC_RITIMER);

}

使用特权

评论回复
6
Messi1999|  楼主 | 2016-1-15 21:43 | 只看该作者
五、RIT中断


重复中断定时器(RIT)
*******************************************************************/

void RIT_IRQHandler(void)

{

        Chip_RIT_ClearInt(LPC_RITIMER);



if (buttonDebounce == 2)

        {

                buttonDebounce = 1;



                /* Disable RI Timer */

                Chip_RIT_Disable(LPC_RITIMER);

               

                Chip_RIT_DeInit(LPC_RITIMER);

                 

                NVIC_DisableIRQ(RIT_IRQn);

        }         

}

使用特权

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

本版积分规则

36

主题

363

帖子

1

粉丝