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

关于按键去抖

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    我想用定时器10ms中断进行软件去抖   求大神指点一二! U  g- n" d' }
  • 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 编辑
    9 b% K1 m2 H- P1 X8 A" s# V1 z% F- ?
    之前保存过得代码,希望对你有用。
    * l& z: h/ v5 ~% S4 Q" D% K  w6 Q
    8 r! T$ N$ k2 {" z1 g0 P) [#include <reg51.h>' ?, X8 X$ K* h
    sbit key=P1^0;  //定义key为P1.09 o/ v2 R, A. M% h3 Y
    sbit led=P2^0; //定义LED为P2.00 M3 P) w- p- k8 {, e

    8 W! @! {0 s% V/ C& h: `1 \void main(void)8 e& z3 I! |. F3 a% n
    {
    4 c2 I5 G) n' ?        TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。* H0 j# u( X1 d" b9 ?5 m& w. p
            TH0=(65536-10000)/256;        //给定时器赋初值,定时10ms1 n# G! f" O' s- k) [8 \9 i8 _
            TL0=(65536-10000)%256;/ t; c- x- K7 Z. S8 E7 i: X
            ET0=1;//打开定时器0中断允许
    8 i5 n4 j4 G+ E% |2 `        EA=1;//打开总中断& g8 `; t5 p' S. B3 b- N
            TR0=0;//关闭定时器                        - l; V" u% |2 k0 e4 I5 b3 D7 W
            while(1)
    * X2 p& ^" g% b5 R) Y1 x5 J        {
    3 ^! z/ _1 {8 {) _! t& r                if(key==0)          //读P1.0引脚,如果引脚为低电平,则进入if; H( a6 y2 H8 s: P
                    {
    0 p( C; s) N+ G# f% _; K% U                        TR0=1;//打开定时器
    , i9 H3 e% @* f) X- ^& G                }, Z3 w. n/ k! R0 d. w
            }8 F3 e9 q0 y$ Z1 B. S; S) |0 ?
    }
    / k4 L+ j0 F& U2 c2 S6 p0 ~7 k5 Q/ o& R
    /*定时器中断*/, u# ?( A" ~$ ^5 m
    void Timer0() interrupt 1
    ' z( M: t& ?4 k& {{9 J, C, u$ Q8 Y5 C5 k7 U9 K
            TH0=(65536-10000)/256;        //给定时器赋初值,定时10ms
    $ z$ v' z" d- n        TL0=(65536-10000)%256;        
    3 |  G7 `2 b5 p% V. e
    / N0 X, }  R# M: P9 C  Y5 I/ I        TR0=0;//打开定时器
    / j5 L& `; [0 a        if(key==0)         //再次判断按键是否按下
    ; j: V1 f( r( b% g) q6 j* `        {        
    . {- V, U( b0 b9 t9 T# x7 ?                led=!led;
    - l# {$ s* K% M                while(key==0);          //等待按键松开
    ! a' J# e4 w. k$ D8 r7 u. u        }* m8 ^8 O, u  |4 j' d) Q% N% F
    }
  • TA的每日心情
    开心
    2022-1-29 15:03
  • 签到天数: 1 天

    [LV.1]初来乍到

    5#
    发表于 2022-5-17 16:44 | 只看该作者
    if(key == 0)1 p& F; W3 V& y0 Z3 a
    {" t! m+ ?7 g8 D3 i! Q* E
        key_value = 某个按键;: J+ X% [  K! v- B; `. B
        开启定时器;
    : q3 a, x3 T; C3 Y}. W( `- y3 J- U& o4 t: }& E
    //定时器中断函数
    1 z8 L+ i, `+ P5 o. N& Svoid timer_isr()6 ]6 ~5 Q, g8 q' {  R9 [
    {
    ( L) D8 x5 F! w* r# i9 \7 F8 l. n    if(key_value = 某个按键)
    % [2 d  \; M8 ?, G. Y* \1 d, a5 \; ]    {$ z: Q9 \4 V$ \6 A
            if(key == 0)5 v7 N7 e5 T8 y! T2 y( J
            {
    6 P) t" j$ @5 l  m" z5 Z+ a2 B            运行按键按下程序  i2 K* ~' F1 m8 T
            }
    / x" p+ b! o" ~9 S( Y0 ?& W    }4 n$ f9 A% q, K0 x" ~( h# i$ v6 F
        key_value清除标志位。
    ' y- s) d2 b# l6 H( f}
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-10-9 07:11 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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