单片机入门(1)

        独立按键控制LED亮灭

        首先我们来了解一下机械开关的结构。如图,有开关按键、弹簧弹片。开关按下就接触到图一的开关下面的两个未连接的弹片,按下就接触,电流导通。

 

接下来介绍按键的使用

由图可知,K1开关时链接到寄存器的P31号口,P31的电频默认是高电频(低电频)熄灭。当P31接口处于低电频的是,键位控制的LED就会亮起,代码如图

 

 这就是一个简单的代码控制LED的亮起代码。接下来介绍按键的抖动。

 简单的来说,就是开关按下的时候,由于弹片的弹性,不会马上就结束工作状态。

这种情况有两种解决方法:1.硬件消抖,加一个电路,过滤。2.通过软件来消抖,延时个多少毫秒,这样抖动就过去了。

下面介绍软解消抖的步骤:

        1.首先我们来定义一个延时的函数

#include <REGX52.H>

void Delay(unsigned int xms)//xms不可以超出65535这个范围 因为unsigned是在这个范围之内	
{
	unsigned char i, j;
	while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

这是我们自定义的一个延时函数,调用的时候就直接在Delay()中输入参数就好了(要延时的时间),因为unsigned的范围是0~65535,所以延时不可以超过65535ms。

2.接下来写主函数

void main()
{
    while(1)
    {
        if(P3_1==0)//如果K1按键口按下的话
        {
            Delay(20);//按下时延时20ms
            while(P3_1==0);//检测松手
            Delay(20);//松手再延时20ms
            P2_0=~ P2_0;//按位取反,把LED的状态变成与之前的相反
        }
    }
}

就上面这个代码,我们来解释一下作用。就是当我们按下按键的时候(还没松手)是熄灭的,等松手的时候就会亮起。亮着的时候就相反,这样我们就可以使用一个独立按键来控制一个LED的亮灭了。

接下来介绍用独立按键来控制LED的移位。

首先来介绍这个程序的作用:就是通过独立按键按下来控制LED的一次亮灭。比如按一下,第一个LED亮起,再按一下第二个LED亮起,而第一个LED熄灭。这就是该程序的作用,下面来分析如何写这个程序。

我们知道LED小灯的亮灭是通过P2口的高低电频来控制的,我们只需要将低电频依次转换到下一个LED的位置即可。下面通过图片来理解

 

 这就是我们的LED小灯依次亮起时的各个LED的电频。这个表达的们就要用到C语言中的按位右移或左移这个知识点(<< 或者 >>)这里我们使用十六进制来表示,即0x01。

上代码!!

void main()
{
	unsigned char LEDNum=0;//这里我们定义一个char型的变量来控制左移或右移的单位
	P2=~0x01;//这句话的意思使我们的初始第一个小灯亮在第一个位置
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);//到这里都是按下的一个过程,前面又讲
			
			LEDNum++;这个是控制左移或者右移的位数
			if(LEDNum>=8)//判断LEDNum是否大于7,大于的话就使LEDNum重新变回0
				LEDNum=0;
			P2=~(0x01<<LEDNum);//最后就是改变我们的P2口的电频,通过左移或右移最后的方式
		}
		
		
	}
}

 这样我们就可以通过一个按键来控制一个LED小灯状态的单项移动。

要是想控制LED状态的自由移动的话我们就在下面加上这一段代码

if(P3_0==0)//这段代码接在上一段代码下面
		{
			Delay(20);
			while(P3_0==0);
			Delay(20);//简单的消抖
			
			if(LEDNum==0)//这里我们判断如果LEDNum到0的时候,就让他变回7(我们定义的上界就是7),防止越位
				LEDNum=7;
			else
				LEDNum--;//然后减减,和上一段代码相反
			P2=~(0x01<<LEDNum);

这样我们就可以通过独立按键来控制LED小灯左右移动了。

#include <REGX52.H>

void Delay(unsigned int xms)//xms不可以超出65535这个范围 因为unsigned是在这个范围之内	
{
	unsigned char i, j;
	while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

void main()
{
	unsigned char LEDNum=0;
	P2=~0x01;
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);
			
			LEDNum++;
			if(LEDNum>=8)
				LEDNum=0;
			P2=~(0x01<<LEDNum);
		}
		
		if(P3_0==0)
		{
			Delay(20);
			while(P3_0==0);
			Delay(20);
			
			if(LEDNum==0)
				LEDNum=7;
			else
				LEDNum--;
			P2=~(0x01<<LEDNum);
		}
	}
}

这是完整的代码段。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值