#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);
}
}