51单片机LED点亮

该博客介绍了如何使用C语言在嵌入式系统中实现LED灯的交替闪烁,间隔0.5秒,并通过独立按键控制LED的状态。程序包括按键抖动处理,以及LED灯的位移和显示二进制数值。此外,还展示了按位操作在控制LED显示中的应用。
摘要由CSDN通过智能技术生成

发光二极管
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
led灯交替闪烁,间隔0.5s:

#include <REGX52.H>
#include <INTRINS.H>
//led交替闪烁,间隔0.5s
void Delay500ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	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();
	}  
}

P3_0代表独立按键‘k1
P3_1代表独立按键‘k2
P3_2代表独立按键‘k3
P3_3代表独立按键‘k4

#include <REGX52.H>

void main()
{
	while(1)
	{
		if(P3_1==0&&P3_0==0){
		//P3_1代表独立按键‘k2’,P3_0代表独立按键‘k1’
			P2_0 = 0;
			//p2_0代表LED模块‘D1’
		}
		else{
			P2_0 = 1;
		}
	}  
}

按位左移:0011 1100<<1 -> 0111 1000
按位右移:0011 1100>>1 -> 0001 1110

按位与:0011 1100 & 0101 0101 -> 0001 0100
按位或:0011 1100 | 0101 0101 -> 0111 1101

按位异或:0011 1100 ^ 0101 0101 -> 0110 1001
按位取反:~0011 1100 -> 1100 0011

独立按键(k1)按下灯亮(D1),再按下,灯灭;
(考虑抬手动作)

#include <REGX52.H>
//预防按键抖动
void delay(unsigned int xms)//传入几,就表示延时几毫秒
		//@12.000MHz
{	
	unsigned char i, j;
	while(xms){
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}					 
	  
void main()
{
	while(1)
	{
		 if(P3_1==0)//0表示按下k1,但此时还没有抬起手
		 {
		 	delay(20);
			while(P3_1==0);//如果按下k1;则陷入死循环,直到松手;

			delay(20);
			P2_0=~P2_0;
		 }
	}  
}

运用独立按键实现LED模块显示二进制

#include <REGX52.H>
//防按键抖动
void delay(unsigned int xms)//延迟时间,单位:毫秒		//@12.000MHz
{	
	unsigned char i, j;
	while(xms){
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}					 
	  
void main()
{
	unsigned int num=0;//定义二进制数0000 0000
	while(1)
	{
		 if(P3_1==0){
		 	delay(20);
			while(P3_1==0);//如果按下k1;则陷入死循环,直到松手;

			delay(20);
			num++;//每次加一
			P2=~num;//LED灯亮表示1,灯灭表示0;
		 }
	}  
}

LED亮灯位置移动(左移右移)

#include <REGX52.H>

void delay(unsigned int xms)		//@12.000MHz
{	
	unsigned char i, j;
	while(xms){
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}					 
	  
void main()
{
	unsigned int num=0;
	while(1)
	{
		 if(P3_1==0){//按下k1,亮灯的LED向右移
		 	delay(20);
			while(P3_1==0);//如果按下k1;则陷入死循环,直到松手;
			delay(20);
			if(num==8)
				num=0;
			P2=~((0x01)<<num++);
		 }
		 if(P3_0==0){ //按下k2,亮灯的LED向左移
		 	delay(20);
			while(P3_0==0);//如果按下k1;则陷入死循环,直到松手;
			delay(20);
			if(num==0)
				num=7;
			else
				num--;
			P2=~((0x01)<<num);
		 }
	}  
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值