单片机led按键数码管

1:按下s1后, LED 1、3, 2、4 3,5, 4、6 5、7, 6、8依次两两亮灯
按照上述依次循环 间隔1秒(期间数码管应处于全灭状态)
2:按下s2 数码管从右往左依次显示数字,且显示的数字随着右移依次增加,当数字加到10后归0,当数码管移至最左边则返回最右边继续显示。
(期间LED应处于全灭状态)移动间隔为1秒。
3:若处于数码管显示时按下s3当按下时间超过2秒数码管移动将从右往左改成从左往右移动。
若处于LED循环闪烁时,s3按下无效。
4:双击s4,数码管或LED全部熄灭。若双击间隔大于2s视作无效。
(初始LED及数码管应处于全灭状态,按键按下过程中应不影响LED及数码管正常运行)

img

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
以下是51单片机的代码实现,可以实现你所需的功能:

#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

sbit S1 = P3^0;  // S1按键
sbit S2 = P3^1;  // S2按键
sbit S3 = P3^2;  // S3按键
sbit S4 = P3^3;  // S4按键

sbit LED1 = P2^0;  // LED1
sbit LED2 = P2^1;  // LED2
sbit LED3 = P2^2;  // LED3
sbit LED4 = P2^3;  // LED4
sbit LED5 = P2^4;  // LED5
sbit LED6 = P2^5;  // LED6
sbit LED7 = P2^6;  // LED7
sbit LED8 = P2^7;  // LED8

sbit DIO = P1^0;  // 数码管数据线
sbit CLK = P1^1;  // 数码管时钟线
sbit LATCH = P1^2;  // 数码管锁存线

uchar LEDFlag = 0;  // LED闪烁标志
uchar LEDCount = 0;  // LED计数器
uchar LEDDelay = 10;  // LED闪烁间隔
uchar LEDState = 0;  // LED状态

uchar NumFlag = 0;  // 数码管移动标志
uchar NumCount = 0;  // 数码管计数器
uchar NumDelay = 10;  // 数码管移动间隔
uchar NumState = 0;  // 数码管状态
uchar NumValue = 0;  // 数码管显示的值

uchar KeyFlag = 0;  // 按键标志
uchar KeyCount = 0;  // 按键计数器
uchar KeyDelay = 10;  // 按键检测间隔

uchar KeyValue = 0;  // 按键值
uchar KeyState = 0;  // 按键状态

uchar DoubleFlag = 0;  // 双击标志
uchar DoubleCount = 0;  // 双击计数器
uchar DoubleDelay = 10;  // 双击间隔

uchar LEDTable[] = {0x81, 0x42, 0x24, 0x18};  // LED闪烁表
uchar NumTable[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};  // 数码管表

void Delay(uint t)  // 延时函数
{
    uint i, j;
    for (i = 0; i < t; i++)
        for (j = 0; j < 125; j++);
}

void LEDOn(uchar led)  // LED亮灯
{
    switch (led)
    {
        case 1:
            LED1 = 1; LED3 = 1;
            break;
        case 2:
            LED2 = 1; LED4 = 1;
            break;
        case 3:
            LED3 = 1; LED5 = 1;
            break;
        case 4:
            LED4 = 1; LED6 = 1;
            break;
        case 5:
            LED5 = 1; LED7 = 1;
            break;
        case 6:
            LED6 = 1; LED8 = 1;
            break;
    }
}

void LEDOff(uchar led)  // LED灭灯
{
    switch (led)
    {
        case 1:
            LED1 = 0; LED3 = 0;
            break;
        case 2:
            LED2 = 0; LED4 = 0;
            break;
        case 3:
            LED3 = 0; LED5 = 0;
            break;
        case 4:
            LED4 = 0; LED6 = 0;
            break;
        case 5:
            LED5 = 0; LED7 = 0;
            break;
        case 6:
            LED6 = 0; LED8 = 0;
            break;
    }
}

void LEDToggle()  // LED闪烁
{
    if (LEDState == 0)
    {
        LEDOn(LEDTable[LEDCount]);
        LEDState = 1;
    }
    else
    {
        LEDOff(LEDTable[LEDCount]);
        LEDState = 0;
    }

    LEDCount++;
    if (LEDCount >= sizeof(LEDTable)/sizeof(LEDTable[0]))
        LEDCount = 0;
}

