【51单片机】Kn独立按键控制【LED亮灭】【LED状态】【LED二进制式显示】【LED不断移位】(4)

前言

大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁
主要内容含:
【51单片机】Kn独立按键控制【LED亮灭】【LED状态】【LED二进制式显示】【LED不断移位】(4)_第1张图片

欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!

  • YY的《C++》专栏
  • YY的《C++11》专栏
  • YY的《Linux》专栏
  • YY的《数据结构》专栏
  • YY的《C语言基础》专栏
  • YY的《初学者易错点》专栏
  • YY的《小小知识点》专栏
  • YY的《单片机期末速过》专栏
  • YY的《C++期末速过》专栏
  • YY的《单片机》专栏
  • YY的《STM32》专栏
  • YY的《数据库》专栏
  • YY的《数据库原理》专栏

目录

  • 一.前置操作
    • 1.独立按键介绍
    • 2.独立按键的原理图图与电平状态
    • 3.开发板图查询:对应独立按键,LED和MCU的原理图,找对应接口控制
    • 4.按键寄存器:利用【寄存器检测IO电平并返回的性质】
    • 5.LED:寄存器P2——>8位控制,P2_n——>1位控制
  • 二.【控制LED亮灭】
  • 三.【控制LED状态】
    • 1.按键抖动问题
    • 2.我们要采用【时间延迟】的原理规避这一现象
  • 四.【控制LED二进制式显示】
  • 五.【控制LED不断移位】

一.前置操作

1.独立按键介绍

  • 如图三所示,红色和黄色区域接触部分;当按钮按下时,图二中所示的金属片会将两部分(四引脚)链接;

【51单片机】Kn独立按键控制【LED亮灭】【LED状态】【LED二进制式显示】【LED不断移位】(4)_第2张图片

2.独立按键的原理图图与电平状态

  • 独立按键的原理图,注意
  • 我们在MCU的原理图中可以找到与其链接的L口
  • 单片机上电时,所有L口默认是 高电平;所以当按键按下时,L口就变为 低电平(接了独立按键的地线)

【51单片机】Kn独立按键控制【LED亮灭】【LED状态】【LED二进制式显示】【LED不断移位】(4)_第3张图片

3.开发板图查询:对应独立按键,LED和MCU的原理图,找对应接口控制

  • 我们根据开发图,发现P3.0~3.3控制按键;P2控制LED【51单片机】Kn独立按键控制【LED亮灭】【LED状态】【LED二进制式显示】【LED不断移位】(4)_第4张图片

4.按键寄存器:利用【寄存器检测IO电平并返回的性质】

  • 寄存器写一个值,它会送到L口上
  • 寄存器也会检测这个L口的电平,然后再重新读回寄存器中
  • 在这次独立按键实验中的现象就是:独立按键按下,寄存器值为0;松开寄存器值为1;
  • 反应到代码中即是
    在这里插入图片描述

5.LED:寄存器P2——>8位控制,P2_n——>1位控制

  • 右击头文件,点击打开
    【51单片机】Kn独立按键控制【LED亮灭】【LED状态】【LED二进制式显示】【LED不断移位】(4)_第5张图片
  • 我们可以看到P2_0~7分别单独控制1位,一共控制8位
  • 我们既可以通过8位控制LED,也可以1位1位单独控制
    【51单片机】Kn独立按键控制【LED亮灭】【LED状态】【LED二进制式显示】【LED不断移位】(4)_第6张图片
  • 1位控制:
    在这里插入图片描述
  • 8位控制: (不支持二进制直接转换,要换成十六进制)
    在这里插入图片描述

二.【控制LED亮灭】

  • 完整代码如下所示:
  • 烧写步骤可见博主【LED的三个基本项目(LED点亮&LED闪烁&LED流水灯)】关于烧写的部分:传送门
#include 


void main()
{
	   while(1)//保持不间断的执行流
		{
		  if(P3_1==0)//按下
			{
				P2_0=0;//灯灭
			}
			else//松手
			{
				P2_0=1;//灯亮
			}
		}

}
  • 现象:我们烧写入单片机后,可以发现按下k1按键,d1灯亮;松开,d1灯灭;

