main.c

来自「8051试验程序 基础教材」· C语言 代码 · 共 258 行

C
258
字号
#include <ioXC866.h>

#include "simpleEventHandler.h"
#include "vssrc/BlinkSEMLibB.h"
#include "vssrc/Blink.h"
#include "vssrc/BlinkAction.h"
#include "vssrc/BlinkData.h"

#define   IO_vWritePort(PortName, Data) PortName##_DATA = Data  // Macro to set LED
#define   SFR_PAGE(pg,op) pg+op                                 // Macro to set SFR Page

#define   _pp0 PORT_PAGE=0  // PORT_PAGE postfix
#define   _pp1 PORT_PAGE=1  // PORT_PAGE postfix
#define   _pp2 PORT_PAGE=2  // PORT_PAGE postfix
#define   _pp3 PORT_PAGE=3  // PORT_PAGE postfix
#define   noSST 0x00        // Switch page without saving



/** IO Init */
void IO_Init(void) {

  SFR_PAGE(_pp1, noSST);         // Switch to page 1
  P1_PUDSEL     =  0xBF;         // Load pullup/pulldown select register
  P1_PUDEN      =  0x00;         // Load pullup/pulldown enable register

  SFR_PAGE(_pp0, noSST);         // Switch to page 0
  P1_DIR        =  0xFF;         // Load direction register

}


/** Main Init */
void MAIN_vInit(void)
{

  IO_Init();                    //  Initialization of module 'GPIO'

  /* Interrupt Priority */
  IP            =  0x00;        // Load Interrupt Priority Register
  IPH           =  0x00;        // Load Interrupt Priority High Register
  IP1           =  0x00;        // Load Interrupt Priority 1 Register
  IPH1          =  0x00;        // Load Interrupt Priority 1 High Register

  IEN0_bit.EA   =  1;		// Globally enable interrupts
}


/**
  Timer 2 Init
  Enable timer 2 interrupts.
*/
void T2_vInit(void) {

  IEN0_bit.ET2         = 1;    // Enable Timer 0 Interrupt
  T2_T2CON_bit.TR2     = 1;    // Run Timer 2
  T2_T2CON_bit.TF2     = 0;    // Reset Interrupt Flag

  T2_T2MOD_bit.T2PRE0  = 1;    // Enable Prescaler
  T2_T2MOD_bit.T2PRE0  = 1;    // Enable Prescaler
  T2_T2MOD_bit.T2PRE0  = 1;    // Enable Prescaler
  T2_T2MOD_bit.PREN    = 0;    // Enable Prescaler

  T2_T2MOD_bit.DCEN    = 1;    // Set counter mode
  T2_T2CON_bit.EXEN2   = 1;    // Set counter mode

}


/**
  Enable External 2 Interrupt
*/
void EXT2_vInit(void) {
  IEN1_bit.EX2         = 1;    // Enable External 2 Interrupt
  IRCON0_bit.EXINT2    = 0;    // Reset Interrupt Flag
  EXICON0_bit.EXINT20  = 1;    // External Interrupt 2 Trigger Select
  EXICON0_bit.EXINT21  = 0;    // External Interrupt 2 Trigger Select
}


/**
  Enable External 4 Interrupt
*/
void EXT4_vInit(void) {
  IEN1_bit.EXM           = 1;  // Enable External 4 Interrupt
  IRCON0_bit.EXINT4      = 0;    // Reset Interrupt Flag
  EXICON1_bit.EXINT40    = 1;    // External Interrupt 2 Trigger Select
  EXICON1_bit.EXINT41    = 0;    // External Interrupt 2 Trigger Select
}


/**
  Handle Error
*/
void HandleError(unsigned char cc)
{

}

/**
  Init the interrupts used in this example.
  Init event queue.
  The for loop polls the event queue for Events.
*/
int main(void)
{
  MAIN_vInit();             // Main Init
  T2_vInit();               // Timer 2 Interrupt Init
  EXT2_vInit();             // External 2 Interrupt Init
  EXT4_vInit();             // External 4 Interrupt Init

  IO_vWritePort(P1, 0xFF);  // LED off.

  T2_T2L = 0xFF;            // Reset timer low
  T2_T2H = 0xFF;            // Reset timer high

  /* Define completion code variable. */
  unsigned char cc;

  /* Define action expression variable. */
  SEM_ACTION_EXPRESSION_TYPE actionExpressNo;

  /* Define even type variable*/
  SEM_EVENT_TYPE eventNo;


  /* Initialize the VS System. */
  BlinkSEM_InitAll();

  /* Initialize the VS Event queue. */
  SEQ_Initialize();


  /* Add SE_RESET to initialize system. */
  SEQ_AddEvent(SE_RESET);

  /* Do forever: */
  for(;;)
  {


    if(SEQ_RetrieveEvent(&eventNo) != UCC_QUEUE_EMPTY)
    {
      /* Deduct the event. */
      if ((cc = BlinkSEM_Deduct(eventNo)) != SES_OKAY)
        HandleError(eventNo);

      /* Get resulting action expressions and execute them. */
      while ((cc = BlinkSEM_GetOutput(&actionExpressNo)) == SES_FOUND)
        BlinkSEM_Action(actionExpressNo);

      /* Check for error. */
      if (cc != SES_OKAY)
        HandleError(cc);

      /* Change the next state vector. */
      if ((cc = BlinkSEM_NextState()) != SES_OKAY)
        HandleError(cc);
    }
  }

}


/**
  Timer 2 Interrupt.
  Every 10th timer interrupt an event is added to the event queue.
*/
#pragma vector = timer2_ext
__interrupt void interrupt_1 ()
{

  static char count = 10;

  if(count-- == 0){
    count = 10;
    SEQ_AddEvent (Timer_Interrupt);
  }

  T2_T2L = 0x00;            // Reset Timer 2 Low
  T2_T2H = 0x00;            // Reset Timer 2 High
  T2_T2CON_bit.TF2 = 0;     // Reset Interrupt
}


/**
  External 2 Interrupt
  In this case when PIN 13 is changed (port 2 bit 1).
  Adds an event to the event queue at interrupt.
*/
#pragma vector = EXINT2_int
__interrupt void interrupt_2 ()
{
  IEN0_bit.EA   =  0;

  static char firstTime = 1;

  /*
     The Interrupt is always thrown twice,
     hence the if-statement.
  */
  if(firstTime == 1) {
    firstTime--;
    SEQ_AddEvent (Pin13_Interrupt);   // Add Pin_Interrupt Event to the event queue.
    IRCON0_bit.EXINT2 = 0;            // Reset Interrupt Flag
  } else {
    firstTime = 1;
  }
  IEN0_bit.EA   =  1;
}



/**
  External 4 Interrupt
  In this case when PIN 15 is changed (port 3 bit 7).
  Adds an event to the event queue at interrupt.
*/
#pragma vector = EXINT4_int
__interrupt void interrupt_4 ()
{
   IEN0_bit.EA   =  0;
   static char firstTime1 = 1;

  /*
     The interrupt is always thrown twice,
     hence the if-statement.
  */
  if(firstTime1 == 1) {
    firstTime1 = 0;
    SEQ_AddEvent (Pin15_Interrupt);   // Add Pin_Interrupt Event to the event queue.
    IRCON0_bit.EXINT4      = 0;       // Reset Interrupt Flag
  } else {
    firstTime1 = 1;
  }
  IEN0_bit.EA   =  1;
}


/**
  Turn LED On.
*/
VS_VOID TurnOnLED(void) {

  IO_vWritePort(P1, 0x00); // LED on.

}


/**
  Turn LED Off.
*/
VS_VOID TurnOffLED(void) {

   IO_vWritePort(P1, 0xFF); // LED off.

}

⌨️ 快捷键说明

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