51单片机独立按键控制LED显示二进制

本文详细介绍了51单片机中使用unsigned char类型变量LEDNum进行IO口操作的原因,以及Delay函数实现的延时原理。程序通过检测P3_1状态,改变P2口的LED显示,并利用位操作实现数值的取反。重点讨论了单片机IO口的默认状态和位操作在程序中的应用。
摘要由CSDN通过智能技术生成
#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);
  }
}

void main()
{
	unsigned char LEDNum=0;//为什么要用	unsigned char ,因为该数据类型刚好是8位与51单片机IO 
                             口寄存器位数相同
	while(1)
	{
			if(P3_1==0)
			{
				Delay(20);
				while(P3_1==0);
				Delay(20);

				//单片机IO口默认 1111 1111
				LEDNum++;
			  P2=~LEDNum;//1111 1111 再加1就产生了溢出变为0000 0000
			}
	}
}

为什么要用 unsigned char ,因为该数据类型刚好是8位与51单片机IO 口寄存器位数相同。

上电后51单片机IO口默认为高电平

我在想这里的LEDNum为什么不是一个实际的数字去取反操作,比如P2=~2这种?

因为定义了一个LEDNum变量是unsigned char类型的,它在程序中是一个8位的二进制,代表0-255数字,单片机在运算时也是这个8位的二进制在进行运算,计算机只认识0和1,取反操作也是按位进行操作。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个C51单片机按键控制LED二进制的简单示例代码。在这个示例代码中,我们假设您有4个按键和4个LED,按键连接到P1口的P1_0~P1_3引脚上,LED连接到P2口的P2_0~P2_3引脚上。 ``` #include <reg51.h> void delay(unsigned int t) //延时函数 { unsigned int i, j; for(i = 0; i < t; i++) for(j = 0; j < 125; j++); } void main() { unsigned char led = 0x00; //LED二进制状态 unsigned char key; //按键的状态 while(1) { key = P1; //读取按键的状态 key = ~key; //取反,因为按键是低电平有效 if(key & 0x01) //按下第一个按键 led ^= 0x01; //将第一个LED的状态取反 if(key & 0x02) //按下第二个按键 led ^= 0x02; //将第二个LED的状态取反 if(key & 0x04) //按下第三个按键 led ^= 0x04; //将第三个LED的状态取反 if(key & 0x08) //按下第四个按键 led ^= 0x08; //将第四个LED的状态取反 P2 = ~led; //更新LED的状态,因为LED是低电平有效 delay(50); //延时一段时间,防止按键抖动 } } ``` 这个示例代码中,我们使用了一个无限循环来不断地读取按键的状态,并根据需要修改LED的状态。我们使用了一个unsigned char类型的变量led来表示LED二进制状态,并使用^运算符来将其状态取反。最后,我们将led的值赋给P2口的引脚,以控制LED的状态。 希望这个示例代码对您有所帮助。如果您有任何其他问题,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值