标题: 51单片机关于按键切换两个函数的问题 [打印本页]

作者: xuxiaopang11    时间: 2022-5-6 18:07
标题: 51单片机关于按键切换两个函数的问题
void main()
{
        init_eeprom();  //开始初始化保存的数据
        Init_LCD1602();        //初始化LCD1602
        EA = 0;                        //关闭中断总开关
        Timer0_Init();        //初中始化完成,开断
        EA = 1;                        //打开中断总开关
        while(1)
                {
                if(K1==0)
                delay(1000);
                        {
                        while(K1==0)
                        qiehuan=~qiehuan;
                        }
               
                if(qiehuan)
                        {
                        init_eeprom();  //开始初始化保存的数据
                        Init_LCD1602();        //初始化LCD1602
                        EA = 0;                        //关闭中断总开关
                        Timer0_Init();        //初中始化完成,开断
                        EA = 1;                        //打开中断总开关
                        chushi();
                                if (FlagTest==1)   //每0.5秒称重一次
                                {
                                Get_Weight();  //读取一次重量
                                FlagTest = 0;  //读取变量清零
                                }         
                                KeyPress();                   //扫描按键
                        }
                else
                        {
                         ck();
                         Init_LCD1602();        //初始化LCD1602
                         zf();
                 LcdDisplay(Ds18b20ReadTemp());
                        }
                        delay(10000);
                }
       
}

为什么这里我用按键切换,不能稳定切换,而且当运行称重程序时不能称重了?

温度与重量.rar

232.6 KB, 下载次数: 8


作者: lxh0587    时间: 2022-5-6 19:33
本帖最后由 lxh0587 于 2022-5-6 19:39 编辑

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

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

作者: wulin    时间: 2022-5-6 21:52
这种写法是依据有什么理由?
        if(K1==0)
        delay(1000);
        {
                while(K1==0)
                qiehuan=~qiehuan;
        }
作者: xuxiaopang11    时间: 2022-5-6 22:00
wulin 发表于 2022-5-6 21:52
这种写法是依据有什么理由?
        if(K1==0)
        delay(1000);

一种标志,因为一开始写的是qiehuan=0,如果按键没按下就取反,运行称重程序
作者: wulin    时间: 2022-5-7 08:11
xuxiaopang11 发表于 2022-5-6 22:00
一种标志,因为一开始写的是qiehuan=0,如果按键没按下就取反,运行称重程序

错误
                if(K1==0)//无效
                delay(1000);//延时
                {//无效
                while(K1==0)//等待按键松手,没有分号分隔则无限循环执行下一条语句
                        qiehuan=~qiehuan;//等待按键松手期间不停取反
                }//无效

正确
                if(K1==0)//按键按下
                {
                        delay(1000);//延时去抖
                        if(K1==0)//延时后再次确认按键按下
                        {
                                while(K1==0);//等待按键松手
                                qiehuan=~qiehuan;//取反
                        }
                }
作者: fhsgjsgjsfgjsfj    时间: 2022-5-7 08:21
首先就要考虑按键抖动,然后做好去抖,可以结合串口功能去进行调试
作者: xuxiaopang11    时间: 2022-5-7 10:54
wulin 发表于 2022-5-7 08:11
错误
                if(K1==0)//无效
                delay(1000);//延时

已经改完了,但是LCD屏幕依然会不停地闪,不能稳定的执行温度或者测重函数。        while(1)
                {
                if(K1==0)
                Delay_ms(10);
                        {
                        while(K1==0);
                        qiehuan=~qiehuan;
                        }
               
                if(qiehuan)
                        {
                        Init_LCD1602();        //初始化LCD1602

                        LCD1602_write_com(0x80);                                //第一行地址
                        LCD1602_write_word("The Weight:     ");        //显示第一行内容
                        LCD1602_write_com(0x80+0x40);                        //第二行地址
                        LCD1602_write_word("         0.000kg");        //第二行显示内容
               
                                          
                                                if (FlagTest==1)   //每0.5秒称重一次
                                                {
                                                Get_Weight();  //读取一次重量
                                                FlagTest = 0;  //读取变量清零
                                                }         
                                                KeyPress();                   //扫描按键
                                          
                                Delay_ms(100);       
                                }
                       
                else
                        {
                         ck();
                         Init_LCD1602();        //初始化LCD1602
                         zf();

                         LcdDisplay(Ds18b20ReadTemp());         
               
                        }
                        Delay_ms(100);
                }


作者: robinsonlin    时间: 2022-5-7 17:39
你数一下,你程序里面用了几次 Init_LCD1602()函数, 不闪才怪。  要注意程序运行的效率, 如果需要清屏,可以在有数据变化的时候,调用Init_LCD1602()函数。
作者: wulin    时间: 2022-5-7 21:25
xuxiaopang11 发表于 2022-5-7 10:54
已经改完了,但是LCD屏幕依然会不停地闪,不能稳定的执行温度或者测重函数。        while(1)
                {
                if(K1==0) ...

为什么给你示例还看不懂,继续犯相同错误?
作者: xuxiaopang11    时间: 2022-5-8 09:29
robinsonlin 发表于 2022-5-7 17:39
你数一下,你程序里面用了几次 Init_LCD1602()函数, 不闪才怪。  要注意程序运行的效率, 如果需要清屏 ...

哦哦,明白了,我去修改一下,初学这些东西,搞的还不是太明白
作者: fhsgjsgjsfgjsfj    时间: 2022-5-8 09:43
除去抖以外还要考虑是否进入了死循环
作者: xuxiaopang11    时间: 2022-5-8 10:33
wulin 发表于 2022-5-7 21:25
为什么给你示例还看不懂,继续犯相同错误?

抱歉,没有仔细看,少了个if,已经改了,可以成功切换了,谢谢




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1