效果展示

无参延时流水灯
上节已经测试了led闪烁,这节写led流水灯效果,若想达到效果,可以依次让P2.0到P2.7这八个灯亮,每个间隔500ms。

已知P2.0亮的寄存器是1111 1110,那么P2.1亮的寄存器就是1111 1101。
可以将P2.0左移一位得到1111 1100,再和0000 0001或运算,或运算(有1取1)
text
0xFC = 1111 1100
0x01 = 0000 0001
-----------------
0xFD = 1111 1101 ← 只有第 1 位是 0,P2.1 亮
完整代码:
c
#include <mcs51/8051.h>
// SDCC 没有 INTRINS.h,用宏定义实现 _nop_()
#define _nop_() __asm NOP __endasm
void Delay500ms(void) //@12.000MHz
{
unsigned char i, j, k; // 去掉 data,让编译器自动分配
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main(void)
{
while(1){
unsigned char led = 0xFE; // 1111 1110
for(int i = 0; i < 8; i++) {
P2 = led;
led = (led << 1) | 0x01; // 左移后最低位补 1, 最后变成0111 1111
Delay500ms();
}
}
}
或者
c
unsigned char led = 0xFE;
while(1)
{
P2 = led;
Delay500ms();
// 把最高位(第 7 位)移到最低位,实现循环
led = (led << 1) | (led >> 7);
}
带参数延时

c
// 一毫秒延时代码
void Delay1ms(void) //@12.000MHz
{
unsigned char data i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
c
// xms毫米延时代码
void DelayXms(unsigned int xms)
{
unsigned char i, j;
if(xms == 0) return; // 传入 0 直接返回,不做延时
do
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
} while (--xms);
}