独立按键控制LED状态,显示二进制,移位

文章还是基于51单片机(stc89c52RC)来实现的,学习江科大教程的学习日志

单片机上电所有IP口默认高电平

 由图可知,当按键未按下,读寄存器的值为1,按下后接地读寄存器的值为0

CPU可以直接访问寄存器

要用到51单片机的位声明

 了解运算的逻辑可以实现不同的效果

C51基本语句 

  

 按键抖动,信号不稳定,对按键检测造成干扰,要进行消抖(软件方法:delay函数延时){按键消抖一般用在按下和松开后只显示一种状态的情形,若按下一种状态,松开一种状态则不需要消抖}

#include <REGX52.H>

void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	
		xms--; 
	}


}

void main()
{
	while(1)
	{
		if(P3_1==0)
		{				
			Delay(20);
			while(P3_1==0);//先消抖即在松开后才会执行下一句,接收到第一个信号就开始消抖(让cpu空转)
			Delay(20);
			P2_0=~P2_0; 
			
		}	
		

接下来用上消抖来使P2寄存器的LED显示二进制

#include <REGX52.H>

void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	
		xms--; 
	}


}

void main()
{	
	unsigned char LED_Num=0;//这种类型有八位正好对应寄存器,可以看作一个寄存器
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);
			//1111 1111上电热高电平
			LED_Num++;//八位二进制
			P2=~LED_Num;//由此可知,可以将一个八位或一个字节来带入到寄存器来显示他的状态
			
		
		
		}	
	}
}
	

最后要实现的效果为按键移位(LED从低到高位亮灭)

首先演示的是单个按键控制单顺序移位

#include <REGX52.H>



void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	
		xms--; 
	}


}
unsigned char LED_Num; //全局变量上电默认为1

void main()//按位左移0000 0001 / 0000 0010/0000 0100
{		
		P2=~0x01;
		while(1)
		{
			if(P3_1==0)
			{
				Delay(20);
				while(P3_1==0);
				Delay(20);
				LED_Num++;
				if(LED_Num>=8)
					LED_Num=0;//不加花括号,需要加缩进且只识别第一行
				P2=~(0x01<<LED_Num);//注意运算顺序,将状态用二进制表示,然后改变二进制,再重新付给寄存器
			}
		
		

接下来是两个按键控制左右移位

#include <REGX52.H>



void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	
		xms--; 
	}


}
unsigned char LED_Num; //全局变量上电默认为1

void main()//按位左移0000 0001 / 0000 0010/0000 0100
{		
		P2=~0x01;
		while(1)
		{
			if(P3_1==0)
			{
				Delay(20);
				while(P3_1==0);
				Delay(20);
				LED_Num++;
				if(LED_Num>=8)
					LED_Num=0;//不加花括号,需要加缩进且只识别第一行
				P2=~(0x01<<LED_Num);//注意运算顺序,将状态用二进制表示,然后改变二进制,再重新付给寄存器
			}
			if(P3_0==0)
			{
				Delay(20);
				while(P3_0==0);
				Delay(20);
				if(LED_Num==0)
					LED_Num=7;
				else
					LED_Num--;
				P2=~(0x01<<LED_Num);//都是左移,只改变变量原本的结构并没有改变
			}

结束,LED和按键圆满结束!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值