欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 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://m.raoushi.com/bbs/) Powered by Discuz! X3.1