全部版块 我的主页
论坛 经济学论坛 三区 教育经济学
107 0
2025-12-09
#include<stc8a.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

// 注意:P必须大写
sbit k1 = P3^2;
sbit k2 = P3^3;
sbit k3 = P3^4;
sbit k4 = P3^5;
sbit led = P4^1;
sbit k5 = P4^0;

/**
 * 微秒级延时函数
 * 参数:us - 延时的微秒数
 */
void delay_us(uint us)
{
    uint a;
    uchar b;
    for(b = 0; b < 3; b++)
        for(a = 0; a < us; a++);
}

/**
 * 功能:实现左右往返流动的灯光效果
 * 灯从左至右逐一点亮,再从右至左返回
 */
void start_1()
{
    uchar a, b;
    b = 0xfe;
    // 左移点亮
    for(a = 0; a < 7; a++)
    {
        P0 = b;
        delay_us(50000);
        b = _crol_(b,1);
    }
    // 右移返回
    for(a = 0; a < 7; a++)
    {
        P0 = b;
        delay_us(50000);
        b = _cror_(b,1);
    }
}

/**
 * 功能:按指定掩码进行流水灯控制
 * 使用固定掩码0xe7与当前值进行与操作
 */
void start_2()
{
    uchar a, b;
    b = 0xfe;
    // 正向循环
    for(a = 0; a < 7; a++)
    {
        P0 = 0xe7 & b;
        delay_us(50000);
        b = _crol_(b,1);
    }
    // 反向循环
    for(a = 0; a < 7; a++)
    {
        P0 = 0xe7 & b;
        delay_us(50000);
        b = _cror_(b,1);
    }
}

/**
 * 功能:双灯对向移动并相遇
 * 一盏灯右移,另一盏左移,形成对称移动效果
 */
void start_3()
{
    uchar a, b, c;
    b = 0x7f;  // 初始位置(左侧开始)
    c = 0xfe;  // 初始位置(右侧开始)
    
    for(a = 0; a < 3; a++)
    {
        c = _cror_(c,1);
        delay_us(50000);
        P0 = c & b;
        b = _crol_(b,1);
    }
    
    for(a = 0; a < 3; a++)
    {
        P0 = c & b;
        delay_us(50000);
        c = _crol_(c,1);
        b = _cror_(b,1);
    }
}

/**
 * 功能:反向扩展方式的流水灯
 * 先右移扩展,后保持状态持续输出
 */
void start_4()
{
    uchar a, b, c;
    b = 0x7f;
    c = 0x7f;
    
    // 扩展阶段
    for(a = 0; a < 8; a++)
    {
        P0 = b;
        delay_us(50000);
        b = _cror_(b,1);
        c = b & c;
        b = c;
    }

    // 持续输出阶段
    b = 0x01;
    c = 0x01;
    for(a = 0; a < 8; a++)
    {
        P0 = b;
        delay_us(50000);
        b = c;
    }
}

/**
 * 功能:实现逐列扫描式流水灯
 * 模拟列扫描过程,逐步点亮不同组合
 */
void start_5()
{
    uchar a, b, c, d;
    b = 0x7f;
    c = 0xff;
    
    for(a = 0; a < 9; a++)
    {
        for(d = 0; d < 7; d++)
        {
            P0 = b & c;
            delay_us(50000);
            b = _cror_(b,1);
        }
        delay_us(50000);
        c = c << 1;
    }
}

/**
 * 功能:多层嵌套移位流水灯
 * 内层循环次数随外层递增,形成叠加效果
 */
void start_6()
{
    uchar a, b, c, t;
    b = 0x7f;
    
    for(a = 0; a < 8; a++)
    {
        c = 0x7f;
        P0 = b;
        
        for(t = 0; t < a; t++)
        {
            P0 = b & c;
            delay_us(50000);
            c = _cror_(c,1);
            delay_us(50000);
        }
        b = _cror_(b,1);
    }
}

/**
 * 功能:双向追逐并闪烁提示
 * 两组灯光相向而行,相遇后整体闪烁多次
 */
void start_7()
{
    uchar a, b, c, d;
    b = 0xfe;
    c = 0x7f;

    // 从左到右追逐
    for(a = 0; a < 7; a++)
    {
        P0 = b & c;
        delay_us(50000);
        b = _cror_(b,1);
        c = _cror_(c,1);
    }

    // 从右到左继续追逐
    for(a = 0; a < 7; a++)
    {
        P0 = b & c;
        delay_us(50000);
        b = _cror_(b,1);
        c = _cror_(c,1);
    }

    // 相遇后闪烁10次
    for(d = 0; d < 10; d++)
    {
        P0 = b & c;
        delay_us(50000);
        P0 = 0xff;
        delay_us(50000);
    }
}

/**
 * 功能:移位组合型流水灯(备用方案)
 * 初始化为全亮状态,可后续扩展逻辑
 */
void start_8()
{
    uchar a, b, c;
    b = 0xff;
void main()
{
    led = 0;

    if(k1 == 0)
    {
        while(1)
        {
            start_1();
            start_2();
            start_3();
            start_4();
            start_5();
            start_6();
            break;
        }
    }

    if(k2 == 0)
    {
        while(1)
        {
            start_7();
            break;
        }
    }

    if(k3 == 0)
    {
        while(1)
        {
            start_8();
            break;
        }
    }
}

for(c = 0; c < 8; c++)
{
    for(a = 0; a < 7; a++)
    {
        P0 = b;
        delay_us(50000);
        b = _cror_(b, c);
    }

    for(a = 0; a < 7; a++)
    {
        P0 = b;
        delay_us(50000);
        b = _crol_(b, c);
    }
}
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群