[3-1] 独立按键控制LED亮灭_哔哩哔哩_bilibili

单片机---独立按键-LMLPHP

按下的时候连接,松开的时候断开。

一头接GND(电源负极),另一头接I/O口。

单片机---独立按键-LMLPHP

单片机上电时,所有I/O口为高电平。

按键没有按下,I/O口为高电平。

按键按下,I/O口为低电平。

寄存器会检测I/O口的值,读入寄存器中。

直接读寄存器,值应该为1.

按键按下,寄存器值应该为0.

(1)

直接对位进行操作:

#include <REGX52.H>
#include <INTRINS.H>

void main()
{
	P2_0=0;
	while(1)
	{
	}
}

(2)

按下K1,LED1亮,松开,LED1灭。

#include <REGX52.H>
#include <INTRINS.H>

void main()
{
	while(1)
	{
		if(P3_1==0){
			P2_0=0;
		}
		else{
			P2_0=1;
		}
	}
}

单片机---独立按键-LMLPHP

(3) 

按键按下,灯亮,再按下,灯灭:

#include <REGX52.H>
#include <INTRINS.H>

void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}
void Delay_time(int x)//ms
{
	int i;
	for(i=0;i<x;i++)
	{
		Delay1ms();
	}
}
void main()
{
	P2_0=0;//点亮LED1
	while(1)
	{
		if(P3_1==0){
			Delay_time(20);//消抖
			//按键按下
			while(P3_1==0)
			{
			}
			Delay_time(20);//消抖
			P2_0=~P2_0;
		}
	}
}

(4) 

LED1亮,按下按钮,LED2亮,,,再按,LED8亮,然后,LED1亮。

#include <REGX52.H>
#include <INTRINS.H>

void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}
void Delay_time(int x)//ms
{
	int i;
	for(i=0;i<x;i++)
	{
		Delay1ms();
	}
}
void main()
{
	P2=0xFE;
	while(1)
	{
		if(P3_1==0){
			Delay_time(20);
			while(P3_1==0)
			{
			}
			Delay_time(20);
			P2<<=1;
			P2=P2|0x01;
			if(P2==0xFF)P2=0xFE;
		}
	}
}

(5) 

LED1亮,按下按钮,LED8亮,按下按钮,LED7亮,,,再按,LED1亮,然后,LED8亮。

LED1--->LED8--->LED7--->LED6--->LED1(逆循环) 

#include <REGX52.H>
#include <INTRINS.H>

void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}
void Delay_time(int x)//ms
{
	int i;
	for(i=0;i<x;i++)
	{
		Delay1ms();
	}
}
void main()
{
	P2=0xFE;
	while(1)
	{
		if(P3_0==0)
		{
			Delay_time(20);
			while(P3_0==0)
			{
			}
			Delay_time(20);
			P2>>=1;
			P2=P2|0x80;
			if(P2==0xFF)P2=0x7F;
	  }
	}
}

(6) 

按下K1,LED1--->LED2--->LED8--->LED1

按下K2,,LED1--->LED8--->LED7--->LED1 

#include <REGX52.H>
#include <INTRINS.H>

void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}
void Delay_time(int x)//ms
{
	int i;
	for(i=0;i<x;i++)
	{
		Delay1ms();
	}
}
void main()
{
	P2=0xFE;
	while(1)
	{
		
		if(P3_1==0){
			Delay_time(20);
			while(P3_1==0)
			{
			}
			Delay_time(20);
			P2<<=1;
			P2=P2|0x01;
			if(P2==0xFF)P2=0xFE;
		}
		
		if(P3_0==0)
		{
			Delay_time(20);
			while(P3_0==0)
			{
			}
			Delay_time(20);
			P2>>=1;
			P2=P2|0x80;
			if(P2==0xFF)P2=0x7F;
	  }
	}
}

(7) 

使用LED8---LED1,8个灯表示数a的二进制形式。

开始时a=0

按下按钮,a++

a=255时,按下按钮,a=0。 

观察8个灯的变化

#include <REGX52.H>
#include <INTRINS.H>

void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}
void Delay_time(int x)//ms
{
	int i;
	for(i=0;i<x;i++)
	{
		Delay1ms();
	}
}
void main()
{
	unsigned char a=0x00;
	while(1)
	{
		if(P3_1==0){
			Delay_time(20);
			while(P3_1==0)
			{
			}
			Delay_time(20);
			a=a+1;
			P2=~a;
			if(a==256)a=0x00;
		}
	}
}
03-30 08:56