三.【控制LED状态】

1.按键抖动问题

  • 我们发现中间存在:
  • 2个抖动时间段(按下时)(松开时)
  • 1个中间时间段
  • 我们要采用【时间延迟】的原理规避这一现象
    【51单片机】Kn独立按键控制【LED亮灭】【LED状态】【LED二进制式显示】【LED不断移位】(4)_第7张图片

2.我们要采用【时间延迟】的原理规避这一现象

  • 自定义延时子程序传送门:传送门
  1. 我们在第一个抖动时间段(按下时)设置一个延时程序
  2. 在中间时间段时,设置一个判断按键状态的while循环while(P3_1==0);,使他实现【到达中间时间段,停下等待按钮状态:实现按下进入循环,松手跳出循环继续程序】
  3. 我们在第二个抖动时间段(松手时)设置一个延时程序
#include 

void Delay(unsigned int xms)		
{
	unsigned char i, j;

	while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	   xms--;
	}
}

void main()
{
	   while(1)
		{
		  if(P3_1==0)//按下
			{		
					Delay(20);//在前一段抖动时间延时
					
					while(P3_1==0);//到达中间时间段,停下等待按钮状态:实现按下进入循环,松手跳出循环继续程序
					
					Delay(20);//在后一段抖动时间延时
				
					P2_0=~P2_0;//取反
			}
		}
}
  • 现象:我们烧写入单片机后,可以发现按下k1按键,d1灯亮并保持;再次按下,d1灯灭并保持;

四.【控制LED二进制式显示】

  • 要让LED二进制式显示,那就是要对整个LED模块进行控制,意味着我们要用 8位的形式控制P2寄存器 ,而不是1位1位控制;
  • 我们设置一个unsigned char LEDNum=0;,让其在按下松开后++;控制LED模块的P2寄存器对其取反即可
  • 当LEDNum满了以后,即P2内状态为1111 1111 ,再次++,变为0000 0000,取反后变成1111 1111,灯灭;
#include 

void Delay(unsigned int xms)		
{
	unsigned char i, j;

	while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	   xms--;
	}
}

void main()
{
	unsigned char LEDNum=0;
	   while(1)
		{
		  if(P3_1==0)
			{		
					Delay(20);
					
					while(P3_1==0);
					
					Delay(20);
				
					LEDNum++;
					P2=~LEDNum;
			}
		}
}
  • 现象:我们烧写入单片机后,可以发现不断按下k1按键,LED灯呈2进制形式亮

五.【控制LED不断移位】

  • 我们要设计两个按钮,根据线路图,我们挑选P3.1和P3.0
    【51单片机】Kn独立按键控制【LED亮灭】【LED状态】【LED二进制式显示】【LED不断移位】(4)_第8张图片
    【51单片机】Kn独立按键控制【LED亮灭】【LED状态】【LED二进制式显示】【LED不断移位】(4)_第9张图片

要确保两个按钮共同控制,因此要设置:

  • 一个常量unsigned char LEDNum=8;
  • P2寄存器初始地址0x01;,左右变换都从初始地址出发
#include 

void Delay(unsigned int xms)		
{
	unsigned char i, j;

	while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	   xms--;
	}
}


unsigned char LEDNum=8;//常量

void main()
{
		P2=~0x01;
	   while(1)
		{
		     if(P3_1==0)
			{		
			    Delay(20);
				while(P3_1==0);
				Delay(20);
				
				if(LEDNum>=8)
				{
					LEDNum=0;
				}
				else
                {
				  LEDNum++;
				}
				P2=~(0x01<<LEDNum);
			}
             if(P3_0==0)
		      {		
				Delay(20);
				while(P3_0==0);
				Delay(20);
				
			   if(LEDNum==0)
				{
					LEDNum=7;
				}
				else
                {
				  LEDNum--;
				}
				P2=~(0x01<<LEDNum);
			}
		}
}
  • 现象:我们烧写入单片机后,可以发现不断按下k1按键,LED往左移一格亮;按下k2按键,LED往右移一格亮

你可能感兴趣的:(YY滴《单片机系列》,51单片机,mongodb,数据库)