久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1869|回復: 26
打印 上一主題 下一主題
收起左側

壓力變化更新顯示,沒變化鎖定顯示,如何實現?如網上視頻所示效果

[復制鏈接]
跳轉到指定樓層
樓主
ID:686513 發表于 2024-5-23 16:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
液晶段碼或數碼管顯示數據時,如果顯示的數據發生變化,需要更新顯示,而如果數據沒有變化,則保持當前顯示不變,這種效果如何實現?最好有例程參考一下,謝謝!下面是從網上找到一段視頻,如此視頻顯示效果。
https://www.bilibili.com/video/BV19e4y177FL/

/*******************************************************************************
* 文件名:定時器0中斷函數
* 描  述: 定時1ms
* 功  能:把ADC檢測給果Press送給顯示變量parm    wnd為4個窗口。
* 參  數:無
*******************************************************************************/        
void Timer0Init(void)         //1毫秒@24.000MHz   20MHZ  TL0:7D  TH0:F9     倍頻:19.66MHZ
{        
        TMOD &= 0xF0;                     //設置定時器模式
        TMOD |= 0x01;                     //設置定時器模式
        TL0 = 0xcd;                       //設置定時初始值
        TH0 = 0xfc;                       //設置定時初始值               
        TF0 = 0;                         //清除TF0標志
        ET0=1;               //定時器0開關        
        TR0 = 1;                         //定時器0開始計時
}
void timer0_ISR(void) interrupt 1       //定時器中斷0,中斷號:1
{
        TR0=0;                                                 //定時器0計時關閉        
        
    switch(wnd)
                {                                 
                  case 0:  parm1 = press;                break;      //parm1當前壓力值送顯示 ,press是當前壓力值。                                                    
                  case 1:  parm2 = press*0.689;      break;                                            
                  case 2:  parm3 = press*0.689;      break;                                                                  
                  case 3:  parm4 = press*0.7;         break;                     
                  default:break;                        
          }                                                                             
        
        TL0 = 0xcd;                                       //設置定時初始值
        TH0 = 0xfc;                                       //設置定時初始值
        TR0=1;                               //定時器0計時打開        
}

