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

    }

    }
    }

  • 相关阅读:
    runas用法
    转:在 DB2 9.7 for Linux, UNIX, and Windows OLTP 环境中使用 EMC Enterprise Flash Drives 的好处
    Dlink路由器的special application 功能
    对称加密和非对称加密
    转:Windows 7加密促使犯罪几率上升
    S60V5版本的手机QQ支持截图、语音和视频功能
    各类存储设备速度比较
    DiffieHellman密钥交换协议工作过程
    转:QQ圈子:社交神器还是隐私魔鬼?
    转:你对存储性能了解多少?
  • 原文地址:https://www.cnblogs.com/maycpou/p/13567355.html
Copyright © 2011-2022 走看看