51单片机学习笔记(三)独立按键

一、补充的知识点——定义单独的IO口

上一篇文章中学习了使用位寄存器对LED小灯进行控制

#include <REGX52.H>

void main()
{
	P2 = 0xFE;//1111 1110
	while(1)
	{
	
	}
}

但是在许多情况下,往往需要对个别端口进行操作,每次都要直接对修改整个IO口较为麻烦且容易出错。
因此,可以采用单独定义某个端口的方式来实现
C-51的数据类型扩充定义:
sfr : 特殊功能寄存器声明
sfr16 : sfr的十六位数据声明
sbit : 特殊功能位声明
bit : 位变量声明

#include <REG52.H>

sbit Led1 = P2^0//定义P2^0端口为Led1,便于理解

void main()
{
	Led1 = 0;//接入低电平使其发光
	while(1)
	{
	
	}
} 

注意:如果调用的库是’REG52.H’的话是需要这样自己进行定义的,而如果条调用’REGX52.H’的话,可以不用定义,直接使用就可以了,库文件中已经定义好了O(∩_∩)O
库文件

#include <REGX52.H>

void main()
{
	P2_0 = 0;//对应D1,使其发光
	while(1)
	{
	
	}
}

二、C语言知识补充

2.1 基本运算

类别符号意义
算数运算
+
-
*
/
%取余
=赋值
判断
>大于
>=大于等于
<小于
<=小于等于
==等于
!=不等于
逻辑
&&逻辑与
逻辑或
!逻辑非
位运算
&按位与
按位或
!按位取反
^按位异或
<<按位左移
>>按位右移

2.2 基本语句

//分支语句
if(逻辑表达式1)
{
	语句体1}
else if(逻辑表达式2)
{
	语句体2;
}
else
{
	语句体3;
}

switch(变量)
{
	case 常量1:语句体1;break;
	case 常量2:语句体2;break;
	……
	default:语句体x;break;
}

/

//循环语句
while(逻辑表达式)
{
	循环体;
}

for(初始化;逻辑表达式;更改条件)
{
	循环体;
}

三、独立按键的控制原理

请添加图片描述
独立按键的工作原理很简单:单片机的各端口默认为高电平,当按下按钮时电路接通,相应的端口连接到GND上,此时端口会变为低电平,可以通过检测端口的电平来判断按键是否按下。

四、独立按键控制LED

Level 1:独立按键控制LED亮灭

#include <REGX52.H>

void main()
{
	while(1)
	{
		if(P3_1==0)     //检测P31端口是否是低电平,如果是,则将P20端口设为低电平,使LED发光
		{
			P2_0=0;
		}
		else            //检测到按键还原,则熄灭Led
		{
			P2_0=1;
		}
	}
}

Level 2:独立按键控制LED状态

按键的抖动

对于机械开关,当机械触点断开、闭合时,会产生弹性作用导致开关不能立刻打开或闭合,从而产生抖动。请添加图片描述
在编写程序时,可以通过使用延时函数的方式消除抖动:

#include <REGX52.H>

void DelayXms(unsigned int xms)
{
	unsigned char i;
	unsigned char j;
	while(xms--)
	{
		i=2,j=239;
		do
		{
			while(--j);
		}while(--i);
	}
}

void main()
{
	while(1)
	{
		if(P3_1==0)
		{
			//检测一次按键周期
			DelayXms(20);//用延时消抖
			while(P3_0==0);//等待按键松开,当按键松开时执行下一步
			DelayXms(20);//消抖
			//LED状态取反
			P2_0=~P2_0;
		}
	}
}

Level 3 独立按键控制LED实现二进制

#include <REGX52.H>

void DelayXms(unsigned int xms)
{
	unsigned char i;
	unsigned char j;
	while(xms--)
	{
		i=2,j=239;
		do
		{
			while(--j);
		}while(--i);
	}
}

void main()
{
	unsigned char LedNum=0;	
	while(1)
	{

		if(P3_1==0)
		{
			DelayXms(20);
			while(P3_1==0);
			DelayXms(20);
			
			LedNum++;
			P2=~LedNum;//LED低电平点亮
		}
	}
}

Level 4 独立按键控制LED移位

#include <REGX52.H>

void DelayXms(unsigned int xms)
{
	unsigned char i;
	unsigned char j;
	while(xms--)
	{
		i=2,j=239;
		do
		{
			while(--j);
		}while(--i);
	}
}

void main()
{
	unsigned char LedNum=0;
	P2_0=0;
	while(1)
	{
		if(P3_1==0)
		{
			//检测按键按下松开
			DelayXms(20);
			while(P3_1==0);
			DelayXms(20);
			//令0000 0001分别左移1,2,3……7次为一个循环
			LedNum++;
			if(LedNum==8)
			{LedNum=0;}
			P2=~(0x01<<LedNum);
		}
	}
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值