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

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

前言

大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁

主要内容含:

一.前置操作

1.独立按键介绍

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

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

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


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

  • 我们根据开发图,发现P3.0~3.3控制按键;P2控制LED


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

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

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

  • 右击头文件,点击打开
  • 我们可以看到P2_0~7分别单独控制1位,一共控制8位
  • 我们既可以通过8位控制LED,也可以1位1位单独控制
  • 1位控制:
  • 8位控制: (不支持二进制直接转换,要换成十六进制)

二.【控制LED亮灭】

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


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

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

三.【控制LED状态】

1.按键抖动问题

  • 我们发现中间存在:
  • 2个抖动时间段(按下时)(松开时)
  • 1个中间时间段
  • 我们要采用【时间延迟】的原理规避这一现象

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

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

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 <REGX52.H>

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

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

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

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往右移一格亮
相关文章
|
4月前
【51单片机】独立按键,每个按键不同功能,数码管数值的加减,控制流水灯模式,包含按键消抖,数码显示,流水灯
【51单片机】独立按键,每个按键不同功能,数码管数值的加减,控制流水灯模式,包含按键消抖,数码显示,流水灯
356 1
|
4月前
【51单片机】在LCD1602上显示时间:包含按键进行校准时间+闹钟功能:按键设置闹钟响铃时间,以及响铃的时间长度
【51单片机】在LCD1602上显示时间:包含按键进行校准时间+闹钟功能:按键设置闹钟响铃时间,以及响铃的时间长度
108 4
|
4月前
51单片机用汇编语言实现独立按键检测,每个按键有不同功能,包含按键消抖程序
51单片机用汇编语言实现独立按键检测,每个按键有不同功能,包含按键消抖程序
141 3
|
4月前
|
C语言
【51单片机】LCD1602显示字符串,时间、时间+按键校准、秒表计时的功能代码。
【51单片机】LCD1602显示字符串,时间、时间+按键校准、秒表计时的功能代码。
【51单片机】利用【时间延迟】的原理规避【按键抖动问题】
【51单片机】利用【时间延迟】的原理规避【按键抖动问题】
|
7月前
|
编译器 C语言 C++
【51单片机】LED的三个基本项目(LED点亮&LED闪烁&LED流水灯)(3)
【51单片机】LED的三个基本项目(LED点亮&LED闪烁&LED流水灯)(3)
定时器+按键控制LED流水灯模式+定时器时钟——“51单片机”
定时器+按键控制LED流水灯模式+定时器时钟——“51单片机”
|
7月前
|
C语言
独立按键控制LED亮灭、独立按键控制LED状态、独立按键控制LED显示二进制、独立按键控制LED移位——“51单片机”
独立按键控制LED亮灭、独立按键控制LED状态、独立按键控制LED显示二进制、独立按键控制LED移位——“51单片机”
|
7月前
|
编译器 C语言 开发者
单片机原理与应用:探索微型计算机世界
单片机原理与应用:探索微型计算机世界
59 1
|
7月前
|
数据采集 数据处理 C语言
单片机:探索其原理、应用与编程实践
单片机:探索其原理、应用与编程实践
110 1
下一篇
DataWorks