【51单片机入门:独立按键控制LED亮灭】

一.独立按键

    1.特点:同侧导通,异侧断开

   2.独立按键的I/O口

       单片机上电后,所有I/O口默认都是高电平。没有按开关时都是高电平,按下后变成低电平。

       寄存器通过检测高低电平检测按键是否被按下

 1)由下原理图可知,独立按键         K1 = P3_0       K2 = P3_1       K3 = P3_2       K4 = P3_3

 

二.LED

 1. 16进制表示

点亮第1个LED     P2 = 0xFE;      //1111 1110

点亮第2个LED    P2 = 0xFD;      //1111 1101
点亮第3个LED   P2 = 0xFB;      //1111 1011
点亮第4个LED   P2 = 0xF7;      //1111 0111
点亮第5个LED    P2 = 0xEF;      //1110 1111
点亮第6个LED    P2 = 0xDF;      //1101 1111
点亮第7个LED     P2 = 0xBF;      //1011 1111
点亮第8个LED    P2 = 0x7F;      //0111 1111
 

2.I/O口表示

点亮第1个LED     P2_0=0;      熄灭第1个LED    P2_0=1;

点亮第2个LED     P2_1=0;      熄灭第2个LED    P2_1=1;

点亮第3个LED     P2_2=0;      熄灭第2个LED    P2_2=1;

后面的LED以此类推

三.按键的抖动

         为了除去抖动造成的影响,可以在按键抖动期间使用延时函数,从而避开抖动时间

while(1){
	if(P3_1==0)
	{
        //除去抖动
		Delay1ms(20);
		while(P3_1==0);
		Delay1ms(20);
        //LED亮暗取反
		P2_0 = ~P2_0;
	}
}

四.实例应用

1.实现除去抖动、按下按键后改变灯的暗亮的功能

功能:按一次,LED变亮,再按一次,LED变暗,再按一次,LED变亮,以此类推。

if(P3_1==0)            //按键按一次
	{
		P2_0 = ~P2_0;  //LED电平取反一次
	}
#include <REGX52.H>

void Delay1ms(unsigned int xms)        //@12.000MHz
{
    unsigned char i, j;
    while(xms)
    {
        i = 2;
        j = 239;
		do
		{
          while (--j);
        } while (--i);
        xms --;
    }
}

void mian()
{
	while(1){
		if(P3_1==0)
		{
			Delay1ms(20);
			while(P3_1==0);
			Delay1ms(20);
			P2_0 = ~P2_0;
		}
    }
}

2.独立按键控制LED显示二进制

功能:按一次开关,二进制计数+1

    unsigned char LEDNum=0;  //0000 0000
	while(1) 
	{
		if(P3_1==0)
		{
			Delay1ms(20);
			while(P3_1==0);
			Delay1ms(20);
				
			LEDNum++;        //0000 0001
			P2=~LEDNum;      //1111 1110(取反)
		}
	}
#include <REGX52.H>

void Delay1ms(unsigned int xms)        //@12.000MHz
{
    unsigned char i, j;
    while(xms)
    {
        i = 2;
        j = 239;
        do
        {
            while (--j);
        } while (--i);
        xms --;
    }
}

void main()
{
	unsigned char LEDNum=0;  //0000 0000
	while(1)
	{
		if(P3_1==0)
		{
			Delay1ms(20);
			while(P3_1==0);
			Delay1ms(20);
				
			LEDNum++;        //0000 0001
			P2=~LEDNum;      //1111 1110(取反)
		}
	}
}

3.独立按键控制LED位移(按键版流水灯)

功能:每按一次开关,LED灯移动一次。

按位左移<<

 按位左移的代码实现

unsigned char LEDNum = 0 ;
	while(1)
	{
		if(P3_1==0)
		{
			LEDNum++;
			if(LEDNum>=8)
				LEDNum=0;
			P2=~(0x01<<LEDNum);  //“<<”按位左移
		}	
	}
#include <REGX52.H>

void Delay1ms(unsigned int xms)        
{
    unsigned char i, j;
    while(xms)
    {
        i = 2;
        j = 239;
        do
        {
            while (--j);
        } while (--i);
        xms --;
    }
}

void mian()
{
	unsigned char LEDNum = 0 ;
	while(1)
	{
		if(P3_1==0)
		{
			Delay1ms(20);
			while(P3_1==0);
			Delay1ms(20);
			
			LEDNum++;
			if(LEDNum>=8)
				LEDNum=0;
			P2=~(0x01<<LEDNum);
		}	
	}
}
物联沃分享整理
物联沃-IOTWORD物联网 » 【51单片机入门:独立按键控制LED亮灭】

发表评论