蓝桥杯单片机程序设计部分零基础个人分享1——LED控制

一、宗旨

        从零到一、循序渐进、不讲废话、通俗易懂、个人实践

二、功能需求与效果

1、功能需求

        1.1、单个LED灯闪烁

        1.2、所有LED灯闪烁

        1.3、从左向右或从右向左,循环点亮单个LED灯

        1.4、从左向右或从右向左,依次点亮LED灯

2、效果展示

三、原理图分析

原理图-1

        从上述原理图-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。

原理图-2

        原理图-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;
}

上述均为个人观点,不喜勿喷!如有纰漏,望君指正!

  • 25
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值