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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    void main()& n' ?! p/ F' B* n
    {2 F4 ?% v4 e& P7 {9 L
            init_eeprom();  //开始初始化保存的数据
    + Y# E3 M( `3 b; D& U        Init_LCD1602();        //初始化LCD1602# I: [3 q3 [# j0 s, ?
            EA = 0;                        //关闭中断总开关6 W) o- P* [6 Q$ w$ p8 U
            Timer0_Init();        //初中始化完成,开断1 M7 a- j* {# u5 e" _
            EA = 1;                        //打开中断总开关6 |9 C# p* P6 N% M9 o4 w$ w
            while(1)
    7 o0 A4 a, @! P  n+ u5 \                {
    0 k( T7 a3 f9 }+ O" d                if(K1==0)
    # h6 L! w% b6 R  N' R( I1 a0 E                delay(1000);
    & v7 K  B  Q; T8 B                        {
    ' T+ }8 F+ Z$ A, D7 `                        while(K1==0)8 l3 i$ G6 C7 g/ W$ Z. N
                            qiehuan=~qiehuan;
    $ f7 V: K- B% s3 W6 g3 ?                        }% t: J/ H& W. ?. S" G# Q
                   % {- w3 |' q* w4 U$ H  R; g% b" p
                    if(qiehuan)8 n  z& s5 ]# E( p+ A# x3 L
                            {
    5 \' j6 P9 O1 S                        init_eeprom();  //开始初始化保存的数据
    6 A" `" i7 h$ h( T) r) F" r                        Init_LCD1602();        //初始化LCD1602! d- N- n9 N# |
                            EA = 0;                        //关闭中断总开关% |  o7 v; l% {# l3 X* Q* Q
                            Timer0_Init();        //初中始化完成,开断% ^+ }+ \* o( o
                            EA = 1;                        //打开中断总开关3 k; ?: N( J7 {' N; K3 ^1 k/ S' Q
                            chushi();
      s/ o7 E, d+ a. K                                if (FlagTest==1)   //每0.5秒称重一次) I1 j/ r+ ?3 _
                                    {
    4 V5 i. ^  [2 q+ O  s+ `3 k9 i' W                                Get_Weight();  //读取一次重量
    / j* b9 M0 a& W, a7 y: m( G6 L                                FlagTest = 0;  //读取变量清零
    - R6 f. V: D) |9 n- C7 r                                }         7 j( Q* {# C) |( O5 J" n
                                    KeyPress();                   //扫描按键  U( {- S5 B5 S0 F6 ?
                            }
    , G+ \8 d- ^$ G+ O% p8 r                else
    5 q7 b5 z& Z& v! _0 C& {% o! ^                        {; `5 S1 W$ Q- h: \& @
                             ck();
    # }/ u  ?9 |2 u4 }& m3 n: l6 j                         Init_LCD1602();        //初始化LCD1602
    1 T  Z  ]0 `: g                         zf();
    . u8 E  o! m" N% |! v  ?* D                 LcdDisplay(Ds18b20ReadTemp());1 K/ ]* ]0 O% _$ U* ~8 G! T( y8 I
                            }
    * z+ {. b. E  a( n# x# U                        delay(10000);
    * A$ U0 `5 p' ]- x+ M                }7 s+ {2 N- ?: y" ^3 m$ t3 [
           : `* G# t; G2 M1 D7 t
    }& W0 P6 d& n) a4 O4 G8 v" A
    $ d* I3 f5 \, [- P/ V
    为什么这里我用按键切换,不能稳定切换,而且当运行称重程序时不能称重了?
    + J! v' [% Z6 H

    该用户从未签到

    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 | 只看该作者
    错误
    . _. i1 V( E9 l0 ^9 z; e) m                if(K1==0)//无效( a9 O+ R" [* @5 U0 T
                    delay(1000);//延时
    ; L! T! D: [" h4 M1 Z                {//无效
    ; v, h( z4 ?. X. k+ c' }                while(K1==0)//等待按键松手,没有分号分隔则无限循环执行下一条语句' s1 B: d9 x* m* \. y" u6 u
                            qiehuan=~qiehuan;//等待按键松手期间不停取反$ _  d4 c6 ]  ~3 j4 m3 ^# q/ S1 p
                    }//无效
    . T1 o1 i1 h* y4 Z# d
    # f# P5 {& |8 O0 M+ @, _正确. j. Q( R4 L. @3 R
                    if(K1==0)//按键按下
    " C5 m7 A9 e" Z  q( Q( m                {& q$ }3 k  J( C( O% m+ y; W
                            delay(1000);//延时去抖  l$ Y8 w$ a( i, ]; N! _  j
                            if(K1==0)//延时后再次确认按键按下1 `/ ~$ Y8 f2 L/ O
                            {
    2 {7 J. ^2 T% Z, G; x                                while(K1==0);//等待按键松手
    , H3 T) s! _! M' t4 F; h5 t                                qiehuan=~qiehuan;//取反% m* w7 v8 x* e. k7 F, Y
                            }( y5 k, y4 E4 M7 ^
                    }
  • TA的每日心情
    慵懒
    2022-1-21 15:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    5#
    发表于 2022-5-7 13:50 | 只看该作者
    首先就要考虑按键抖动,然后做好去抖,可以结合串口功能去进行调试# Y$ h, `1 z0 Y) p6 y3 E
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-6-29 14:37 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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