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

关于按键去抖

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    我想用定时器10ms中断进行软件去抖   求大神指点一二- _0 r/ h: S% A
  • 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 编辑   O( @7 J& i3 U7 N& V5 n/ ]) H4 c) Z

    ( G# x" R1 L6 f$ \. F5 L之前保存过得代码,希望对你有用。) n) w, o" x6 i2 [
    " c% L, T! X( K% T% i# p$ f5 i
    #include <reg51.h>
    ( c" r3 t6 \( O. \7 ksbit key=P1^0;  //定义key为P1.0, R# i& ^5 Q( e! e# U
    sbit led=P2^0; //定义LED为P2.0
    % W% q& ?6 i# m/ A7 Y3 R. @. W* O9 m' B7 j: G
    void main(void)' C4 }& E  U+ s- j6 b' c
    {2 I8 n; ?2 {, Y- L
            TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
    1 x. x2 S3 {6 y" w9 P  L        TH0=(65536-10000)/256;        //给定时器赋初值,定时10ms6 P: Z$ l; i8 t. F) z* _
            TL0=(65536-10000)%256;
    . K' _: C) r6 a% `$ Z- P        ET0=1;//打开定时器0中断允许
    ; n& ?* }  h- {        EA=1;//打开总中断
    5 M2 t  U4 T* y. {) a+ ?, I4 j- s. R        TR0=0;//关闭定时器                        : [/ \' k. T0 u
            while(1)8 }, f" R: {9 M8 Y* ]* }% F
            {$ n! E1 ?4 M( l2 M; P) X
                    if(key==0)          //读P1.0引脚,如果引脚为低电平,则进入if
    $ i1 Z) L) z4 @6 D9 c                {4 z* ?# ^/ f% y# b( g
                            TR0=1;//打开定时器
    $ W7 g8 E: \! O. B2 o* C                }: ]7 t+ ~7 l( n! w
            }
    # b( v2 q3 G' e, p}" M, }8 t  \5 I9 i
    / e2 g' ?" `2 m  \
    /*定时器中断*/+ q$ b7 t1 D. l
    void Timer0() interrupt 13 q% {( H5 @. S* ?' p8 g! K; H
    {9 O- l0 Z* {$ ?
            TH0=(65536-10000)/256;        //给定时器赋初值,定时10ms
    8 N! P( b0 c0 O3 D9 o        TL0=(65536-10000)%256;        $ Z9 ]$ Z* `5 V6 o

      ]. U$ Z5 |5 h        TR0=0;//打开定时器; W. h* }' ]7 v& E8 ]
            if(key==0)         //再次判断按键是否按下# o/ c! @' s' y! t/ `, c& }
            {        
    ; i0 X8 S, u$ p' o# _                led=!led;3 @. ?' X  U) v( H
                    while(key==0);          //等待按键松开
    3 k- b" X7 j, y# ~        }9 [9 B6 K: I  M. i
    }
  • TA的每日心情
    开心
    2022-1-29 15:03
  • 签到天数: 1 天

    [LV.1]初来乍到

    5#
    发表于 2022-5-17 16:44 | 只看该作者
    if(key == 0)
    & _: k1 ]6 A' l, |9 G' Y) b3 Z{6 n) D8 h7 m% \6 o
        key_value = 某个按键;. e# G' L/ Z. y4 a6 j
        开启定时器;
    , J! X  w  \+ G3 }8 K2 G- h' U}
    # \% u+ {5 ~& s. J# R//定时器中断函数+ Q2 {1 n" v; P1 {
    void timer_isr()
    ( c9 U! U3 e  [( i5 I, L{
    . T6 C4 F3 l- \7 d# Y    if(key_value = 某个按键): ^, b9 k6 o5 c- R6 p4 {
        {
    % B7 v# i- ^# w1 N        if(key == 0). g6 C* k1 i: \/ X: C$ C" c% e- ^
            {
    ; E, Z3 w0 W! [8 l/ C& u6 W2 V            运行按键按下程序6 j" @& [. i- `: l* d5 B1 z& u
            }0 F2 H( Z8 i9 k7 k4 e% H* d
        }
    6 Z6 _# E% @3 f: Q    key_value清除标志位。
    / u, S' q, c: k! E+ O+ c}
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-7-20 01:40 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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