51单片机按键

简介: 学习按键处理

[TOC]

一、LED灯是什么

LED是一个发光二极管,当一段为高电平另一端为低电平就可以点亮。但是需要注意,这个有规定高电平端和低电平端,如果两个端口反了,LED点亮不了。

LED的使用范围很广的,多个LED组合在一起就可以变成一个LED矩阵,比如说后面介绍的8*8LED矩阵,其实就是将64个LED灯组合在一起就变成了8*8LED矩阵了

二、原理图

LED灯在开发板的原理图如下:

img

这个板子上的LED灯是需要负极才能进行点亮,因为有一端是接到正极的,所以另一端需要给低电平才可以进行点亮。

另一端是接到单片机上的P2引脚,我们可以通过的控制P2引脚进行控制LED的亮或者灭。

三、对LED进行操作

1.点亮第一个LED灯

首先学习点亮一个LED灯,这个是最基础的,也是必须经过的一个任务。

从上面我们知道了,要点亮一个LED灯需要给一个低电平,所以我们可以控制需要控制P2引脚的电平来让LED亮。

比如说要让第3个LED点亮,代码就可以这样写:

#include <at89x51.h>
void main(){
   
   
    P2_3 = 0;
}

这样就可以让第三个LED灯亮了。

img

当然也可以使用操作P2组来实现这个操作,但需要先计算一下,第三个LED是P2组中第3个引脚进行控制的,所以需要让第三个引脚为低电平,其它引脚为高电平,所以给P2组的二进制内容应该为1111 0111,翻译为十六进制的内容就为0xF7。

#include <at89x51.h>
void main(){
   
   
    P2 = 0xF7;
}

这样也可以实现点亮。

2.LED双数点亮

让LED里为2的倍数的LED灯进行点亮,这个操作很简单,可以有两种方法,第一种是位操作。

#include <at89x51.h>
void main(){
   
   
    P2_0 = 0;
    P2_2 = 0;
    P2_4 = 0;
    P2_6 = 0;
}

但是代码量比较多,这里还是比较推荐组操作,直接操作P2组

#include <at89x51.h>
void main(){
   
   
    P2 = 0x55;
}

3.LED流水灯

这个是在点灯中比较有技术含量的,流水灯就是第一个亮完后第二个亮,然后到最后一个后又倒回来继续点亮,以此类推。

首先可以使用一个最简单的方式,就是对位进行操作

#include <at89x51.h>
void main(){
   
   
    while(1){
   
   
        P2_0 = 0;
        P2_7 = 1;

        P2_1 = 0;
        P2_0 = 1;

        P2_2 = 1;
        P2_1 = 0;

        P2_3 = 0;
        P2_2 = 1;

        P2_4 = 0;
        P2_3 = 1;

        P2_5 = 0;
        P2_4 = 1;

        P2_6 = 0;
        P2_5 = 1;

        P2_7 = 0;
        P2_6 = 1;
    }
}

可以发现是不是代码量非常的高,而这种方法一般不推荐,因为很麻烦,我们一般对组进行操作,代码如下:

#include <at89x51.h>
void main(){
   
   
    P2 = 0xFE;
    P2 = 0xFD;
    P2 = 0xFB;
    P2 = 0xF7;
    P2 = 0xEF;
    P2 = 0xDF;
    P2 = 0xBF;
    P2 = 0x7F;
}

当然,代码量还是非常的多,那么还有什么更好的方法吗?

其实还是有的,这种方法需要对C语言了解的比较深,对一些运算符的了解要深刻一点,代码如下:

#include <at89x51.h>
void main(){
   
   
    char i, x = 0xFE;
    while(1){
   
   
        for (i = 0; i < 8; i++){
   
   
            P2 = ~(~x << i);
        }
    }
}

这个代码量就会很小,大家可以慢慢研究一下,这个也非常的简单,C语言学得好基本上很快就看得懂了。

但是当我把这个代码跑起来后,会发现它变成这种情况:

img

为什么会出现这个情况呢?

因为单片机的运行速度非常快,它执行完这个代码只需要几微秒或者几毫秒就可以执行完,我们人眼根本就看不见。

