一、宗旨
从零到一、循序渐进、不讲废话、通俗易懂、个人实践
二、功能需求与效果
1、功能需求
1.1、单个LED灯闪烁
1.2、所有LED灯闪烁
1.3、从左向右或从右向左,循环点亮单个LED灯
1.4、从左向右或从右向左,依次点亮LED灯
2、效果展示
三、原理图分析
![](https://img-blog.csdnimg.cn/direct/4c4acda190b844c085d28f4f44f01c7f.png)
从上述原理图-1中不难看出八个LED灯阳(正)极均连接VCC,阴(负)极分别连接Qn引脚。Qn引脚内部分别对应Dn,Qn与Dn的连接与断开受到当LE了引脚的控制。当LE=0时,Qn与断开连接,无法控制LED灯;当LE=1时,Qn与Dn连接互通,此时可通过控制P0n引脚的输出控制LED灯的亮灭。那么LE引脚又是谁控制的了?不难发现LE引脚连的是Y4C,这不巧了,下面原理图-2中也有Y4C。好嘞,请各位移步去瞅瞅下面的原理图-2。
![](https://img-blog.csdnimg.cn/direct/2a0345a3e7064f46a28f60db7ba1b1df.png)
原理图-2中的74HC02或非门和74HC138三八译码器具体是个啥我就不介绍了,咋们现在就关注Y4C引脚要咋个输出1。由或非门特性只有当两输入引脚同时输出0时才输出1,故而问题又转移为如何让Y4引脚输出0。让Y4引脚输出低电平的关键在于74HC138三八译码器的三个输入引脚ABC,当A=0,B=0,C=1时,Y4引脚就能输出0,此时便可通过P25~7引脚控制Y4C输出。
(以上描述,纯个人通俗理解,有诸多省略,详情请君自查)
四、功能实现思路
1、获取LED灯控制权
要想控制LED灯就先得拿到控制权,也就是将Y4C置为1。如何将其置为1的方法在上述原理图分析中已经解释过了,直接控制P25~7引脚便可。
P2 &= 0X1F; P2 |= 0X80;
2、控制操作LED灯
有了控制权那LED灯还不是任我们把玩了,如何把玩也是要讲究方式方法的。在分析原理图-1时其实已经说明了应当如何控制LED灯了,也就是控制单片机所有P0引脚的输出即可。由于LED灯是共阳极的,故而I/O口输出1时对应LED灯熄灭,输出0时对应LED灯点亮。
P0 = ~data;
3、功能封装
有了上面两个关键部分我们就可以封装出一个LED灯的控制函数了方便咋们后续调用。由于有开发板中有多个模块都是使用P0n和P25~7引脚进行控制的,所以咋们在使用控制权进行控制指定模块时,应当先将控制权释放也就是P25~7引脚清零。为防止上一模块控制P0n影响到本次控制,故而先进行P0n控制,再将P25~7配置为LED灯控制选择。最后在完成整个操作后要记得将控制权交出去,不要占着茅坑不拉屎哦。
void Controls_LED(uchar data){
P2 &= 0X1F;
P0 = ~data;P2 |= 0X80;
P2 &= 0X1F;
}
五、源代码
#include <STC15F2K60S2.H>
#define uchar unsigned char
#define uint unsigned int
#define FLOG 0
void Delay(uint t);
void Controls_LED(uchar data);
int main (void){
uchar i = 0;
uchar data = 0;
while(1){
#if FLOG == 0
/*单个LED灯闪烁*/
Controls_LED(0X01);
Delay(500);
Controls_LED(0X00);
Delay(500);
/**************/
#elif FLOG == 1
/*所有LED灯闪烁*/
Controls_LED(0XFF);
Delay(500);
Controls_LED(0X00);
Delay(500);
/***************/
#elif FLOG == 2
/*从左向右或从右向左,循环点亮单个LED灯*/
for(i = 0; i < 8; i++){
data = 0X01;
Controls_LED(data<<i);
Delay(500);
}
for(i = 0; i < 8; i++){
data = 0X80;
Controls_LED(data>>i);
Delay(500);
}
/***************************************/
#else
/*从左向右或从右向左,依次点亮LED灯*/
data = 0X00;
for(i = 0; i < 8; i++){
data += 0X01<<i;
Controls_LED(data);
Delay(500);
}
Controls_LED(0X00);
Delay(500);
data = 0X00;
for(i = 0; i < 8; i++){
data += 0X80>>i;
Controls_LED(data);
Delay(500);
}
Controls_LED(0X00);
Delay(500);
/***********************************/
#endif
}
}
void Delay(uint t){
uint i, j;
for(i = 0; i < t; i++)
for(j = 0; j < t; j++);
}
void Controls_LED(uchar data){
P2 &= 0X1F;
P0 = ~data;P2 |= 0X80;
P2 &= 0X1F;
}
上述均为个人观点,不喜勿喷!如有纰漏,望君指正!