以下是 AT89C51 控制八个流水灯的代码:

#include <reg51.h>

#define uchar unsigned char
#define uint unsigned int

uchar code LedCode[] = { 0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE }; // 七段数码管编码表
uchar ledStatus = 0; // 记录当前流水灯状态
uchar button1, button2; // 记录按键状态

void delay(uint t) // 延时函数
{
    while (t--);
}

void displayLed() // 显示流水灯
{
    P2 = LedCode[ledStatus]; // 显示当前状态对应的编码
}

void main()
{
    while (1)
    {
        button1 = P1 & 0x01; // 读取按键1状态
        button2 = P1 & 0x02; // 读取按键2状态

        if (button1 && !button2) // 按键1按下
        {
            ledStatus++; // 流水灯向下移动一位
            if (ledStatus > 7) ledStatus = 0; // 如果已经到最后一位,回到第一位
            displayLed(); // 显示流水灯
            delay(10000); // 延时一段时间,控制流水灯速度
        }
        else if (button2 && !button1) // 按键2按下
        {
            ledStatus--; // 流水灯向上移动一位
            if (ledStatus < 0) ledStatus = 7; // 如果已经到第一位,回到最后一位
            displayLed(); // 显示流水灯
            delay(10000); // 延时一段时间,控制流水灯速度
        }
        else if (button1 && button2) // 两个按键同时按下
        {
            for (uchar i = 0; i < 8; i += 2) // 交替亮灯
            {
                ledStatus = i;
                displayLed();
                delay(10000);
                ledStatus = i + 1;
                displayLed();
                delay(10000);
            }
        }
        else // 两个按键都没按
        {
            for (uchar i = 0; i < 4; i++) // 中间向两边亮灯
            {
                ledStatus = 1 << i;
                displayLed();
                delay(10000);
            }
            for (uchar i = 2; i >= 0; i--)
            {
                ledStatus = 1 << i;
                displayLed();
                delay(10000);
            }
        }
    }
}

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

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