interrupt

interrupt test

hardware

code

/************************
external interrupt test (triggered by LOW)
give P3.2 LOW signal, make LED 4/4 reserve status

connect P3.2 - right lower corner pin
*************************/
#include <reg52.h>

void delay(unsigned int xms)
{
    unsigned int i,j;
    for (i = xms; i > 0; i--)
        for(j = 112; j < 0; j--);
}

void main()
{
    P1 = 0x0f; // 0000 1111 turn on 4 leds & turn off 4 leds
    EX0 = 1; // INT0 interrupt allow
    EA = 1; // global interrupt open
    IT0 = 0; // emit LOW
    while(1);
}

void low() interrupt 0
{
    P1 = ~ P1;
    delay(200);
}
/************************
external interrupt test (down triggered by LOW)

connect P3.3 - P3.6
*************************/
#include <reg52.h>

void main()
{
    P1 = 0x0f; // 0000 1111 turn on 4 leds & turn off 4 leds
    EX0 = 1; // INT0 interrupt allow
    EA = 1; // global interrupt open
    IT0 = 1; // down trigger
    while(1);
}

void jump_low() interrupt 2
{
    P1 = ~ P1;
}

Interrupt control LED display

led

/**
 * 采用外部中断控制的条形LED彩灯设计
 * hardware: STC89C51RC
 * crystal: 12.0HMz
 */
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

uchar a;

void delayms(uint ms)
{
    uint i;
    while (ms--)
    {
        for (i=0;i<120;i++);
    }
}

void LED1(void) // 左移花样
{
    uchar i,j;
    j = 0x01;
    for (i=0;i<8;i++)
    {
        P0=~j;
        delayms(250);
        j=j<<1;
    }
}
void LED2(void) // 右移花样
{
    uchar i,j;
    j = 0x80;
    for (i=0;i<8;i++)
    {
        P0=~j;
        delayms(250);
        j=j>>1;
    }
}
void LED3(void) // 拉幕式与闭幕式花样
{
    uchar i,j,k,LED;
    j = 0x10;
    k = 0x08;
    for (i=0;i<4;i++)
    {
        LED=j|k;
        P0=~LED;
        delayms(250);
        j = _crol_(j, 1);
        k = _cror_(k, 1);
    }
    LED = 0xFF;
    P0 = ~LED;
    delayms(250);
    j = 0x80;
    k = 0x01;
    for (i=0;i<4;i++)
    {
        LED = j|k;
        P0 = LED;
        delayms(250);
        j = _cror_(j, 1) + 0x80;
        k = _crol_(k, 1) + 0x01;
    }
}

void int_1() interrupt 2
{
    delayms(100);
    if (INT1 == 0)
    {
        a++;
        if (a > 3)
        {
            a = 1;
        }
    }
}
void INT1_init(void)
{
    EX1 = 1;
    IT1 = 1;
    EA = 1;
}
void main(void)
{
    INT1_init();
    a = 1;
    while(1)
    {
        switch(a)
        {
            case 1: LED1();break;
            case 2: LED2();break;
            case 3: LED3();break;
        }
    }
}

Page Source