以下是基于AT89C51的5个按键实现对8个LED的控制的程序:

#include <reg52.h>

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

sbit KEY1 = P3^0;
sbit KEY2 = P3^1;
sbit KEY3 = P3^2;
sbit KEY4 = P3^3;
sbit KEY5 = P3^4;

sbit D1 = P2^0;
sbit D2 = P2^1;
sbit D3 = P2^2;
sbit D4 = P2^3;

void delay(unsigned int time) //延时函数
{
    unsigned int i, j;
    for(i = 0; i < time; i++)
        for(j = 0; j < 125; j++);
}

void display(int num) //数码管显示函数
{
    switch(num)
    {
        case 1:
            D1 = 1;
            D2 = 0;
            D3 = 0;
            D4 = 0;
            break;
        case 2:
            D1 = 0;
            D2 = 1;
            D3 = 0;
            D4 = 0;
            break;
        case 3:
            D1 = 0;
            D2 = 0;
            D3 = 1;
            D4 = 0;
            break;
        case 4:
            D1 = 0;
            D2 = 0;
            D3 = 0;
            D4 = 1;
            break;
    }
}

void main()
{
    int keynum = 0;
    int flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 0, flag5 = 0; //标志位
    while(1)
    {
        if(KEY1 == 0) //1号键按下
        {
            flag1 = 1;
            flag2 = 0;
            flag3 = 0;
            flag4 = 0;
            flag5 = 0;
            LED1 = 0;
            LED2 = 0;
            LED3 = 0;
            LED4 = 0;
            LED5 = 0;
            LED6 = 0;
            LED7 = 0;
            LED8 = 0;
            keynum = 1;
        }
        if(KEY2 == 0) //2号键按下
        {
            flag1 = 0;
            flag2 = 1;
            flag3 = 0;
            flag4 = 0;
            flag5 = 0;
            for(int i = 0; i < 8; i++)
            {
                LED1 = 1;
                delay(100);
                LED2 = 1;
                delay(100);
                LED3 = 1;
                delay(100);
                LED4 = 1;
                delay(100);
                LED5 = 1;
                delay(100);
                LED6 = 1;
                delay(100);
                LED7 = 1;
                delay(100);
                LED8 = 1;
                delay(100);
            }
            keynum = 2;
        }
        if(KEY3 == 0) //3号键按下
        {
            flag1 = 0;
            flag2 = 0;
            flag3 = 1;
            flag4 = 0;
            flag5 = 0;
            LED1 = 1;
            delay(100);
            LED2 = 1;
            delay(100);
            LED3 = 1;
            delay(100);
            LED4 = 1;
            delay(100);
            LED5 = 1;
            delay(100);
            LED6 = 1;
            delay(100);
            LED7 = 1;
            delay(100);
            LED8 = 1;
            delay(100);
            LED1 = 0;
            delay(100);
            LED2 = 0;
            delay(100);
            LED3 = 0;
            delay(100);
            LED4 = 0;
            delay(100);
            LED5 = 0;
            delay(100);
            LED6 = 0;
            delay(100);
            LED7 = 0;
            delay(100);
            LED8 = 0;
            keynum = 3;
        }
        if(KEY4 == 0) //4号键按下
        {
            flag1 = 0;
            flag2 = 0;
            flag3 = 0;
            flag4 = 1;
            flag5 = 0;
            for(int i = 0; i < 8; i++)
            {
                if(i % 2 == 0) //偶数个LED点亮
                {
                    LED1 = 1;
                    LED3 = 1;
                    LED5 = 1;
                    LED7 = 1;
                    LED2 = 0;
                    LED4 = 0;
                    LED6 = 0;
                    LED8 = 0;
                }
                else //奇数个LED点亮
                {
                    LED1 = 0;
                    LED3 = 0;
                    LED5 = 0;
                    LED7 = 0;
                    LED2 = 1;
                    LED4 = 1;
                    LED6 = 1;
                    LED8 = 1;
                }
                delay(100);
            }
            keynum = 4;
        }
        if(KEY5 == 0) //5号键按下
        {
            flag1 = 0;
            flag2 = 0;
            flag3 = 0;
            flag4 = 0;
            flag5 = 1;
            LED1 = 1;
            LED2 = 1;
            LED3 = 1;
            LED4 = 1;
            LED5 = 1;
            LED6 = 1;
            LED7 = 1;
            LED8 = 1;
            delay(500);
            LED1 = 0;
            LED2 = 0;
            LED3 = 0;
            LED4 = 0;
            LED5 = 0;
            LED6 = 0;
            LED7 = 0;
            LED8 = 0;
            delay(500);
            keynum = 5;
        }
        if(flag1 == 1)
            display(1);
        if(flag2 == 1)
            display(2);
        if(flag3 == 1)
            display(3);
        if(flag4 == 1)
            display(4);
        if(flag5 == 1)
            display(5);
    }
}

其中,sbit定义了LED和按键的引脚,delay函数实现了延时,display函数实现了数码管的显示。在主函数中,通过不断检测按键的状态,实现了对8个LED的控制和数码管的显示。不同的按键对应不同的功能,flag1~flag5是标志位,用于记录当前按下的是哪个按键。当flag1~flag5中有一个为1时,数码管会显示对应的按键号

请基于AT89C51设计5个按键实现对8个LED的控制并利用数码管显示按下的按键号5个按键对应的功能为:1号键:此键按下对应所有的灯都熄灭;2号键:此键按下LED1----LED8流动点亮;3号键:此键按下LED1----LED8依次点亮;4号键:此键按下LED1、LED3、LED5、LED7和LED2、LED4、LED6、LED8轮流点亮。5号键:此键按下LED1——LED8闪烁。

原文地址: https://www.cveoy.top/t/topic/hucH 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录