(基于江协科技)51单片机入门:2.独立按键

目录

对寄存器的精细化控制

独立按键

​编辑

1.独立按键控制单个LED亮灭

按键消抖

2.独立按键长按LED长亮

3.独立按键控制LED显示二进制

4.独立按键控制LED移动


对寄存器的精细化控制

在LED模块原理图中最右端能看见 P20 P21 P22 等值,上章也讲了银脚控制着一条线路的电压而决定一个电子元件或者多个电子元件是否工作,寄存器又控制银脚。将P20进行拆分 P2 为寄存器名,0 为这条线路对应寄存器的位(51单片机一个寄存器8位)。

所以可以给 P2_0 赋值去单个控制这条线路的电压 1 为 0V ,0 为 5V。

独立按键

可以从最右端看到 P30 P31 P32 等数字,和上方LED灯一样

可以对 P3 这个寄存器整体判断,也可以对 P3_0 独立判断

1.独立按键控制单个LED亮灭

所以可以利用 if 语句来判断按键处于什么状态,如果为证处理后续代码

**例如:**判断独立按键按下,执行代码为讲单个LED打开 或 关闭

不是独立按键控制了LED的亮灭,是LED决定LED的亮灭,控制一直都是单片机

按键消抖

由于机械粗点的弹性作用,一个开关 开关 闭合 时不会马上稳定地接通,会有一连串抖动

这类抖动会给程序逻辑带来严重的干扰

**例如:**你的程序本意是"按一下键,LED灯状态改变一次"。但由于抖动,单片机在几毫秒内检测到了多次"下降沿"或"低电平",导致LED灯的状态快速切换了多次,最终你可能看到的效果是:按一次键,LED灯闪烁了好几下,或者直接没有变化(因为奇数次切换后又变回原状)

所以在在程序上进行消抖处理

cpp 复制代码
if(P3_0 == 0)
		{
			Delay(20);        // 按下消抖
			while(P3_0==0)£;  // 判断是否松手
			Delay(20);        // 松手消抖
			
			
		}

独立按键控制单个LED亮灭 代码如下:

cpp 复制代码
#include <REGX52.H>
#include <intrins.h>

void Delay(int num)		
{
	while(num--)
	{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
	}
}


int main()
{
	while(1)
	{
		if(P3_0 == 0)
		{
			Delay(20);
			while(P3_0==0);
			Delay(20);
			
			P2_0 = ~P2_0;        // 亮变暗 暗变亮
		}
	}
	return 0;
}

2.独立按键长按LED长亮

cpp 复制代码
#include <REGX52.H>
#include <intrins.h>

void Delay(int num)		//@11.0592MHz
{
	while(num--)
	{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
	}
}


int main()
{
	while(1)
	{
		if(P3_0 == 0)          // 判断是否按下
		{
			Delay(20);         // 按下消抖
			
			if(P3_0 == 0)      // 确认中途没有松手
			{
				P2_0 = 0;      // LED亮灯
			}			
			while(P3_0==0);    // 不松手持续循环,使LED亮着
			Delay(20);         // 松手消抖
		}
		else                   // 松手后,第二次外层循环进入将灯熄灭
		{
			P2_0 = 1;          
		}
	}
	return 0;
}

3.独立按键控制LED显示二进制

cpp 复制代码
#include <REGX52.H>
#include <intrins.h>

void Delay(int num)		//@11.0592MHz
{
	while(num--)
	{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
	}
}

int main()
{
	unsigned char c = 0;
	while(1)
	{
		if(P3_0 == 0)
		{
			Delay(20);
			while(P3_0==0);
			Delay(20);
			
			c++;
			P2 = ~c;
		}

	}
	return 0;
}

2进制显示本质上就是一直+1

但由于 0 灯亮,1 灯灭,等的转态相反

所以对+1的值进行取反即可

4.独立按键控制LED移动

这里千万注意,变量创建一定要在main函数之后,前面不能有任何代码阻挡

cpp 复制代码
#include <REGX52.H>
#include <intrins.h>

void Delay(int num)		//@11.0592MHz
{
	while(num--)
	{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
	}
}


int main()
{
	unsigned char c = 1;
	int i = 0;
	P2 = 0xFE;
	while(1)
	{
		if(P3_0 == 0)
		{
			Delay(20);
			while(P3_0==0);
			Delay(20);
			
			i++;
			if( i == 8)
			{
				i = 0;
			}
			P2 = ~(c<<i);
		}
		if(P3_1 == 0)
		{
			Delay(20);
			while(P3_1 == 0);
			Delay(20);
			
			if(i == 0)
			{
				i=8;
			}
			i--;
			P2=~(c<<i);
		}

	}
	return 0;
}
相关推荐
早日退休!!!2 小时前
ARM Cortex-M核 【保存上下文&恢复上下文】
arm开发·单片机·嵌入式硬件
来自晴朗的明天2 小时前
差分控多少Ω阻抗
单片机·嵌入式硬件·硬件工程
WX131695189983 小时前
Fluke5720A 5725A福禄克5522A 5520A多功能校准器
科技·信息与通信·射频工程
点灯小铭3 小时前
基于单片机的多功能智能婴儿车设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
匠在江湖7 小时前
裸机单片机任务调度器实现:基于规范分层(COM/APP/SRV/DRV)架构,(附 任务调度器 / 微秒延时函数 / 串口重定向 源码)
单片机·嵌入式硬件·架构
GAOJ_K7 小时前
丝杆模组精度下降的预警信号
人工智能·科技·机器人·自动化·制造
点灯小铭7 小时前
基于单片机的智能洗碗机控制系统设计
单片机·嵌入式硬件·毕业设计·课程设计
清风6666669 小时前
基于单片机的电加热炉智能温度与液位PID控制系统设计
单片机·嵌入式硬件·mongodb·毕业设计·课程设计·期末大作业
一路往蓝-Anbo9 小时前
第五篇:硬件接口的生死劫 —— GPIO 唤醒与测量陷阱
c语言·驱动开发·stm32·单片机·嵌入式硬件
2401_8633261111 小时前
基于单片机智能光控路灯设计
单片机·嵌入式硬件