[8/16-bit MCU] LPC54102 人机界面按键输入功能

[复制链接]
 楼主| Messi1999 发表于 2016-1-15 21:38 | 显示全部楼层 |阅读模式
目的:通过4个按键,设置基本参数!

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

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

                     RIT :定时器 (去抖延时)



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

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



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

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



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

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



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

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




 楼主| Messi1999 发表于 2016-1-15 21:38 | 显示全部楼层
二、初始化GINT
  1. /*****************************************************************************

  2. *

  3. *初始化GINT中断组

  4. *****************************************************************************/



  5. void Init_Gint(void)

  6. {

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

  8.         Chip_GPIOGP_Init(LPC_GINT);



  9.         /* Configure pins as GPIO */

  10.         Chip_IOCON_PinMuxSet(LPC_IOCON, BUTTON1_PORT, BUTTON1_PIN,

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

  12.         Chip_IOCON_PinMuxSet(LPC_IOCON, BUTTON2_PORT, BUTTON2_PIN,

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

  14.         Chip_IOCON_PinMuxSet(LPC_IOCON, BUTTON3_PORT, BUTTON3_PIN,

  15.                                                                                         (IOCON_FUNC0 | IOCON_DIGITAL_EN  | IOCON_MODE_PULLUP ));

  16.         Chip_IOCON_PinMuxSet(LPC_IOCON, BUTTON4_PORT, BUTTON4_PIN,

  17.                                                                                         (IOCON_FUNC0 | IOCON_DIGITAL_EN  | IOCON_MODE_PULLUP));

  18.       

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

  20.         Chip_GPIO_SetPinDIRInput(LPC_GPIO, BUTTON1_PORT, BUTTON1_PIN);

  21.         Chip_GPIO_SetPinDIRInput(LPC_GPIO, BUTTON2_PORT, BUTTON2_PIN);

  22.   Chip_GPIO_SetPinDIRInput(LPC_GPIO, BUTTON3_PORT, BUTTON3_PIN);

  23.         Chip_GPIO_SetPinDIRInput(LPC_GPIO, BUTTON4_PORT, BUTTON4_PIN);

  24.       

  25.         /* Button 1 Setup for falling edge*/

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

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

  28.         //启用选择引脚组中断

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



  30.         /* Button 2 Setup for falling edge*/

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

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

  33.         //启用选择引脚组中断

  34.         Chip_GPIOGP_EnableGroupPins(LPC_GINT, 0, BUTTON2_PORT, 1UL << BUTTON2_PIN);
 楼主| Messi1999 发表于 2016-1-15 21:40 | 显示全部楼层
  1. //设置选择引脚组和端口为低电平触发

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

  3.         //启用选择引脚组中断

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



  5.         /* Button 2 Setup for falling edge*/

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

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

  8.         //启用选择引脚组中断

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

  10.         /* Trigger interrupt when both buttons are pressed */

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

  12.         Chip_GPIOGP_SelectOrMode(LPC_GINT, 0);   //And

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

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

  15.         Chip_GPIOGP_SelectEdgeMode(LPC_GINT, 0);



  16.         /* Enable Group GPIO interrupt 0 */

  17.         NVIC_EnableIRQ(GINT0_IRQn);

  18. }
注意这里要求4个按键,有一个按下就触发中断,所以这里选择AND模式
 楼主| Messi1999 发表于 2016-1-15 21:41 | 显示全部楼层
三、GINT中断响应
  1. /*****************************************************************************

  2. *

  3. *GINT中断

  4. *****************************************************************************/



  5. void GINT0_IRQHandler(void)

  6. {

  7.         uint32_t value=0;

  8.         uint32_t keyvalue=0;

  9.       

  10.       

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

  12.         Chip_GPIOGP_ClearIntStatus(LPC_GINT, 0);

  13.         if (buttonDebounce == 1)

  14.         {

  15.                 buttonDebounce = 2;

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

  17.                 Init_Rit();

  18.                 //获取端口状态值

  19.                 value=Chip_GPIO_GetPortValue(LPC_GPIO, 0);

  20.                

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

  22.       

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

  24.                 {gkeyvalue = 1;}

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

  26.                 {gkeyvalue = 2;}

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

  28.                 {gkeyvalue = 3;}

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

  30.                 {gkeyvalue = 4;}

  31.                 else

  32.                 {gkeyvalue = 0;}

  33.         }

  34.          

  35.       

  36.         //Board_LED_Toggle(0);

  37. }
 楼主| Messi1999 发表于 2016-1-15 21:42 | 显示全部楼层
四、定时器初始化


重复中断定时器(RIT)

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

  2. void Init_Rit(void)

  3. {



  4.         /* Initialize RI Timer */

  5.         Chip_RIT_Init(LPC_RITIMER);



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

  7.         Chip_RIT_SetTimerInterval64(LPC_RITIMER, 250);//250ms

  8.         /* Enable RI Timer */

  9.         NVIC_EnableIRQ(RIT_IRQn);



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

  11.            use Chip_RIT_EnableCTRL(LPC_RITIMER, RIT_CTRL_ENCLR | RIT_CTRL_TEN);

  12.            to save space. */

  13.         Chip_RIT_Enable(LPC_RITIMER);

  14.         Chip_RIT_CompClearEnable(LPC_RITIMER);

  15. }

 楼主| Messi1999 发表于 2016-1-15 21:43 | 显示全部楼层
五、RIT中断


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

  2. void RIT_IRQHandler(void)

  3. {

  4.         Chip_RIT_ClearInt(LPC_RITIMER);



  5. if (buttonDebounce == 2)

  6.         {

  7.                 buttonDebounce = 1;



  8.                 /* Disable RI Timer */

  9.                 Chip_RIT_Disable(LPC_RITIMER);

  10.                

  11.                 Chip_RIT_DeInit(LPC_RITIMER);

  12.                  

  13.                 NVIC_DisableIRQ(RIT_IRQn);

  14.         }         

  15. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

363

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

36

主题

363

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部