51单片机-利用定时器控制LED灯轮闪

发布时间 2023-07-20 10:13:11作者: 风中狂笑
#include "reg52.h"
// #include "delay.h"
#include "intrins.h"
#include <stdio.h>
typedef unsigned int u16;
typedef unsigned char u8;
typedef unsigned int uint;
typedef unsigned char uchar;
#define LED_PORT P2
#define SMG_A_DP_PORT P0
#define SMG_PORT P0
sbit LSA = P2 ^ 2;
sbit LSB = P2 ^ 3;
sbit LSC = P2 ^ 4;
u8 gsmg_code[17] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
                    0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};

sbit LED1 = P2 ^ 0;
sbit LED2 = P2 ^ 1;
sbit LED3 = P2 ^ 2;
sbit LED4 = P2 ^ 3;
sbit LED5 = P2 ^ 4;
sbit LED6 = P2 ^ 5;
sbit LED7 = P2 ^ 6;
sbit LED8 = P2 ^ 7;
sbit KEY1 = P3 ^ 1;
sbit KEY2 = P3 ^ 0;
sbit KEY3 = P3 ^ 2;
sbit KEY4 = P3 ^ 3;

unsigned int num = 921;
unsigned int time = 0;

// #define KEY1_PRESS 1
// #define KEY2_PRESS 2
// #define KEY3_PRESS 3
// #define KEY4_PRESS 4
// #define KEY_NO_PRESS 0

// unsigned char key_scan(unsigned char mode)
// {
//     static unsigned char key = 1;
//     if (mode)
//     {
//         key = 1;
//     }
//     if (key == 1 && (KEY1 == 0 || KEY2 == 0 || KEY3 == 0 || KEY4 == 0))
//     {
//         delayms(10);
//         key = 0;
//         if (KEY1 == 0)
//         {
//             return KEY1_PRESS;
//         }
//         else if (KEY2 == 0)
//         {
//             return KEY2_PRESS;
//         }
//         else if (KEY3 == 0)
//         {
//             return KEY3_PRESS;
//         }
//         else if (KEY4 == 0)
//         {
//             return KEY4_PRESS;
//         }
//     }
//     else if (KEY1 == 1 && KEY2 == 1 && KEY3 == 1 && KEY4 == 1)
//     {
//         key = 1;
//     }
//     return KEY_NO_PRESS;
// }

// void main2()
// {
//     unsigned char key = 0;
//     while (1)
//     {
//         key = key_scan(0);
//         if (key == KEY1_PRESS)
//         {
//             LED1 = !LED1;
//         }
//     }
// }

void time0_init(void)
{
    // timer
    TMOD = 0x01;               // TMOD=0000 0001B;
    TH0 = (65536 - num) / 256; // if num is 921 then 1ms
    TL0 = (65536 - num) % 256;
    TR0 = 1;
    // interrupt
    //  ET0 = 1;
    //  EA = 1;
}

// void delay10us(u16 ten_us)
// {
//     while (ten_us--)
//     {
//         _nop_();
//         _nop_();
//         _nop_();
//         _nop_();
//         _nop_();
//         _nop_();
//     }
// }
void exit0_init(void) // interrupt 0
{
    IT0 = 1; // 0 is dianping 1 is xiajiangyan
    EX0 = 1;
    EA = 1;
}
void exit1_init(void) // interrupt 1
{
    IT1 = 1; // 0 is dianping 1 is xiajiangyan
    EX1 = 1;
    EA = 1;
}

void main()
{
    time0_init();
    // exit0_init();
    // exit1_init();
    while (1)
    {
        if (time == 0)
        {
            LED1 = 0;
            LED3 = 0;
            LED5 = 0;
            LED7 = 0;
        }
        while (TF0 == 0)
            ;
        TF0 = 0;
        time++;
        if (time == 1000)
        {
            LED1 = !LED1;
            LED3 = !LED3;
            LED5 = !LED5;
            LED7 = !LED7;
            LED2 = !LED2;
            LED4 = !LED4;
            LED6 = !LED6;
            LED8 = !LED8;
        }
        if (time == 2000)
        {
            LED1 = !LED1;
            LED3 = !LED3;
            LED5 = !LED5;
            LED7 = !LED7;
            LED2 = !LED2;
            LED4 = !LED4;
            LED6 = !LED6;
            LED8 = !LED8;
            time = 0;
        }
        TH0 = (65536 - num) / 256;
        TL0 = (65536 - num) % 256;
    }
}

void delay2ms(u16 xms)
{
    while (xms--)
        ;
}

void exi0() interrupt 0
{
    delay2ms(1000);
    if (KEY3 == 0)
    {
        LED1 = !LED1;
    }
}

void exi1() interrupt 2
{
    delay2ms(1000);
    if (KEY4 == 0)
    {
        LED2 = !LED2;
    }
}
void time0() interrupt 1
{
    static u16 i = 0;
    TH0 = 0xfc;
    TL0 = 0x18;
    if (i == 0)
    {
        LED1 = 0;
        LED3 = 0;
        LED5 = 0;
        LED7 = 0;
    }
    i++;
    if (i == 2000)
    {
        i = 0;
        LED1 = !LED1;
        LED3 = !LED3;
        LED5 = !LED5;
        LED7 = !LED7;
        LED2 = !LED2;
        LED4 = !LED4;
        LED6 = !LED6;
        LED8 = !LED8;
    }
    else if (i == 1000)
    {
        LED1 = !LED1;
        LED3 = !LED3;
        LED5 = !LED5;
        LED7 = !LED7;
        LED2 = !LED2;
        LED4 = !LED4;
        LED6 = !LED6;
        LED8 = !LED8;
    }
}