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

51单片机关于按键切换两个函数的问题

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    void main()5 l1 m  _4 b3 X% s- F( V- J" S
    {, M3 C# N  W3 P4 ]
            init_eeprom();  //开始初始化保存的数据
    2 p7 S( a. C6 }        Init_LCD1602();        //初始化LCD1602
    ' j5 L6 d1 I: [) J0 O. P- l0 Z        EA = 0;                        //关闭中断总开关7 g# P$ Z: m$ C2 K) {( P
            Timer0_Init();        //初中始化完成,开断/ I# h: m) c; k  H$ U1 v
            EA = 1;                        //打开中断总开关
    6 o+ ?/ p0 n7 m' j' n' [        while(1)
      [. U- T3 Y3 E& K# A* C                {; Y  p- Z; p& K5 W& p" [
                    if(K1==0)  X1 G. w! @+ n9 U
                    delay(1000);6 p% m( i9 w; F/ h+ B2 ^' i
                            {' o( R8 q/ K+ ]' E8 e! O, M
                            while(K1==0)! y5 \# K* R$ [
                            qiehuan=~qiehuan;& K' h1 @6 @9 U% v3 S
                            }8 R* A: T4 J$ \5 T' M+ E- V% Q# I0 ~
                   / Z1 E% \/ K$ M5 I5 w8 r* |' r& }
                    if(qiehuan)
    + F- _% P$ k4 E( U+ B' v                        {
    ) e3 O' @1 n# W# G' I5 [' t                        init_eeprom();  //开始初始化保存的数据
    1 n( l# A7 ^/ _1 B                        Init_LCD1602();        //初始化LCD1602  c* G! q3 D3 U  r
                            EA = 0;                        //关闭中断总开关* Y# @. t* E: @" t3 Y) G
                            Timer0_Init();        //初中始化完成,开断
    # d' k* X' F( e4 i                        EA = 1;                        //打开中断总开关
    , Y& |9 q9 K% P( L                        chushi();3 n% U" \2 B! k" P+ D- c1 Y% K2 k
                                    if (FlagTest==1)   //每0.5秒称重一次; z; h; o( w4 ?" q+ c4 i! b$ n
                                    {. X; |( p2 X# D6 P0 @) P
                                    Get_Weight();  //读取一次重量
    ; G! Y( _% f* X) I1 M  w                                FlagTest = 0;  //读取变量清零/ B* u7 R7 c6 c! @$ p: k! w. x
                                    }         * Z. [% t  V- Z4 F. B: z
                                    KeyPress();                   //扫描按键1 d' v  K0 d6 L* F* B/ W; m" B
                            }
      F/ O5 H6 i1 s7 G1 r6 V- s                else
    - o5 Q' i8 `0 f; L                        {
    " x: _) C' S# t% i' c                         ck();
    7 X3 \& l' T8 R/ D/ h( n+ |                         Init_LCD1602();        //初始化LCD1602* ~0 V) g/ y; u! V/ t. ?
                             zf();
    2 R, W7 i# y) z3 H" u7 g                 LcdDisplay(Ds18b20ReadTemp());" u6 t/ t, x+ K" R
                            }
    5 G: ]/ X. _& s4 e2 _3 u                        delay(10000);" H& x" H2 f0 P& A9 r# R! ^
                    }/ L5 T5 _1 J/ M0 E5 D- [2 H* {
          
    & k. n4 e, w' `}. ?: e6 u4 R9 Q4 I: [% b

    ' P2 b( W- W: d' m* i为什么这里我用按键切换,不能稳定切换,而且当运行称重程序时不能称重了?
    ! E6 }6 p0 S! `3 v

    该用户从未签到

    2#
    发表于 2022-5-7 13:26 | 只看该作者
    你这个可能是    if(K1==0)  delay(1000); 按键消抖的时间太短了,我看delay是用while循环减,独立按键消抖一般在10ms,你这个应该只有1ms左右吧应该,我看最下面有个ms的延时函数,咋不用那个,另外我看Get_Weight()函数在主函数后面,我没在主函数前面找到声明

    该用户从未签到

    3#
    发表于 2022-5-7 13:42 | 只看该作者
    我看Get_Weight()在主函数后面,主函数前面也没有声明,虽然编译不知道为啥没错,但是应该是不行的吧。if(K1==0) delay(1000); 按键消抖的时间可能太短了,应该只有1ms,一般要10ms,所以会不稳定吧

    该用户从未签到

    4#
    发表于 2022-5-7 13:50 | 只看该作者
    错误
    : t( r' }& V1 d) L) \                if(K1==0)//无效
    1 j% p0 Z: |) O# j. G2 O( i+ O                delay(1000);//延时
    % x$ E% o8 r) W" ^. d' d0 V' x                {//无效
    2 |: o# S1 @6 j' K  g4 W                while(K1==0)//等待按键松手,没有分号分隔则无限循环执行下一条语句5 }: I. q+ [# h1 K  Y9 i2 H
                            qiehuan=~qiehuan;//等待按键松手期间不停取反
    , S1 g9 d$ O- H$ b9 q  m8 G3 z                }//无效
    : B* J5 Z* d8 V$ i4 P+ c8 t( P0 g# B9 a' _
    正确
    . F4 n. ^; @5 d5 O                if(K1==0)//按键按下
    3 q* Y5 I4 w! u/ U                {2 w6 G" {  W: [2 q: E# ~) L, q( K' U
                            delay(1000);//延时去抖
    0 V$ |. V) u7 y& [0 a7 |3 W                        if(K1==0)//延时后再次确认按键按下
    8 n5 Q/ L3 @$ g4 K1 ?( c% h                        {+ R1 j( ~+ ?3 P* j
                                    while(K1==0);//等待按键松手# u+ @5 O/ W* b+ b! \) I' ~
                                    qiehuan=~qiehuan;//取反
    . y1 V: e; [4 `* N/ \                        }' V, S  j* Y- \; @8 w. k4 w
                    }
  • TA的每日心情
    慵懒
    2022-1-21 15:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    5#
    发表于 2022-5-7 13:50 | 只看该作者
    首先就要考虑按键抖动,然后做好去抖,可以结合串口功能去进行调试
    5 _1 d/ D* C% U* V1 }- `" R0 V1 z; E
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-8-5 01:49 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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