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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    void main()
    0 x5 o4 i2 q! }0 ^{, `3 l4 \, E9 e5 `6 e
            init_eeprom();  //开始初始化保存的数据, h; X+ G: e0 O6 u
            Init_LCD1602();        //初始化LCD1602
    & w' m3 n$ j; G, q) k: s+ ?# ]        EA = 0;                        //关闭中断总开关
    : P# ]2 \0 |8 K4 N* M        Timer0_Init();        //初中始化完成,开断* R* m" N; y4 ]+ P
            EA = 1;                        //打开中断总开关
    9 ^2 E+ z% i3 L0 m4 f        while(1)
    % V; `5 c- J+ q2 e                {+ a# B  }, H3 {9 X2 A6 l
                    if(K1==0)
    ' A5 p/ r. v! o  m5 W/ v                delay(1000);
    . ]; J4 ~% {  A- |& K  x, Y                        {" p1 }( ?0 s# S3 U. c
                            while(K1==0)
    0 [* o/ C) w: X                        qiehuan=~qiehuan;" N) M1 x! Y5 \8 T. P) |  {; V! L
                            }% U  T: O- v8 q1 u
                   - Z- {) ]- E2 x5 }) Q2 C, j
                    if(qiehuan)
    - M/ b- s: C0 ~. s* ?. m                        {7 ?8 J/ ^/ \3 F
                            init_eeprom();  //开始初始化保存的数据2 h. _- p" O8 e' y
                            Init_LCD1602();        //初始化LCD1602  J6 r$ n8 V( O; k1 K
                            EA = 0;                        //关闭中断总开关0 @+ x+ Y9 M& Q: t) S
                            Timer0_Init();        //初中始化完成,开断/ N/ y' S# l" {' M# t
                            EA = 1;                        //打开中断总开关3 l& C; A# T; U6 P6 W) z& I$ a7 ?
                            chushi();
    $ \, p% t0 V0 ?                                if (FlagTest==1)   //每0.5秒称重一次
    , z! c  q# A+ i5 ]  D; a; P                                {
    " q. [; x; D) c                                Get_Weight();  //读取一次重量. l% ^; ~. ^- m
                                    FlagTest = 0;  //读取变量清零
    $ ~9 A/ q! J2 X6 h: x6 C' Y                                }         ) }7 q: T- U' z/ b+ l  v7 Y
                                    KeyPress();                   //扫描按键! u' \" k: S( o( h
                            }
    ' G: d0 p$ E% g& U" f3 e7 K5 n5 Q                else
    4 _$ k( T/ z. h1 e; s+ w2 a/ Z                        {
    / N# u$ `( `/ e' O  i7 @1 F+ j! S' u                         ck();
    9 J# j! @  o0 e# v4 h" L1 M                         Init_LCD1602();        //初始化LCD1602
    ; g  [; ^8 Y3 Q1 n+ ~                         zf();) x) I' q7 n1 z+ J0 a
                     LcdDisplay(Ds18b20ReadTemp());7 C. C% \/ Q2 }+ V6 a' K
                            }
    0 _* m8 r  j* V: L* P" r* z                        delay(10000);
    / N* x5 h4 R) m6 `4 ^                }
    / R8 j; W# B* w: w/ j, W# L; `       4 W& G) u3 @7 g$ j. C4 B5 \
    }
    # i" S! ?0 I$ W4 [9 Y; ]9 Q8 g. k4 ?
    为什么这里我用按键切换,不能稳定切换,而且当运行称重程序时不能称重了?
    8 H0 X" g) \8 e$ `9 N+ @

    该用户从未签到

    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 | 只看该作者
    错误, G6 J8 X; J! f- j# R
                    if(K1==0)//无效
    9 h* s% b) L1 {6 a                delay(1000);//延时$ x! H, d4 |1 S1 E: i1 {
                    {//无效/ t* Z4 S) B6 j/ D9 Y7 ^$ o. M
                    while(K1==0)//等待按键松手,没有分号分隔则无限循环执行下一条语句8 `) y$ `& r6 K, V6 \
                            qiehuan=~qiehuan;//等待按键松手期间不停取反+ S' f  M4 W( v2 X# Q1 f6 f
                    }//无效7 w5 P. u1 F( e/ i9 \. T
    . u- z& |; I: c2 Z9 L1 J* f
    正确- T2 v) I/ u: M. u, p
                    if(K1==0)//按键按下# e1 c6 J+ N0 H; z
                    {! G2 U5 N! j+ B* p/ ]& Q9 W% {0 B# {
                            delay(1000);//延时去抖
    / S1 a- ~: x- Q( d# Y% [; M                        if(K1==0)//延时后再次确认按键按下
    & }0 C7 n! _: Q1 O5 A                        {  E$ ~5 q; |7 @* b! o2 D& ~7 c
                                    while(K1==0);//等待按键松手1 f* y: b2 ~& w+ U( p6 d, Z8 s
                                    qiehuan=~qiehuan;//取反
    " z! L7 v" O% V8 y5 h6 P                        }2 T- ~1 c1 f- ?5 H
                    }
  • TA的每日心情
    慵懒
    2022-1-21 15:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    5#
    发表于 2022-5-7 13:50 | 只看该作者
    首先就要考虑按键抖动,然后做好去抖,可以结合串口功能去进行调试$ L2 P) a9 G9 [6 p5 G$ A
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

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

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

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

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