找回密码
 注册
关于网站域名变更的通知
查看: 283|回复: 4
打印 上一主题 下一主题

关于按键去抖

[复制链接]
  • TA的每日心情
    开心
    2022-1-29 15:04
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2022-5-17 13:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    我想用定时器10ms中断进行软件去抖   求大神指点一二6 n+ k: t2 t) j+ U
  • TA的每日心情
    开心
    2022-1-29 15:04
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2022-5-17 15:11 | 只看该作者
    先根据中断或查询判断第一次,然后启动定时器,50mS左右为佳。定时器溢出后再查询一次,键值相同则认为键有效,否则判断为抖动,然后转向相应的流程即可。
  • TA的每日心情
    开心
    2022-1-29 15:03
  • 签到天数: 2 天

    [LV.1]初来乍到

    3#
    发表于 2022-5-17 16:37 | 只看该作者
    定时中断里面检查按键,如无键按下则清键按下标记清键值,转该定时中断里面应该执行的其它程序,如有键按下则检查标记,如无键按下标记,做标记并纪录键值,然后转该定时中断里面应该执行的其它程序,如有键按下标记,检查此次键值是否与上次纪录键值相同,相同则执行键按下程序,不同则认为是误动作,与无键按下相同处理。
  • TA的每日心情
    奋斗
    2023-11-14 15:58
  • 签到天数: 230 天

    [LV.7]常住居民III

    4#
    发表于 2022-5-17 16:43 | 只看该作者
    本帖最后由 sucideonce 于 2022-5-17 16:49 编辑 . a) S2 i1 e! v7 R

    1 k. o" A( h& S3 O8 ^* M' M, R+ l之前保存过得代码,希望对你有用。
    8 k7 y9 w. \; ~8 y+ w
    8 M. Z1 _. ~$ l) D: F#include <reg51.h>
    ( ^9 h+ s3 ~4 ?2 E0 Rsbit key=P1^0;  //定义key为P1.0% X- W2 E2 i" M/ ^* a& |3 k, s& ]/ @: @
    sbit led=P2^0; //定义LED为P2.0
    $ O% G4 E& \4 {7 S/ }# a" @: Y1 i% z7 J2 H# ?
    void main(void)6 @8 ^  @( m. h- y% N6 o
    {& j$ l- a9 g7 L% k+ J. X( Z
            TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。8 s  E) W) _$ `1 t6 ]9 p
            TH0=(65536-10000)/256;        //给定时器赋初值,定时10ms7 {2 e# s) o9 @2 B5 P( g: |) Q5 F
            TL0=(65536-10000)%256;! o: t- p. J& {, L. L6 |9 s
            ET0=1;//打开定时器0中断允许
    5 P) e# G' l* `1 f4 K1 X& z        EA=1;//打开总中断
    0 P' d, V# E% y: o7 p" u0 F" h5 K        TR0=0;//关闭定时器                        * i8 V- P5 s% j3 P( h2 U
            while(1)
    : c- f* z8 l! r, a6 x8 Q1 w$ j        {
    7 Q) v1 V2 R0 x! t; L; Z) p! M4 C                if(key==0)          //读P1.0引脚,如果引脚为低电平,则进入if
      {/ q- v% b- d2 g0 ?7 m& R                {
    1 N+ C  Z! o6 t- ~9 @% E, w                        TR0=1;//打开定时器
    ) O( Q6 l- s' v3 r# K                }% e+ L$ m/ a2 ?2 I( u' A- q
            }9 p! g1 Y3 u. A" u3 D; _
    }; c3 h* c' U4 N+ J2 h6 m
    8 E5 [2 `/ a3 F; J( \
    /*定时器中断*/9 I8 D' ?" f0 u3 a
    void Timer0() interrupt 1
    2 _  e) z! y4 N, a9 b) w{
    8 _' J1 e" W, z, G" }        TH0=(65536-10000)/256;        //给定时器赋初值,定时10ms8 t( C& }1 r8 G$ e
            TL0=(65536-10000)%256;        
    5 u1 e! d- k2 i- Z  ]6 y; x  O  d' |9 ?' ?0 Y
            TR0=0;//打开定时器! |" \; W( Q, e$ |/ g' w2 |
            if(key==0)         //再次判断按键是否按下' `7 ^+ B- e4 b- T  l# Z! X0 P5 i
            {        5 V! r! }# g6 `6 o
                    led=!led;
    1 G/ C+ B0 N! u* F* N5 |! ?* r                while(key==0);          //等待按键松开
    . A3 s  p! R" ~9 s3 e. x$ t        }
    : Z1 o# W+ S8 A8 Z9 y}
  • TA的每日心情
    开心
    2022-1-29 15:03
  • 签到天数: 1 天

    [LV.1]初来乍到

    5#
    发表于 2022-5-17 16:44 | 只看该作者
    if(key == 0)
    4 F3 L0 k: O0 o7 M& Y% c/ _{  R( `2 f3 s0 t0 f- i5 H
        key_value = 某个按键;5 ^% p* k4 A% ^4 k
        开启定时器;
    ) [0 Y) M: G' R: T: u}$ r; Q9 g, \  `
    //定时器中断函数
    2 m! c: h0 m# jvoid timer_isr(), v6 |. \3 O0 \5 y$ j
    {
    5 S1 `( |; }0 s9 u8 B    if(key_value = 某个按键)
    * i" U4 Z% [# j) _- Q! E( t    {! [( N! x" e2 y9 E4 I
            if(key == 0)
    5 @! U8 p7 X! H+ C4 k        {
    ( `5 L4 A9 n1 I# F+ O  _6 j* U            运行按键按下程序' h3 p9 F  V4 R0 h9 T) z
            }
    + Y8 B, M, @( W/ L; B& {0 L* Q, t0 p    }, t# G' i7 [; @3 _3 R7 B- _* d
        key_value清除标志位。
    - u4 J5 G1 a: a+ q, d}
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-8-7 19:59 , Processed in 0.109375 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表