⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 button_service.c

📁 一个简单的小型操作系统
💻 C
字号:
 
/*****************************************************************************
 *
 * Module       : button_service.c
 * Description  : services a button interrupt
 * OS           : SLOS 0.09
 * Platform     : e7t
 * History      :
 *
 * December 7th 2001 Andrew N. Sloss
 * - created a button event example
 *
 * Note         :
 *
 * The eventButtonInit() has to be called before a button can be
 * called. This is achieved in the cinit.c 0latform_events%  
 *
 *****************************************************************************/

/*****************************************************************************
 * IMPORTS
 *****************************************************************************/

#include "../../headers/api_types.h"
#include "../../devices/ddf_io.h"
#include "../devices/ddf_types.h"

#include "../devices/led_driver.h"

#include "swis.h"
#include "../../headers/api_device.h"

#include "../headers/macros.h"

extern unsigned int STATE;

/*****************************************************************************
 * STATICS
 *****************************************************************************/

device_treestr *ledNode;
UID ledUID;

/*****************************************************************************
 * MACROS
 *****************************************************************************/

/* none... */

/*****************************************************************************
 * IMPORTS
 *****************************************************************************/

void eventButtonMaskIrq(unsigned irq) 
{
/* -----------------------------------------------------------
 *
 * Turn interrupt source off.
 *
 * -----------------------------------------------------------
 */
*(volatile int*)INTMSK |= (1<<irq);
}

void eventButtonUnmaskIrq(unsigned irq1,unsigned irq2) 
{

/* -----------------------------------------------------------
 *
 * Force global disable OFF. Turn interrupt source on.
 *
 * -----------------------------------------------------------
 */

*(volatile int*)INTMSK &= ~((1<<INT_GLOBAL)|(1<<irq1)|(1<<irq2));   
}

/* -- eventButtonInit ---------------------------------------------------
 *                                                            
 * Description  :  Initialises the button interrupt
 *
 * Parameters   : none...   
 * Return       : none...
 * Notes        : none...
 *                                                                             
 */

void eventButtonInit(void)
{	
/* -----------------------------------------------------------
 *
 * Bitwise OR incase an existing set of Interrupts have been 
 * set by a debug monitor
 *
 * -----------------------------------------------------------
 

eventButtonUnmaskIrq (10,0);	

 * -----------------------------------------------------------
 *
 * Enable INT0 set as Active high and allows Rising Edge.
 * 
 * -----------------------------------------------------------
 

*(volatile unsigned *)IOPCON 	= IO_ENABLE_INT0; 
*(volatile unsigned *)IOPCON	|= IO_ACTIVE_HIGH_INT0; 
*(volatile unsigned *)IOPCON	|= IO_RISING_EDGE_INT0;	

*/

 *(volatile int*)INTMSK &= ~((1 << INT_GLOBAL) | (1<<10) | (1<<0));

 *(volatile unsigned *)IOPCON   |= IO_ENABLE_INT0;       /* enable int0 */
 *(volatile unsigned *)IOPCON   |= IO_ACTIVE_HIGH_INT0;  /* active high */
 *(volatile unsigned *)IOPCON   |= IO_RISING_EDGE_INT0;  /* RISING EDGE */

/* -----------------------------------------------------------
 *
 * Open LED 1 Device
 * 
 * -----------------------------------------------------------
 */

ledNode = eventIODeviceOpen(&ledUID,DEVICE_LED_E7T,GREEN1);

}

/* -- eventButtonPressed ------------------------------------------------------
 *
 * Description  : services button interrupt button by toggling LED1
 *
 * Parameters   : none...
 * Return       : none...
 * Notes        : none...
 *
 */

void eventButtonPressed(void)
{
BYTE LED1;

/* -----------------------------------------------------------
 * 
 * Obtain the current status of LED 1
 *
 * -----------------------------------------------------------
 */

STATE = 1; // turn off interrupts

LED1 = eventIODeviceReadBit (ledNode,ledUID);

  if (LED1==1) 
  {
  /* -------------------------------------------
   *
   * Switch LED1 OFF
   * 
   * -------------------------------------------
   */

  eventIODeviceWriteBit (ledNode,ledUID,0); 
  }
  else 
  {
  /* -------------------------------------------
   *
   * Switch LED1 ON
   * 
   * -------------------------------------------
   */

  eventIODeviceWriteBit (ledNode,ledUID,1);
  }

  STATE = 2; /* turn on interrupts */
}

/* -- eventButtonService -----------------------------------------------------
 *
 * Description  : handles the button press interrupt...
 *
 * Parameters   : none...
 * Return       : none...
 * Notes        : none...
 *
 */ 

void eventButtonService(void) 
{

/* --------------------------------------------
 *
 * Reset interrupt source
 *
 * --------------------------------------------
 */

*(volatile unsigned *) INTPND &= INT_SW3_MASK;

/* --------------------------------------------
 *
 * Service Button Interrupt
 *
 * --------------------------------------------
 */

eventButtonPressed();		/* Call toggle LED's... */	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -