docs

a slatepencil documentail site

View on GitHub

Power management

STC89xx SFR PCON

/*------------------------------------------------------------------*/
/* --- STC MCU International Limited -------------------------------*/
/* --- STC89xx Series MCU wake up Power-Down mode Demo -------------*/
/*------------------------------------------------------------------*/
#include <reg51.h>
#include <intrins.h>

sbit        Begin_LED = P1^2;                   //Begin-LED indicator indicates system start-up
unsigned char Is_Power_Down             = 0;    //Set this bit before go into Power-down mode
sbit        Is_Power_Down_LED_INT0      = P1^7; //Power-Down wake-up LED indicator on INT0
sbit        Not_Power_Down_LED_INT0     = P1^6; //Not  Power-Down wake-up LED indicator on INT0
sbit        Is_Power_Down_LED_INT1      = P1^5; //Power-Down wake-up LED indicator on INT1
sbit        Not_Power_Down_LED_INT1     = P1^4; //Not  Power-Down wake-up LED indicator on INT1
sbit        Power_Down_Wakeup_Pin_INT0  = P3^2; //Power-Down wake-up pin on INT0
sbit        Power_Down_Wakeup_Pin_INT1  = P3^3; //Power-Down wake-up pin on INT1
sbit        Normal_Work_Flashing_LED    = P1^3; //Normal work LED indicator

void  Normal_Work_Flashing (void);
void  INT_System_init (void);
void  INT0_Routine (void);
void  INT1_Routine (void);
void main (void)
{
  unsigned char j = 0;
  unsigned char wakeup_counter = 0;
                        //clear interrupt wakeup counter variable wakeup_counter
  Begin_LED = 0;        //system start-up LED
  INT_System_init();    //Interrupt system initialization
  while(1)
  {
    P2 = wakeup_counter;
    wakeup_counter++;
    for(j=0; j<2; j++)
    {
      Normal_Work_Flashing( ); //System normal work
    }
    Is_Power_Down = 1;  //Set this bit before go into Power-down mode
    PCON = 0x02;  //after this instruction, MCU will be in power-down mode, external clock stop
    _nop_( );
    _nop_( );
    _nop_( );
    _nop_( );
  }
}

void  INT_System_init (void)
{
  IT0  = 0;   /* External interrupt 0, low electrical level triggered */
// IT0 = 1;   /* External interrupt 0, negative edge triggered */
  EX0  = 1;   /* Enable external interrupt 0 */
  IT1 = 0;    /* External interrupt 1, low electrical level triggered */
// IT1 = 1;   /* External interrupt 1, negative edge triggered */
  EX1  = 1;   /* Enable external interrupt 1 */
  EA = 1;     /* Set Global Enable bit */
}

void  INT0_Routine (void) interrupt 0
{
  if (Is_Power_Down)
  {
    //Is_Power_Down ==1; /* Power-Down wakeup on INT0 */
    Is_Power_Down = 0;
    Is_Power_Down_LED_INT0 = 0;     /*open external interrupt 0 Power-Down wake-up LED indicator */
    while (Power_Down_Wakeup_Pin_INT0 == 0)
    {
      /* wait higher */
    }
    Is_Power_Down_LED_INT0 = 1;     /* close external interrupt 0 Power-Down wake-up LED indicator */
  }
  else
  {
    Not_Power_Down_LED_INT0 = 0;    /* open external interrupt 0 normal work LED */
    while (Power_Down_Wakeup_Pin_INT0 ==0)
    {
      /* wait higher */
    }
    Not_Power_Down_LED_INT0 = 1;    /* close external interrupt 0 normal work LED */
  }
}
void  INT1_Routine (void)   interrupt 2
{
  if (Is_Power_Down)
  {
    //Is_Power_Down ==1;  /* Power-Down wakeup on INT1 */
    Is_Power_Down = 0;
    Is_Power_Down_LED_INT1= 0; /*open external interrupt 1 Power-Down wake-up LED indicator */
    while (Power_Down_Wakeup_Pin_INT1 == 0)
    {
      /* wait higher */
    }
    Is_Power_Down_LED_INT1 = 1; /* close external interrupt 1 Power-Down wake-up LED indicator */
  }
  else
  {
    Not_Power_Down_LED_INT1 = 0; /* open external interrupt 1 normal work LED */
    while (Power_Down_Wakeup_Pin_INT1 ==0)
    {
      /* wait higher */
    }
    Not_Power_Down_LED_INT1 = 1; /* close external interrupt 1 normal work LED */
  }
}

void  delay (void)
{
  unsigned int j = 0x00;
  unsigned int k = 0x00;
  for (k=0; k<2; ++k)
  {
    for (j=0; j<=30000; ++j)
    {
      _nop_( );
      _nop_( );
      _nop_( );
      _nop_( );
      _nop_( );
      _nop_( );
      _nop_( );
      _nop_( );
    }
  }
}
void Normal_Work_Flashing (void)
{
  Normal_Work_Flashing_LED = 0;
  delay ( );
  Normal_Work_Flashing_LED = 1;
  delay ( );
}