zoukankan      html  css  js  c++  java
  • 按键输入

    单片机的按键在按下时会对应的引脚会变成低电平也就是0。所以只要判断值是否变为0就可以判断是否有按键按下。

    按键对应的引脚一般在单片机上按键旁边都会有标示。

    我的单片机上自带的按键是一种机械按键,就是按下后会马上自动弹起。也就是说引脚的值会有1变为0再变回1。

    下面是按下按键后点亮灯,再按下熄灭灯的代码:

    #include <reg52.h>
    #include <intrins.h>

    sbit Key1 = P3^2;

    sbit LED0 = P0^0;

    void main(){
    LED0 =1;
    while(1){

    if(Key1==0){
    LED0 = ~LED0;
    }

    }
    }

    实践后发现上面的代码有时候不灵,就是按下后灯还是不熄灭或者不亮。

    原因是,这个机械按钮有一个叫做机械抖动的现象。就是按下按钮后,并不按钮马上由1变为0再变为1,中间有一段时间的抖动前摇和抖动后摇,就是在由1变为0的时候,由一段时间处于不稳定时期会在1/0之间反复跳动,然后才稳定在0一段时间,然后按键弹起后又会抖动一段时间再稳定在1。抖动的时间长短不定一般在5~10ms。

    消除抖动可以通过硬件的方式也可以用软件的方式。我们这里用软件的方式,原理就是检测到变为0后再延迟10ms再检测值如果还是为0我们才执行代码,以确保抖动时间已过。然后让值为1后才完成该次代码执行(因为会在值为0的时候接触一段时间才变为1,这段时间如果我们代码执行完了,则又会再次检测值是否为0会导致一次按下多次执行)。

    修改后的代码:

    #include <reg52.h>
    #include <intrins.h>

    sbit Key1 = P3^2;

    sbit LED0 = P0^0;

    void Delay10ms() //@11.0592MHz
    {
    unsigned char i, j;

    i = 108;
    j = 145;
    do
    {
    while (--j);
    } while (--i);
    }

    void main(){
    LED0 =1;
    while(1){

    if(Key1==0){
    Delay10ms();
    if(Key1==0){
    LED0 = ~LED0;
    while(Key1==0);
    }

    }

    }
    }

  • 相关阅读:
    2.16 C++类与new和delete操作符
    2.15 C++常量指针this
    2.14 C++析构函数
    2.13 C++拷贝构造函数
    2.12 C++ explicit关键字详解
    2.11 C++转型构造函数
    2.10 C++利用构造函数限制对象的创建
    2.9 C++使用默认参数的构造函数
    2.8 C++参数初始化表
    linux 查看进程启动路径
  • 原文地址:https://www.cnblogs.com/maycpou/p/13567355.html
Copyright © 2011-2022 走看看