• 按键输入


    单片机的按键在按下时会对应的引脚会变成低电平也就是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);
    }

    }

    }
    }

  • 相关阅读:
    minio 对于压缩的处理
    mino federation 功能
    Full Schema Stitching with Apollo Server
    GraphQL Gateway Architectures
    Modularizing your graphQL schemas
    gearman openresty 集成试用
    madlib 集成 hasura graphql-engine 试用
    Oracle数据库--解决单张表中数据量巨大(大数据、数据量上百万级别,后查询,更新数据等耗时剧增)
    绝对干货,教你4分钟插入1000万条数据到mysql数据库表,快快进来
    几款开源的ETL工具及ELT初探
  • 原文地址:https://www.cnblogs.com/maycpou/p/13567355.html
Copyright © 2020-2023  润新知