单片机学习小组
直播中

vinww特烦恼

8年用户 1112经验值
擅长:存储技术
私信 关注

如何以不同的亮度来点亮LED灯呢

LED灯的原理是什么?
如何以不同的亮度来点亮LED灯呢?



回帖(1)

胡皓

2022-1-20 14:22:37
LED灯的原理图如下

由原理图不难看出,8个led灯是由P0口和P2.3引脚控制的。为点亮发光二极管,首先需要把P0口和P2.3设置为推挽输出,然后将P2.3置“1”(反向后为“0”),使能发光二极管威廉希尔官方网站 ;
***it led_sel=P2^3;//定义引脚
void Init()    //led灯初始化函数
{
        P0M1=0x00;    //0000 0000
        P0M0=0xff;    //1111 1111

        P2M1=0x00;    //0000 0000
        P2M0=0x08;    //0000 1000

        led_sel=1;
}


完成初始化以后,我们就可以根据P0口不同的设置来达到不同的效果。
流水灯:
#include
#include
#define uchar unsigned char
uchar led;

void Delay200ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 9;
        j = 104;
        k = 139;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

void main()
{
        Init();    //初始化
        led=0x01;    //0000 0001
        while(1)
        {
                P0=led;
                Delay200ms();
                if(led==0x80)
                        led=0x01;
                else
                        led=led<<1;
        }
       
}
流水灯其实是一个动态点亮的过程,如果点亮得太快,会导致效果不理想,所以使用了延时函数来使视觉效果停留。
而其中的“<<1”是位移操作,向左移一位,如0000 0001操作后就变为0000 0010。当然也存在右移操作“>>”。
呼吸灯:
简单点说,呼吸灯其实就是以不同的亮度点亮led灯,关键就在于如何以不同的亮度来点亮led灯,也就是改变led灯的亮度。简单的方法就是在肉眼观察不到的时间范围内,改变led点亮时间的占比,从而形成不同亮度的视觉效果。
可以用以下代码测试看看这样的方法led灯的亮度是否改变(效果应为L0~3比L4~7暗)
#include
#include
#define uchar unsigned char
uchar led;
***it led_sel=P2^3;//定义引脚

void Init()    //led灯初始化函数
{
        P0M1=0x00;    //0000 0000
        P0M0=0xff;    //1111 1111

        P2M1=0x00;    //0000 0000
        P2M0=0x08;    //0000 1000

        led_sel=1;
}

void Delay10us()                //@11.0592MHz
{
        unsigned char i;

        _nop_();
        i = 25;
        while (--i);
}

void Delay70us()                //@11.0592MHz
{
        unsigned char i, j;

        _nop_();
        _nop_();
        i = 1;
        j = 189;
        do
        {
                while (--j);
        } while (--i);
}

void main()
{
        Init();
        led=0xff;
        while(1)
        {
                P0=led;
                Delay10us();
                P0=0xf0;
                Delay70us();
        }
       
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分