LED灯的原理图如下
由原理图不难看出,8个led灯是由P0口和P2.3引脚控制的。为点亮发光二极管,首先需要把P0口和P2.3设置为推挽输出,然后将P2.3置“1”(反向后为“0”),使能发光二极管电路;?
sbit 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<STC15F2K60S2.H>
#include<intrins.h>
#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<STC15F2K60S2.H>
#include<intrins.h>
#define uchar unsigned char
uchar led;
sbit 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();
}
}
(以上为个人学习后的理解,若有不足和错误,还请各位斧正)
|