为了处理这个问题我们可以添加一个延迟函数,当它执行完这行代码后,让它去另一个代码里转一下,等转完就可以继续回来执行,延迟函数的写法很简单,下面是一个简单的延迟函数:

void delay(){
   
   
    int i, j;
    for (i = 0; i < 100; i++){
   
   
        for (j = 0; j < 200; j++);
    }
}

然后将写好的延迟函数添加到刚才写的代码里面

#include <at89x51.h>
void delay(){
   
   
    int i, j;
    for (i = 0; i < 100; i++){
   
   
        for (j = 0; j < 200; j++);
    }
}
void main(){
   
   
    char i, x = 0xFE;
    while(1){
   
   
        for (i = 0; i < 8; i++){
   
   
            P2 = ~(~x << i);
            delay();
        }
    }
}

这样就可以看到LED流水灯的效果了。

延迟函数可以使用一些软件进行生成。

四、延迟函数的生成

这里使用的STC-ISP烧录软件做演示,首先打开软件

img

然后找到软件延迟计数器

img

然后选择条件

img

这里选择11.0592MHz 这个频率是根据你单片机上接的晶振频率来选择的,1毫秒,指令集选择Y6,这里的指令集是根据你的单片机信号来选择的,它会有提示的,根据提示来选择指令集。

然后点击生成代码就可以得到代码了,然后将代码写入进你的文件中进行调用即可。

void delay(){
   
   
    unsigned char i, j;
    i = 15;
    j = 90;
    do
    {
   
   
        while (--j);
    } while (--i);
}

当然你也可以改成执行传入的毫秒数

void delay(unsigned int time){
   
   
    unsigned char i, j;
    while(time--){
   
   
        i = 15;
        j = 90;
        do
        {
   
   
            while (--j);
        } while (--i);
    }
}

因为我们生成的是1毫秒,那么我们让这1毫秒重复100次是不是就是100毫秒了。

目录
相关文章
【单片机】按键声光报警实验(蜂鸣器)
【单片机】按键声光报警实验(蜂鸣器)
567 0
|
3月前
【51单片机】独立按键,每个按键不同功能,数码管数值的加减,控制流水灯模式,包含按键消抖,数码显示,流水灯
【51单片机】独立按键,每个按键不同功能,数码管数值的加减,控制流水灯模式,包含按键消抖,数码显示,流水灯
218 1
|
3月前
【51单片机】在LCD1602上显示时间:包含按键进行校准时间+闹钟功能:按键设置闹钟响铃时间,以及响铃的时间长度
【51单片机】在LCD1602上显示时间:包含按键进行校准时间+闹钟功能:按键设置闹钟响铃时间,以及响铃的时间长度
|
3月前
51单片机用汇编语言实现独立按键检测,每个按键有不同功能,包含按键消抖程序
51单片机用汇编语言实现独立按键检测,每个按键有不同功能,包含按键消抖程序
|
3月前
|
C语言
【51单片机】LCD1602显示字符串,时间、时间+按键校准、秒表计时的功能代码。
【51单片机】LCD1602显示字符串,时间、时间+按键校准、秒表计时的功能代码。
【51单片机】利用【时间延迟】的原理规避【按键抖动问题】
【51单片机】利用【时间延迟】的原理规避【按键抖动问题】
【51单片机】Kn独立按键控制【LED亮灭】【LED状态】【LED二进制式显示】【LED不断移位】(4)
【51单片机】Kn独立按键控制【LED亮灭】【LED状态】【LED二进制式显示】【LED不断移位】(4)
定时器+按键控制LED流水灯模式+定时器时钟——“51单片机”
定时器+按键控制LED流水灯模式+定时器时钟——“51单片机”
|
6月前
|
C语言
独立按键控制LED亮灭、独立按键控制LED状态、独立按键控制LED显示二进制、独立按键控制LED移位——“51单片机”
独立按键控制LED亮灭、独立按键控制LED状态、独立按键控制LED显示二进制、独立按键控制LED移位——“51单片机”
单片机按键的使用
单片机按键的使用
164 0