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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    void main()
    * c+ {$ @! [. m* Y4 W  h5 g' T( L{
      G1 l+ q! `& v, @& ~        init_eeprom();  //开始初始化保存的数据
    " {/ `" m9 f0 |9 I3 [1 c* G        Init_LCD1602();        //初始化LCD1602* c3 s9 n6 F" t6 {2 B) K
            EA = 0;                        //关闭中断总开关
    . C4 r/ t+ }6 z" }        Timer0_Init();        //初中始化完成,开断7 B& D( u# F0 x( J6 ]
            EA = 1;                        //打开中断总开关& o# ?9 I/ h( A
            while(1)
    + P$ w/ \7 I+ \$ r% n                {$ r3 q$ w# ~, g. m$ F7 ]( a% F
                    if(K1==0)4 |! H" q3 X9 [& G6 A( e" U6 f7 R
                    delay(1000);2 `# l- o8 h4 J( G; l8 H3 e
                            {
    . g' b6 w1 V- c+ d                        while(K1==0)
    4 V5 n! M0 o$ H* X  ]! L                        qiehuan=~qiehuan;
      [1 @9 t8 B% |- \. E, [                        }  f$ U. T# |# a! C. t; @; e
                   8 d- {6 S" |& {- L9 J6 t, I$ T# T
                    if(qiehuan): c! K( ?# ^, y! d
                            {8 X5 Y& f7 d. ^( M
                            init_eeprom();  //开始初始化保存的数据4 b* q% S! J$ _
                            Init_LCD1602();        //初始化LCD1602- e- x! i; T: t  F* W. D+ o1 s
                            EA = 0;                        //关闭中断总开关4 H0 a* h+ a9 z! {' |9 {0 }
                            Timer0_Init();        //初中始化完成,开断
    % W" }2 u, N: I7 R2 X& |: }# q                        EA = 1;                        //打开中断总开关
    0 W" X0 N1 ?/ l9 q                        chushi();
    * ^6 w% ?: O2 G                                if (FlagTest==1)   //每0.5秒称重一次
    $ \0 J* O) w% o: P# K3 c. W                                {5 |3 h9 N: M; y
                                    Get_Weight();  //读取一次重量, p. _# v9 R* @4 x, v% V
                                    FlagTest = 0;  //读取变量清零
    ! {  T% o+ B: x" D  A                                }         
    ! T" R% k0 I7 E& b4 ~& w4 Q5 S7 l                                KeyPress();                   //扫描按键* t4 ^" X( I$ G4 T( F* [- w
                            }
    . |# Q: f' q# ?, F) y                else
    . w; u8 [! g* ^: U9 _% ?  F9 j/ L% h                        {' L: c, `' V% A# m# ]4 N
                             ck();
    ! |* @3 p  @6 T/ N                         Init_LCD1602();        //初始化LCD1602( w' U1 R5 J9 P: t$ o+ q0 K
                             zf();
    & I7 J- Q% A% z                 LcdDisplay(Ds18b20ReadTemp());+ q: X8 p! \) p" }% d1 [: E
                            }& \& l. O& N+ T0 \- Z1 S# o" e
                            delay(10000);: k, f$ D& V" n9 w
                    }* Q4 F0 }2 X9 A
          
    : e# D  S. k( \6 f% |  a$ K}, M% Y+ z0 F4 a$ N% g) x* e
    * `' q: i% a* D) S" z+ Y# X
    为什么这里我用按键切换,不能稳定切换,而且当运行称重程序时不能称重了?
    3 y+ L( _3 Y& J% L' o) o

    该用户从未签到

    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 | 只看该作者
    错误  @4 m+ F: K+ N5 k! _4 X
                    if(K1==0)//无效
    ) _+ O% K6 i* d0 i7 f( Y                delay(1000);//延时
    ! I8 S/ u; e# F) b' `, R                {//无效
    3 ]: j( J4 n- F5 Y                while(K1==0)//等待按键松手,没有分号分隔则无限循环执行下一条语句- D& L0 z& i. I+ y
                            qiehuan=~qiehuan;//等待按键松手期间不停取反& S/ }' M" p( a+ T1 ~1 [7 k% t( o
                    }//无效
    * u& m0 C" A( j( B0 P% m7 i8 m0 Q5 ^' N" U* z1 G1 h- P6 B+ N- _
    正确
    ; j6 b: x8 ]4 q1 X# k                if(K1==0)//按键按下9 E: H4 E" A. Z1 m% E! X$ u; d8 D7 C
                    {
      T- ~/ P) u" q2 t  {                        delay(1000);//延时去抖
      [/ |6 b, ?7 I% o' I5 t0 z                        if(K1==0)//延时后再次确认按键按下( _4 R: ^; f* k2 ?
                            {
    / X  t5 P2 W9 r- V                                while(K1==0);//等待按键松手
    " r1 P( v' a" z                                qiehuan=~qiehuan;//取反
    / n" D2 E/ p. b, U3 k, @                        }( k- m3 j2 \, h
                    }
  • TA的每日心情
    慵懒
    2022-1-21 15:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    5#
    发表于 2022-5-7 13:50 | 只看该作者
    首先就要考虑按键抖动,然后做好去抖,可以结合串口功能去进行调试
    8 Q0 n- Z5 n9 y& b; Y
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-6-17 07:42 , Processed in 0.062500 second(s), 23 queries , Gzip On.

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

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

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