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);
    }

    }

    }
    }

  • 相关阅读:
    宿舍助手app——个人工作第四天
    宿舍助手app——个人工作第三天
    对QQ输入法的评价
    冲刺9
    冲刺8
    冲刺7
    冲刺6
    冲刺5
    冲刺4
    冲刺3
  • 原文地址:https://www.cnblogs.com/maycpou/p/13567355.html
Copyright © 2011-2022 走看看