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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    void main()! e! W0 ^4 L2 h% U; |1 b+ n4 G
    {: ~$ l) x$ V/ [7 D" k
            init_eeprom();  //开始初始化保存的数据
      Y7 X: _$ b8 I  n        Init_LCD1602();        //初始化LCD16027 t/ R, V4 ?2 Z2 b. T+ `! o& y, m
            EA = 0;                        //关闭中断总开关; @7 U( G! k4 v4 P1 [; ^
            Timer0_Init();        //初中始化完成,开断
    " _8 I" F8 F+ L- Y; _1 u        EA = 1;                        //打开中断总开关  S( s  w3 S$ v
            while(1)0 Y, o5 `' [, R- k9 h" I/ s! K
                    {5 c. O4 U7 p( c4 a2 V! [
                    if(K1==0)
    4 U5 l+ s  v. w/ F* O                delay(1000);! W/ V& N! b0 u- K
                            {1 G- d2 h3 S& ?  O- N
                            while(K1==0)
    ' u; P# Y- F6 a0 q" d9 v                        qiehuan=~qiehuan;
    & y7 y4 @" W! |& i; o                        }
    & S" [, w* B8 h* I' p! J: n               - B% S3 s/ N6 R: H6 S. U! K# n, d& ^
                    if(qiehuan)
    $ z3 ~9 m& A& w                        {, m7 Z. r" g" H% J% n
                            init_eeprom();  //开始初始化保存的数据4 \# P2 x1 q/ r) E4 P6 A) N+ D! A
                            Init_LCD1602();        //初始化LCD1602: Q$ `3 @" H7 b0 x
                            EA = 0;                        //关闭中断总开关6 @3 q' ^0 [" U
                            Timer0_Init();        //初中始化完成,开断2 o, o, Q2 r# l; F6 y( }5 u, q
                            EA = 1;                        //打开中断总开关
    8 G# Q" i8 [' k0 t0 L) k: V                        chushi();" g( ?8 N( P0 w9 x% C" t* ~  k
                                    if (FlagTest==1)   //每0.5秒称重一次9 ]! Y% V& a2 M
                                    {
    3 f. K7 {* |1 P, ]                                Get_Weight();  //读取一次重量- c/ \+ S  k, b: u% K
                                    FlagTest = 0;  //读取变量清零* B9 n7 X6 c& i. n$ A% U7 S/ A
                                    }         
    ; v1 r( s7 |( J  I0 d5 i7 u                                KeyPress();                   //扫描按键. m+ A5 F! X8 f# e6 I: g  M4 S
                            }4 E9 V! A0 h& g2 o
                    else/ I$ l* V8 {/ z9 t  y( p& M
                            {
    : [* X" ~1 ~6 n, P' u                         ck();, \8 I. g: Z8 g3 d
                             Init_LCD1602();        //初始化LCD1602
    * B& C, h/ T/ u; u, w2 y7 ?/ ~                         zf();2 d& @" B  w  s* o8 l; T
                     LcdDisplay(Ds18b20ReadTemp());+ p6 Y' `2 g  S  F3 j  ~
                            }
    / U( n  u* P: r: {; `: p4 E' e                        delay(10000);
    ; A, r6 m- f+ q, l                }$ B' }) T. L$ [& }4 e
           ' X0 I: w: }. ~2 G! h- v/ Z4 A
    }, m# I+ G, j& _

    + r, w+ ?% t& k- B0 \为什么这里我用按键切换,不能稳定切换,而且当运行称重程序时不能称重了?) u3 ?% C; n' `( ?5 u$ 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 | 只看该作者
    错误3 ^# c/ p9 E& l& q+ P
                    if(K1==0)//无效
    % m$ y/ R& }3 m+ R  k% l                delay(1000);//延时
    9 i: X: P* R, N                {//无效
    : w7 l/ W# s* `; y' C1 [                while(K1==0)//等待按键松手,没有分号分隔则无限循环执行下一条语句
      v8 d( j( @( j" e# y7 w                        qiehuan=~qiehuan;//等待按键松手期间不停取反
    7 M5 D. F) N* w( Z# T5 Q                }//无效5 s  m; r& m6 c# S+ w9 t3 t! n
    0 G- O% c" m9 q: u3 c- L- G
    正确
    . j8 U* b6 |1 A                if(K1==0)//按键按下
    , p7 D. ^8 U- q                {+ o: e+ m. d8 N3 _! L6 c7 i% U: o
                            delay(1000);//延时去抖
    ' S! [% q- @, h. c8 j                        if(K1==0)//延时后再次确认按键按下
    - B/ B( v% ?# Y, R% H                        {: c! T4 J0 N/ z2 J
                                    while(K1==0);//等待按键松手3 K0 X; m4 n0 e. r1 U% I$ x+ M( `2 r
                                    qiehuan=~qiehuan;//取反
    ; {* [) Y. T6 L$ g                        }
    ! b% N, I5 M6 ^  w# ]                }
  • TA的每日心情
    慵懒
    2022-1-21 15:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    5#
    发表于 2022-5-7 13:50 | 只看该作者
    首先就要考虑按键抖动,然后做好去抖,可以结合串口功能去进行调试
    0 d3 p/ S0 |3 L! V0 i0 z: c
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-7-15 02:11 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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