找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1459|回复: 12
打印 上一主题 下一主题
收起左侧

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

[复制链接]
回帖奖励 80 黑币 回复本帖可获得 8 黑币奖励! 每人限 2 次
跳转到指定楼层
楼主
ID:922892 发表于 2022-5-6 18:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:860840 发表于 2022-5-6 19:33 | 只看该作者
本帖最后由 lxh0587 于 2022-5-6 19:39 编辑

你这个可能是    if(K1==0)  delay(1000); 按键消抖的时间太短了,我看delay是用while循环减,独立按键消抖一般在10ms,你这个应该只有1ms左右吧应该,我看最下面有个ms的延时函数,咋不用那个,另外我看Get_Weight()函数在主函数后面,我没在主函数前面找到声明
回复

使用道具 举报

板凳
ID:860840 发表于 2022-5-6 19:38 | 只看该作者
本帖最后由 lxh0587 于 2022-5-6 19:53 编辑

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

使用道具 举报

地板
ID:213173 发表于 2022-5-6 21:52 | 只看该作者
这种写法是依据有什么理由?
        if(K1==0)
        delay(1000);
        {
                while(K1==0)
                qiehuan=~qiehuan;
        }
回复

使用道具 举报

5#
ID:922892 发表于 2022-5-6 22:00 | 只看该作者
wulin 发表于 2022-5-6 21:52
这种写法是依据有什么理由?
        if(K1==0)
        delay(1000);

一种标志,因为一开始写的是qiehuan=0,如果按键没按下就取反,运行称重程序
回复

使用道具 举报

6#
ID:213173 发表于 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;//取反
                        }
                }
回复

使用道具 举报

7#
ID:61261 发表于 2022-5-7 08:21 | 只看该作者
首先就要考虑按键抖动,然后做好去抖,可以结合串口功能去进行调试
回复

使用道具 举报

8#
ID:922892 发表于 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);
                }

回复

使用道具 举报

9#
ID:451718 发表于 2022-5-7 17:39 | 只看该作者
你数一下,你程序里面用了几次 Init_LCD1602()函数, 不闪才怪。  要注意程序运行的效率, 如果需要清屏,可以在有数据变化的时候,调用Init_LCD1602()函数。
回复

使用道具 举报

10#
ID:213173 发表于 2022-5-7 21:25 | 只看该作者
xuxiaopang11 发表于 2022-5-7 10:54
已经改完了,但是LCD屏幕依然会不停地闪,不能稳定的执行温度或者测重函数。        while(1)
                {
                if(K1==0) ...

为什么给你示例还看不懂,继续犯相同错误?
回复

使用道具 举报

11#
ID:922892 发表于 2022-5-8 09:29 | 只看该作者
robinsonlin 发表于 2022-5-7 17:39
你数一下,你程序里面用了几次 Init_LCD1602()函数, 不闪才怪。  要注意程序运行的效率, 如果需要清屏 ...

哦哦,明白了,我去修改一下,初学这些东西,搞的还不是太明白
回复

使用道具 举报

12#
ID:61261 发表于 2022-5-8 09:43 | 只看该作者
除去抖以外还要考虑是否进入了死循环
回复

使用道具 举报

13#
ID:922892 发表于 2022-5-8 10:33 | 只看该作者
wulin 发表于 2022-5-7 21:25
为什么给你示例还看不懂,继续犯相同错误?

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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