/*******************************************************************************
* 文件名:進入關機
* 描  述:
* 功  能:
* 參  數:無
*******************************************************************************/
void sleep()
{        
  if(XmCnt==1)                                         //XmCnt定時500mS檢測一下是否休眠   
        {                 
           XM_90S_1 = press;                             
           if(XM_90S_1 == XM_90S_2)         //新舊數據判斷,如果相等休眠               
                {
                   Low_Power ++;                                        TF0 = 0;                         //加上TF0=0;如果新舊數據相等,沒變化時關閉送顯示的定時器0,這樣可以鎖定顯示.           
                }        
         else
                {                        
                    XM_90S_2 = XM_90S_1;                                             
                    Low_Power = 0;
                     TF0=1;                                        //如果新舊數據不相等時,打開定時器0,理論上應該對的,但實際這時鎖定顯示就失效了!
                  }
          if(Low_Power > 50)         bg = 0;
          if(Low_Power > 200)
                 {
                        E2prom_write_user();                                        //用戶變量存入flash
                        LCD_display_NONE();                                    //關閉所有顯示
                        DelayXms(3000);                                 //等待時間與長按時間一致
                        while(sw==0);                                          //等待按鍵松開進入關機        
                        System_CPU_OFF();                                      //關機
                 }
         }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:23640 發表于 2024-5-24 14:27 | 只看該作者
加個標志位進行判斷,當壓力不變化的時候就不再刷新顯示,同理當檢測到壓力變化時把標志位清0,繼續顯示
回復

使用道具 舉報

板凳
ID:123289 發表于 2024-5-24 15:02 | 只看該作者
1、顯示與壓力分開寫。
2、顯示的內容,僅從變XS中取數據顯示。無論是掃描顯示,還是固定顯示,屏上都只顯示XS中值。
3、將首次壓力值送入XS中,以后當壓力有變化時,更新XS。無變化時,什么也不做。
回復

使用道具 舉報

地板
ID:686513 發表于 2024-5-25 09:09 | 只看該作者
yzwzfyz 發表于 2024-5-24 15:02
1、顯示與壓力分開寫。
2、顯示的內容,僅從變XS中取數據顯示。無論是掃描顯示,還是固定顯示,屏上都只 ...

多謝,目前我是顯示和壓力檢測分開寫的,壓力數據送給顯示變量,這個過程是在定時器中完成的,1ms發送一次,休眠是新的壓力數據和上次數據做比較,沒有變化就休眠,是不是在這個比較里面放個標志位,如果標志位為1發送上次數據,為0發送新數據?
回復

使用道具 舉報

5#
ID:686513 發表于 2024-5-25 10:50 | 只看該作者
zhth1979 發表于 2024-5-25 09:09
多謝,目前我是顯示和壓力檢測分開寫的,壓力數據送給顯示變量,這個過程是在定時器中完成的,1ms發送一 ...

好像也不行,有這方面的例程嗎?
回復

使用道具 舉報

6#
ID:686513 發表于 2024-5-25 10:50 | 只看該作者
yaosongjin 發表于 2024-5-24 14:27
加個標志位進行判斷,當壓力不變化的時候就不再刷新顯示,同理當檢測到壓力變化時把標志位清0,繼續顯示

好像也不行,有這方面的例程嗎?
回復

使用道具 舉報

7#
ID:123289 發表于 2024-5-27 08:29 | 只看該作者
正解。
顯示程序判斷你設定的標記即可,記住:用過之后要將標記清0。
回復

使用道具 舉報

8#
ID:23640 發表于 2024-5-27 09:27 | 只看該作者
zhth1979 發表于 2024-5-25 10:50
好像也不行,有這方面的例程嗎?

加個記錄數據的全局變量,當壓力不變時顯示上次記錄的值
回復

使用道具 舉報

9#
ID:686513 發表于 2024-5-28 13:53 | 只看該作者
yzwzfyz 發表于 2024-5-27 08:29
正解。
顯示程序判斷你設定的標記即可,記住:用過之后要將標記清0。

/*******************************************************************************
* 文件名:定時器0中斷函數
* 描  述: 定時1ms
* 功  能:
* 參  數:無
*******************************************************************************/       
void Timer0Init(void)         //1毫秒
{       
        TMOD &= 0xF0;                     //設置定時器模式
        TMOD |= 0x01;                     //設置定時器模式
        TL0 = 0xcd;                       //設置定時初始值
        TH0 = 0xfc;                       //設置定時初始值               
        TF0 = 0;                         //清除TF0標志
        ET0=1;               //定時器0開關       
        TR0 = 1;                         //定時器0開始計時
}
void timer0_ISR(void) interrupt 1       //定時器中斷0,中斷號:1
{
        TR0=0;                                                 //定時器0計時關閉       
    switch(wnd)
                {                                
                 case 0:         parm1 = press;            break;      //parm1送數碼管顯示變量   press=adc獲取的數據                                                       
                 -------------
   
               
               default:break;                       
          }                                                                            
               
        TL0 = 0xcd;                                       //設置定時初始值
        TH0 = 0xfc;                                       //設置定時初始值
        TR0=1;                               //定時器0計時打開       
}

休眠判斷     
void sleep()
{       
  if(XmCnt==1)                                         //XmCnt定時1中  500mS檢測一下是否休眠   
                {                 
                       XM_90S_1 = press;               
                  if(XM_90S_1 == XM_90S_2)                       
                          {                                       
                                 Low_Power ++;                         
                                }       
      else
                          {       
         XM_90S_2 = XM_90S_1;                                       
                                 Low_Power = 0;
                          }
                if(Low_Power > 200)
                 {
                        E2prom_write_user();                                        //用戶變量存入flash
                        LCD_display_NONE();                                    //關閉所有顯示
                        DelayXms(3000);                                 //等待時間與長按時間一致
                        while(sw==0);                                          //等待按鍵松開進入關機       
                        System_CPU_OFF();                                      //關機
                 }
         }
}
回復

使用道具 舉報

10#
ID:686513 發表于 2024-5-28 13:58 | 只看該作者
yzwzfyz 發表于 2024-5-27 08:29
正解。
顯示程序判斷你設定的標記即可,記住:用過之后要將標記清0。

本來想在休眠判斷里開關定時器0,會出現:1.要么可以鎖定顯示,數據變化時不能更新顯示新數據。2.要么可以更新新數據,但不能鎖定顯示。
回復

使用道具 舉報

11#
ID:686513 發表于 2024-5-28 14:00 | 只看該作者
yzwzfyz 發表于 2024-5-27 08:29
正解。
顯示程序判斷你設定的標記即可,記住:用過之后要將標記清0。

if(XmCnt==1)                                         //XmCnt定時500mS檢測一下是否休眠   
                {                 
             XM_90S_1 = press;               
                  if(XM_90S_1 == XM_90S_2)                       
                          {       
         TR0=0;                                       
                                 Low_Power ++;                         
                                }       
      else
                          {
    //    TR0=1;               這里注銷掉,可以鎖定顯示,但不能更新顯示新數據;不注銷可以顯示新數據,但又不能鎖定顯示。                               
         XM_90S_2 = XM_90S_1;                                       
                                 Low_Power = 0;
                          }
回復

使用道具 舉報

12#
ID:686513 發表于 2024-5-28 14:00 | 只看該作者
yaosongjin 發表于 2024-5-27 09:27
加個記錄數據的全局變量,當壓力不變時顯示上次記錄的值

同上回復。
回復

使用道具 舉報

13#
ID:1109793 發表于 2024-5-28 15:05 | 只看該作者
上個數據是0,這次數據大于0就更新,并且下次比上次數據大就更新,下次數據變小就不更新。
回復

使用道具 舉報

14#
ID:341045 發表于 2024-5-28 16:02 | 只看該作者
描述不準確, 應該這樣寫, 檢測壓力大于一個較小的值, 更新顯示, 小于這個值(對應拿開, 按我理解壓力應該為0), 不更新顯示. 再測量重復以上
回復

使用道具 舉報

15#
ID:686513 發表于 2024-6-1 10:27 | 只看該作者
xiaobendan001 發表于 2024-5-28 15:05
上個數據是0,這次數據大于0就更新,并且下次比上次數據大就更新,下次數據變小就不更新。

可能我表達不夠清楚,下次數據變小也要更新,也就是說檢測數據有變化都要更新,只有檢測數據穩定后不更新并顯示.
回復

使用道具 舉報

16#
ID:686513 發表于 2024-6-1 10:32 | 只看該作者
lzts88 發表于 2024-5-28 16:02
描述不準確, 應該這樣寫, 檢測壓力大于一個較小的值, 更新顯示, 小于這個值(對應拿開, 按我理解壓力應該為0 ...

可能我表達不夠清楚,檢測數據有變化都要更新顯示,只有檢測數據穩定后不更新并鎖定顯示.
回復

使用道具 舉報

17#
ID:686513 發表于 2024-6-1 14:15 | 只看該作者
重新描述一下:液晶段碼或數碼管顯示數據時,如果顯示的數據發生變化,需要更新顯示,而如果數據沒有變化,則保持當前顯示不變,這種效果如何實現?最好有例程參考一下,謝謝!
回復

使用道具 舉報

18#
ID:341045 發表于 2024-6-2 10:56 | 只看該作者
zhth1979 發表于 2024-6-1 14:15
重新描述一下:液晶段碼或數碼管顯示數據時,如果顯示的數據發生變化,需要更新顯示,而如果數據沒有變化, ...

你程序就只管檢測, 更新顯示數據就達到你要的效果了. 至于顯示數據最后一位或幾位會跳變, 那是加了軟件濾波的效果, 這濾波好多種, 各有各的優點和缺點, 你可網上找例子看下. 或者你也可這樣弄. 檢測一次并顯示后, 隔0.5秒, 或者隔3, 4 秒后再檢測并顯示下一次, 這樣也可避免最后一位閃.
回復

使用道具 舉報

19#
ID:1109793 發表于 2024-6-2 12:56 | 只看該作者
zhth1979 發表于 2024-6-1 14:15
重新描述一下:液晶段碼或數碼管顯示數據時,如果顯示的數據發生變化,需要更新顯示,而如果數據沒有變化, ...

這不就是一直顯示嗎?有啥討論的?有變化就變化,沒變化更新了也沒變化啊,或者說更新了你也看不到,那不就是顯示不變?你自己也沒搞懂到底想要啥
回復

使用道具 舉報

20#
ID:686513 發表于 2024-6-4 08:13 | 只看該作者
xiaobendan001 發表于 2024-6-2 12:56
這不就是一直顯示嗎?有啥討論的?有變化就變化,沒變化更新了也沒變化啊,或者說更新了你也看不到,那不 ...

沒變化的時候,沒數據進來,也要保持顯示最后一次數據直至休眠,如視頻效果。https://www.bilibili.com/video/BV19e4y177FL/
回復

使用道具 舉報

21#
ID:686513 發表于 2024-6-4 08:14 | 只看該作者
lzts88 發表于 2024-6-2 10:56
你程序就只管檢測, 更新顯示數據就達到你要的效果了. 至于顯示數據最后一位或幾位會跳變, 那是加了軟件濾 ...

不是濾波的問題,ADC不送來數據,屏也要顯示最后一次數據直至休眠。
回復

使用道具 舉報

22#
ID:161164 發表于 2024-6-4 17:59 | 只看該作者
zhth1979 發表于 2024-6-1 10:32
可能我表達不夠清楚,檢測數據有變化都要更新顯示,只有檢測數據穩定后不更新并鎖定顯示.
  1. ADC_New = ADC_Filter();
  2. if(ADC_NEW < ADC_Old+UpperBuff && ADC_NEW > ADC_Old-LowerBuff)
  3. {
  4.         if(!Stable)
  5.         {
  6.                 Delay++;
  7.                 if(Delay>=StableTime)Stable=1;
  8.         }
  9. }else{
  10.         Delay=0;
  11. }
  12. ADC_Old = ADC_New;
  13. if(!Stable)
  14. {
  15.         ADC_Disp = ADC_New;
  16. }
復制代碼
回復

使用道具 舉報

23#
ID:686513 發表于 2024-6-5 12:55 | 只看該作者

UpperBuff   LowerBuff   這兩個代表什么?假如ADC_Filter()獲取到如下幾個AD值:  10   9  8   7  -------    ADC_NEW == 10,ADC_Old ==9,那  UpperBuff==?    LowerBuff==?
回復

使用道具 舉報

24#
ID:161164 發表于 2024-6-6 08:56 | 只看該作者
zhth1979 發表于 2024-6-5 12:55
UpperBuff   LowerBuff   這兩個代表什么?假如ADC_Filter()獲取到如下幾個AD值:  10   9  8   7  ----- ...

UpperBuff和LowerBuff是用來定義上下限的變量
例如UpperBuff=2,LowerBuff=2
ADC_NEW == 10,ADC_Old ==9
if(10 < (9+2) && 10>(9-2))條件成立
開始計時(Delay++)
回復

使用道具 舉報

25#
ID:686513 發表于 2024-6-7 10:22 | 只看該作者
lkc8210 發表于 2024-6-6 08:56
UpperBuff和LowerBuff是用來定義上下限的變量
例如UpperBuff=2,LowerBuff=2
ADC_NEW == 10,ADC_Old = ...

我把您這段代碼放在定時器里基本功能能實現,但會出現斷開氣源,鎖定顯示的壓力會跳變。如當前測得50PSI壓力,斷開氣源,會隨機顯示比50PSI小的一個數據保持顯示。這個是隨機的有可能是對的,有可能比真實值小。
回復

使用道具 舉報

26#
ID:1124188 發表于 2024-6-7 12:31 | 只看該作者
可以在每次顯示數據之前,先將新數據與當前顯示的數據進行比較,只有在數據不相同時才更新顯示。
回復

使用道具 舉報

27#
ID:686513 發表于 2024-6-14 12:50 | 只看該作者
LotusVirginMary 發表于 2024-6-7 12:31
可以在每次顯示數據之前,先將新數據與當前顯示的數據進行比較,只有在數據不相同時才更新顯示。

理論上是對的,有例程嗎?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区视屏 | 精品久久香蕉国产线看观看亚洲 | 伊人免费网 | 国产精品99免费视频 | 99精品国产一区二区三区 | 久久一及片 | 欧美精品日韩精品国产精品 | 久久一区 | 一区二区三区欧美 | 国产成人jvid在线播放 | 国产小视频在线观看 | 国产一区二区三区四区五区3d | 在线精品一区 | 久草视频在线播放 | 中文字幕加勒比 | 亚洲五码久久 | 蜜桃一区二区三区在线 | 国产高清精品一区二区三区 | 成人在线免费电影 | 欧美精品一区三区 | 国产欧美一区二区精品久导航 | 精品国产鲁一鲁一区二区张丽 | 免费国产视频 | 日本高清aⅴ毛片免费 | 中文字幕av免费 | 91av大全| a欧美 | 特一级毛片 | 中文字幕免费视频 | 亚洲人的av | 国产91在线播放 | 久久神马 | 国产ts人妖一区二区三区 | 亚洲日韩中文字幕一区 | 亚洲国产精品一区二区第一页 | 国产成人精品久久久 | 国产精品大片在线观看 | 国产精品精品久久久久久 | 日韩一区二区在线看 | 久久久久亚洲 | 日韩第一区 |