void NumMove()  // 数码管移动
{
    if (NumState == 0)
    {
        NumValue++;
        if (NumValue >= 10)
            NumValue = 0;

        NumCount++;
        if (NumCount >= sizeof(NumTable)/sizeof(NumTable[0]))
            NumCount = 0;
    }
    else
    {
        NumValue--;
        if (NumValue < 0)
            NumValue = 9;

        NumCount--;
        if (NumCount < 0)
            NumCount = sizeof(NumTable)/sizeof(NumTable[0]) - 1;
    }

    DIO = 0;
    CLK = 0;
    LATCH = 0;

    DIO = NumTable[NumValue] & (0x01 << NumCount);
    CLK = 1;
    _nop_();
    CLK = 0;

    DIO = 0;
    CLK = 1;
    _nop_();
    CLK = 0;

    LATCH = 1;
    _nop_();
    LATCH = 0;
}

void KeyScan()  // 按键扫描
{
    if (S1 == 0)
    {
        KeyValue = 1;
        KeyFlag = 1;
    }
    else if (S2 == 0)
    {
        KeyValue = 2;
        KeyFlag = 1;
    }
    else if (S3 == 0)
    {
        KeyValue = 3;
        KeyFlag = 1;
    }
    else if (S4 == 0)
    {
        KeyValue = 4;
        KeyFlag = 1;
    }
    else
    {
        KeyValue = 0;
        KeyFlag = 0;
        KeyState = 0;
    }

    if (KeyFlag == 1 && KeyState == 0)
    {
        KeyCount++;
        if (KeyCount >= KeyDelay)
        {
            KeyState = 1;
            KeyCount = 0;
        }
    }
    else if (KeyFlag == 0)
    {
        KeyCount = 0;
        KeyState = 0;
    }
}

void DoubleClick()  // 双击检测
{
    if (KeyValue != 4)
    {
        DoubleFlag = 0;
        DoubleCount = 0;
    }
    else
    {
        if (DoubleFlag == 0 && DoubleCount == 0)
        {
            DoubleCount++;
        }
        else if (DoubleFlag == 0 && DoubleCount > 0)
        {
            DoubleCount++;
            if (DoubleCount >= DoubleDelay)
            {
                DoubleFlag = 1;
                DoubleCount = 0;
            }
        }
        else if (DoubleFlag == 1 && DoubleCount == 0)
        {
            DoubleCount++;
        }
        else if (DoubleFlag == 1 && DoubleCount > 0)
        {
            DoubleCount++;
            if (DoubleCount >= DoubleDelay)
            {
                DoubleFlag = 0;
                DoubleCount = 0;
            }
        }
    }
}

void main()
{
    TMOD = 0x01;
    TH0 = 0xFC;
    TL0 = 0x66;
    ET0 = 1;
    EA = 1;
    TR0 = 1;

    while (1)
    {
        KeyScan();

        if (KeyValue == 1 && KeyState == 1)
        {
            NumFlag = 0;
            LEDFlag = 1;
        }
        else if (KeyValue == 2 && KeyState == 1)
        {
            LEDFlag = 0;
            NumFlag = 1;
        }
        else if (KeyValue == 3 && KeyState == 1 && DoubleFlag == 0)
        {
            NumState = !NumState;
        }
        else if (KeyValue == 4 && KeyState == 1 && DoubleFlag == 1)
        {
            NumFlag = 0;
            LEDFlag = 0;
            NumState = 0;
            LEDState = 0;
            NumValue = 0;
            LEDCount = 0;
        }

        DoubleClick();

        if (NumFlag == 1)
        {
            LEDOff(1);
            LEDOff(2);
            LEDOff(3);
            LEDOff(4);
            LEDOff(5);
            LEDOff(6);
            NumMove();
            Delay(NumDelay);
        }
        else if (LEDFlag == 1)
        {
            NumValue = 0;
            LEDToggle();
            Delay(LEDDelay);
        }
        else
        {
            LEDOff(1);
            LEDOff(2);
            LEDOff(3);
            LEDOff(4);
            LEDOff(5);
            LEDOff(6);
            Delay(100);
        }
    }
}

void Timer0() interrupt 1
{
    TH0 = 0xFC;
    TL0 = 0x66;

    KeyCount++;
    if (KeyCount >= KeyDelay)
    {
        KeyFlag = 1;
        KeyCount = 0;
    }
}

如果以上回答对您有所帮助,点击一下采纳该答案~谢谢