02点亮LED

LED

1. 原理图

LED原理图

2. 描述

流水灯模块使用P1 进行IO操作。并使用共地。默认高电平 所以需要点亮LED等, 就是将P1口 地线接通即可。

3. 点亮LED

第一个LED

P1引脚一共8位。此处变量LED设置P1.0(即P1引脚第0位)

#include <reg52.h>

sbit LED = P1^0;  // 定义P1.0为LED引脚

void main() {
    LED = 0;  // 输出低电平,点亮LED(共地接法)
    while (1);  // 保持程序运行
}

同时点亮1 3 5 led

#include <reg52.h>

sbit LED1 = P1^0;
sbit LED3 = P1^2;
sbit LED5 = P1^4;
void main() {
    LED1 = 0;
    LED3 = 0;
    LED5 = 0;
    while (1);
}
#include <reg52.h>

void main() {
    // 0xEA 在二进制表示为  11101010
    P1 = 0xEA; 
    while (1);
}

轮流点亮每一个LED

#include <reg52.h>

unsigned char a;
void delay();

void main() {
    while(1) {
        delay();
        for(a = 0; a < 8; a++) {
            P1 = P1 << 1;
            delay();
        }
        P1 = 0xFF;
    }
}

void delay() {
    int i = 65535;
    while(i--);
}

轮流点亮每一个LED,每次只点亮一个 从左向右

这里要用到一个 intrins 的 corl 循环左移 corr 循环右移 nop 空指令

#include <reg52.h>
#include <intrins.h>

unsigned char a;
unsigned char temp;
void delay();

void main() {
    temp = 0xFE;
    P1 = temp;
    while(1) {
        delay();
        temp = _crol_(temp, 1);
        P1 = temp;
    }
}

void delay() {
    int i = 65535;
    while(i--);
}

轮流点亮每一个LED,每次只点亮一个 从右向左

#include <reg52.h>
#include <intrins.h>

unsigned char a;
unsigned char temp;
void delay(unsigned int z);

void main() {
    temp = 0x7F;
    P1 = temp;
    while(1) {
        delay(1000);
        temp = _cror_(temp, 1);
        P1 = temp;
    }
}
// 改进了延时函数
void delay(unsigned int z) {
    unsigned int x,y;
    for(x = z; x > 0; x--) 
        for(y=0; y<125; y++);
}

发光二极管 2-4-6-8 闪烁间隔1s

#include <reg52.h>
#include <intrins.h>

unsigned char a;
unsigned char temp;
void delay(unsigned int z);

void main() {
    temp = 0xFD;
    P1 = temp;
    while(1) {
        delay(1000);
        temp = _crol_(temp, 2);
        P1 = temp;
    }
}

void delay(unsigned int z) {
    unsigned int x,y;
    for(x = z; x > 0; x--) 
        for(y=0; y<125; y++);
}

从右向左循环点亮间隔500ms

引用 轮流点亮每一个LED,每次只点亮一个 从右向左