51 单片机LED流水灯(SDCC + Notepad++ + STC-ISP/普中ISP)

效果展示

无参延时流水灯

上节已经测试了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);
}
相关推荐
艾芯微科技2 小时前
钰泰 ETA1654FSG|SOT563 4A、18V 宽压自适应 COT 同步降压 DC-DC,CPE / 机顶盒优选
网络·单片机·嵌入式硬件·集成测试·51单片机
F137298015572 小时前
WD5208S 采用 SOP‑8 标准封装,内部集成650V 耐压功率
stm32·单片机·嵌入式硬件·51单片机
霖霖7143 小时前
【ESP32笔记】工程目录解析
笔记·单片机·mcu·物联网
华允物联-HUAIOT3 小时前
串口服务器支持 WiFi 吗?有线与无线串口联网科普
运维·服务器·单片机
霖霖7143 小时前
【ESP32笔记】ADC获取NTC温度
笔记·单片机·mcu·物联网
ClinicTech3 小时前
蠕动泵的隔离式传输原理与关键控制功能解析
单片机·嵌入式硬件
奋斗的阿狸_19863 小时前
ESP32-S3 DevKit 模拟量采集调试报告
单片机·嵌入式硬件
新晨单片机设计3 小时前
S028A-基于STM32单片机智能电表【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus·智能电表
POMAGTOR3 小时前
【磁吸式数据线接口方案:结构特点与工程选型要点】
网络·嵌入式硬件