按钮与LED

发布时间 2024-01-07 16:58:46作者: lololopopo

流水灯

版本一:

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

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

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
void main()
{
	
	while(1)
	{
		P2=0xFE;//1111 1110
		Delay500ms();
		P2=0xFD;//1111 1101
		Delay500ms();
		P2=0xFB;//1111 1011
		Delay500ms();
		P2=0xF7;//1111 0111
		Delay500ms();
		P2=0xEF;//1110 1111
		Delay500ms();
		P2=0xDF;//1101 1111
		Delay500ms();
		P2=0xBF;//1011 1111
		Delay500ms();
		P2=0x7F;//0111 1111
		Delay500ms();
	}
}
	

版本二:

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

void Delayms(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms)
	{
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
	
	
}
void main()
{
	
	while(1)
	{
		P2=0xFE;//1111 1110
		Delayms(500);
		P2=0xFD;//1111 1101
		Delayms(500);
		P2=0xFB;//1111 1011
		Delayms(500);
		P2=0xF7;//1111 0111
		Delayms(500);
		P2=0xEF;//1110 1111
		Delayms(1000);
		P2=0xDF;//1101 1111
		Delayms(1000);
		P2=0xBF;//1011 1111
		Delayms(1000);
		P2=0x7F;//0111 1111
		Delayms(1000);
	}
}

按钮控制LED灯

注意:当板子接通电源是I/O口都为高电平,故当按键接通时,按键对应的I/O为低电平

#include <REGX52.H>
#include <INTRINS.H>
void main()
{
	//P2=0xFE;
	while(1)
	{
			if(P3_0==0)
			{
				P2_0=0;//按下按钮则灯亮
			}
			else
			{
				P2_0=1;//松开按钮则灯灭
			}
	}
		
}

独立按钮控制LED状态

#include <REGX52.H>
#include <INTRINS.H>
void Delayms(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms)
	{
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
	
}

void main()
{
	while(1)
	{
		if(P3_1==0)
		{
			Delayms(20);//按下按钮消抖
			while(P3_1==0);//松开按键后,再改变状态
			Delayms(20);//松开按钮消抖
			
			P2_0=~P2_0;
			
		}
	}
}

独立按钮控制LED显示二进制

void main()
{
	unsigned char LEDNumber = 0;
	while(1)
	{
		if(P3_1==0)
		{
			Delayms(20);//按下按钮消抖
			while(P3_1==0);//松开按键后,再改变状态
			Delayms(20);//松开按钮消抖
			//上电后起初P2=1111 1111 P2++ ==0000 0000
			LEDNumber++;
			P2=~LEDNumber;
		}
	}
}

独立按钮控制LED移位

void main()
{
	unsigned char LEDNum=0;//用于表示8位的无符号整数,局部变量需要放在函数,if,for,while的第一行
	P2=~0x01;
	
	while(1)
	{
		if(P3_1==0)
		{
			Delayms(20);//按下按钮消抖
			while(P3_1==0);//松开按键后,再改变状态
			Delayms(20);//松开按钮消抖
			
			LEDNum++;
			if(LEDNum>=8)
				LEDNum=0;
			P2=~(0x01<<LEDNum);
			
		}
		if(P3_0==0)
		{
			Delayms(20);//按下按钮消抖
			while(P3_0==0);//松开按键后,再改变状态
			Delayms(20);//松开按钮消抖
			
			
			if(LEDNum==0)
				LEDNum=7;
			else
				LEDNum--;
			P2=~(0x01<<LEDNum);
			 
		}
	}
}

动态数码管显示(注意消影)

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

unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数码管显示0-9对应的P0口代码

void Delayms(unsigned int xms)		//@11.0592MHz  延时函数
{
	unsigned char i, j;
	while(xms)
	{
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
	
}
//某一位显示0-9之间的数字
void Nixie(unsigned char Location, Number)
{
	switch(Location)//选择某一位数码管进行显示
	{
		case 1:
			P2_4=1;P2_3=1;P2_2=1;break;
		case 2:
			P2_4=1;P2_3=1;P2_2=0;break;
		case 3:
			P2_4=1;P2_3=0;P2_2=1;break;
		case 4:
			P2_4=1;P2_3=0;P2_2=0;break;
		case 5:
			P2_4=0;P2_3=1;P2_2=1;break;
		case 6:
			P2_4=0;P2_3=1;P2_2=0;break;
		case 7:
			P2_4=0;P2_3=0;P2_2=1;break;
		case 8:
			P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0=NixieTable[Number];
	Delayms(1);//消影
	P0=0x00;//消影
	
}

void main()
{
	while(1)
	{
		Nixie(1,1);
//		Delayms(200);
		Nixie(2,2);
//		Delayms(200);
		Nixie(3,3);
//		Delayms(200);
		
	}
}