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

关于按键去抖

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    我想用定时器10ms中断进行软件去抖   求大神指点一二
    2 r/ a# f( {, v9 p7 v
  • 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 编辑
    $ B) f- f9 h/ ]
    ( k1 [6 e/ ^3 P: N. i之前保存过得代码,希望对你有用。4 e* q$ J7 R1 S+ b  t6 [4 d

    * v- ?( ?* n2 }$ v- J7 Q#include <reg51.h>. K/ O! {' ?4 t! Z3 r4 Z0 c
    sbit key=P1^0;  //定义key为P1.0
    ; ?5 L. D2 ]. Asbit led=P2^0; //定义LED为P2.0
    ; ^6 A1 h7 D$ m: {9 o- j( J* w" N! D
    void main(void)
    0 e( M3 U0 K1 G+ a$ U1 E{" t- u1 k* E# h" h3 G8 n$ C
            TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。1 p$ D7 |% R# J0 r! ^' s
            TH0=(65536-10000)/256;        //给定时器赋初值,定时10ms
    , j. V( _% o) `9 C2 L        TL0=(65536-10000)%256;- B: Y; A) A0 }. ^# ^3 o9 N
            ET0=1;//打开定时器0中断允许. C4 y' u  E$ _+ _
            EA=1;//打开总中断. t) t* [8 @0 K' k
            TR0=0;//关闭定时器                          Q( A6 @# w7 \. |3 D
            while(1)
    + k! K: x) Q2 Q- f1 p" m% Z        {
    & i* ]4 ]% J0 B. }. _                if(key==0)          //读P1.0引脚,如果引脚为低电平,则进入if
    6 C& Z5 c9 s: |' n( O6 E: _, v9 V                {  u& F4 j" k7 A. C5 s
                            TR0=1;//打开定时器; u; e& T; W3 j) \( s4 O/ ]
                    }+ q+ Z% t" h1 r8 j6 ^" B$ m# }
            }0 j2 |& H  C* b0 A! @
    }% |! z' K6 G- b. C. i# l9 w: _( M  b+ ^
    " O4 h# h& x5 h8 N4 r. r9 _, w1 h& g
    /*定时器中断*/
    # ?, I% q+ t) Y$ V$ _; @- xvoid Timer0() interrupt 13 b7 Z+ p) J4 c$ p/ o5 w+ T* P; y
    {
    / [/ ]; A6 E' J4 ]2 A4 h        TH0=(65536-10000)/256;        //给定时器赋初值,定时10ms
    % T# L$ u0 R9 n$ Q        TL0=(65536-10000)%256;        5 P: L1 D/ Y, B0 P, }7 ^; M& P
    ; J6 y: x/ D0 D; i( m+ d. \& F
            TR0=0;//打开定时器/ o  G% I* N; G# R( P
            if(key==0)         //再次判断按键是否按下$ o! j, x- K! _$ J; G. ~
            {        
    : r0 |' C# e9 C6 j. B$ Y                led=!led;
    / t+ X; b" N. w                while(key==0);          //等待按键松开
    + x. Z- S7 G: h' a        }% V5 G; o7 D0 Q7 l
    }
  • TA的每日心情
    开心
    2022-1-29 15:03
  • 签到天数: 1 天

    [LV.1]初来乍到

    5#
    发表于 2022-5-17 16:44 | 只看该作者
    if(key == 0)
    # V3 Q6 }0 ?& u, O( ?' t{! T" w  y' S1 J$ J/ a
        key_value = 某个按键;
    8 g3 @4 B% C* V6 T    开启定时器;
    " ]7 f$ y+ f% D! I}
    : x! A) u4 v9 J//定时器中断函数
    1 @( ~4 e7 g: |$ P) |2 O9 Y# gvoid timer_isr()7 f  e4 |+ w0 ~, Y
    {
    $ M( a8 ^: |9 \5 c/ @0 v* r    if(key_value = 某个按键)
    # E/ t  ?! I# h6 {9 F    {
    # s# x8 E+ _2 Y* o+ P. R: d        if(key == 0)
    $ |  g: \" x2 S: u* A        {6 g- h; N. F0 [" ^4 e
                运行按键按下程序  I4 [% q! d; p# ^
            }
    2 L. \% u4 n: U4 s2 F    }8 a& k: X- q% `
        key_value清除标志位。$ j. H/ U2 b7 Q( \- x3 c
    }
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-6-20 04:18 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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