/*------------------------------------------------------------------*/
/* --- 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 ( );
}