找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1914|回復(fù): 26
收起左側(cè)

壓力變化更新顯示,沒變化鎖定顯示,如何實現(xiàn)?如網(wǎng)上視頻所示效果

[復(fù)制鏈接]
ID:686513 發(fā)表于 2024-5-23 16:44 | 顯示全部樓層 |閱讀模式
液晶段碼或數(shù)碼管顯示數(shù)據(jù)時,如果顯示的數(shù)據(jù)發(fā)生變化,需要更新顯示,而如果數(shù)據(jù)沒有變化,則保持當(dāng)前顯示不變,這種效果如何實現(xiàn)?最好有例程參考一下,謝謝!下面是從網(wǎng)上找到一段視頻,如此視頻顯示效果。
https://www.bilibili.com/video/BV19e4y177FL/

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

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


回復(fù)

使用道具 舉報

ID:23640 發(fā)表于 2024-5-24 14:27 | 顯示全部樓層
加個標(biāo)志位進(jìn)行判斷,當(dāng)壓力不變化的時候就不再刷新顯示,同理當(dāng)檢測到壓力變化時把標(biāo)志位清0,繼續(xù)顯示
回復(fù)

使用道具 舉報

ID:123289 發(fā)表于 2024-5-24 15:02 | 顯示全部樓層
1、顯示與壓力分開寫。
2、顯示的內(nèi)容,僅從變XS中取數(shù)據(jù)顯示。無論是掃描顯示,還是固定顯示,屏上都只顯示XS中值。
3、將首次壓力值送入XS中,以后當(dāng)壓力有變化時,更新XS。無變化時,什么也不做。
回復(fù)

使用道具 舉報

ID:686513 發(fā)表于 2024-5-25 09:09 | 顯示全部樓層
yzwzfyz 發(fā)表于 2024-5-24 15:02
1、顯示與壓力分開寫。
2、顯示的內(nèi)容,僅從變XS中取數(shù)據(jù)顯示。無論是掃描顯示,還是固定顯示,屏上都只 ...

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

使用道具 舉報

ID:686513 發(fā)表于 2024-5-25 10:50 | 顯示全部樓層
zhth1979 發(fā)表于 2024-5-25 09:09
多謝,目前我是顯示和壓力檢測分開寫的,壓力數(shù)據(jù)送給顯示變量,這個過程是在定時器中完成的,1ms發(fā)送一 ...

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

使用道具 舉報

ID:686513 發(fā)表于 2024-5-25 10:50 | 顯示全部樓層
yaosongjin 發(fā)表于 2024-5-24 14:27
加個標(biāo)志位進(jìn)行判斷,當(dāng)壓力不變化的時候就不再刷新顯示,同理當(dāng)檢測到壓力變化時把標(biāo)志位清0,繼續(xù)顯示

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

使用道具 舉報

ID:123289 發(fā)表于 2024-5-27 08:29 | 顯示全部樓層
正解。
顯示程序判斷你設(shè)定的標(biāo)記即可,記。河眠^之后要將標(biāo)記清0。
回復(fù)

使用道具 舉報

ID:23640 發(fā)表于 2024-5-27 09:27 | 顯示全部樓層
zhth1979 發(fā)表于 2024-5-25 10:50
好像也不行,有這方面的例程嗎?

加個記錄數(shù)據(jù)的全局變量,當(dāng)壓力不變時顯示上次記錄的值
回復(fù)

使用道具 舉報

ID:686513 發(fā)表于 2024-5-28 13:53 | 顯示全部樓層
yzwzfyz 發(fā)表于 2024-5-27 08:29
正解。
顯示程序判斷你設(shè)定的標(biāo)記即可,記住:用過之后要將標(biāo)記清0。

/*******************************************************************************
* 文件名:定時器0中斷函數(shù)
* 描  述: 定時1ms
* 功  能:
* 參  數(shù):無
*******************************************************************************/       
void Timer0Init(void)         //1毫秒
{       
        TMOD &= 0xF0;                     //設(shè)置定時器模式
        TMOD |= 0x01;                     //設(shè)置定時器模式
        TL0 = 0xcd;                       //設(shè)置定時初始值
        TH0 = 0xfc;                       //設(shè)置定時初始值               
        TF0 = 0;                         //清除TF0標(biāo)志
        ET0=1;               //定時器0開關(guān)       
        TR0 = 1;                         //定時器0開始計時
}
void timer0_ISR(void) interrupt 1       //定時器中斷0,中斷號:1
{
        TR0=0;                                                 //定時器0計時關(guān)閉       
    switch(wnd)
                {                                
                 case 0:         parm1 = press;            break;      //parm1送數(shù)碼管顯示變量   press=adc獲取的數(shù)據(jù)                                                       
                 -------------
   
               
               default:break;                       
          }                                                                            
               
        TL0 = 0xcd;                                       //設(shè)置定時初始值
        TH0 = 0xfc;                                       //設(shè)置定時初始值
        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();                                    //關(guān)閉所有顯示
                        DelayXms(3000);                                 //等待時間與長按時間一致
                        while(sw==0);                                          //等待按鍵松開進(jìn)入關(guān)機(jī)       
                        System_CPU_OFF();                                      //關(guān)機(jī)
                 }
         }
}
回復(fù)

使用道具 舉報

ID:686513 發(fā)表于 2024-5-28 13:58 | 顯示全部樓層
yzwzfyz 發(fā)表于 2024-5-27 08:29
正解。
顯示程序判斷你設(shè)定的標(biāo)記即可,記住:用過之后要將標(biāo)記清0。

本來想在休眠判斷里開關(guān)定時器0,會出現(xiàn):1.要么可以鎖定顯示,數(shù)據(jù)變化時不能更新顯示新數(shù)據(jù)。2.要么可以更新新數(shù)據(jù),但不能鎖定顯示。
回復(fù)

使用道具 舉報

ID:686513 發(fā)表于 2024-5-28 14:00 | 顯示全部樓層
yzwzfyz 發(fā)表于 2024-5-27 08:29
正解。
顯示程序判斷你設(shè)定的標(biāo)記即可,記。河眠^之后要將標(biāo)記清0。

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

使用道具 舉報

ID:686513 發(fā)表于 2024-5-28 14:00 | 顯示全部樓層
yaosongjin 發(fā)表于 2024-5-27 09:27
加個記錄數(shù)據(jù)的全局變量,當(dāng)壓力不變時顯示上次記錄的值

同上回復(fù)。
回復(fù)

使用道具 舉報

ID:1109793 發(fā)表于 2024-5-28 15:05 | 顯示全部樓層
上個數(shù)據(jù)是0,這次數(shù)據(jù)大于0就更新,并且下次比上次數(shù)據(jù)大就更新,下次數(shù)據(jù)變小就不更新。
回復(fù)

使用道具 舉報

ID:341045 發(fā)表于 2024-5-28 16:02 | 顯示全部樓層
描述不準(zhǔn)確, 應(yīng)該這樣寫, 檢測壓力大于一個較小的值, 更新顯示, 小于這個值(對應(yīng)拿開, 按我理解壓力應(yīng)該為0), 不更新顯示. 再測量重復(fù)以上
回復(fù)

使用道具 舉報

ID:686513 發(fā)表于 2024-6-1 10:27 | 顯示全部樓層
xiaobendan001 發(fā)表于 2024-5-28 15:05
上個數(shù)據(jù)是0,這次數(shù)據(jù)大于0就更新,并且下次比上次數(shù)據(jù)大就更新,下次數(shù)據(jù)變小就不更新。

可能我表達(dá)不夠清楚,下次數(shù)據(jù)變小也要更新,也就是說檢測數(shù)據(jù)有變化都要更新,只有檢測數(shù)據(jù)穩(wěn)定后不更新并顯示.
回復(fù)

使用道具 舉報

ID:686513 發(fā)表于 2024-6-1 10:32 | 顯示全部樓層
lzts88 發(fā)表于 2024-5-28 16:02
描述不準(zhǔn)確, 應(yīng)該這樣寫, 檢測壓力大于一個較小的值, 更新顯示, 小于這個值(對應(yīng)拿開, 按我理解壓力應(yīng)該為0 ...

可能我表達(dá)不夠清楚,檢測數(shù)據(jù)有變化都要更新顯示,只有檢測數(shù)據(jù)穩(wěn)定后不更新并鎖定顯示.
回復(fù)

使用道具 舉報

ID:686513 發(fā)表于 2024-6-1 14:15 | 顯示全部樓層
重新描述一下:液晶段碼或數(shù)碼管顯示數(shù)據(jù)時,如果顯示的數(shù)據(jù)發(fā)生變化,需要更新顯示,而如果數(shù)據(jù)沒有變化,則保持當(dāng)前顯示不變,這種效果如何實現(xiàn)?最好有例程參考一下,謝謝!
回復(fù)

使用道具 舉報

ID:341045 發(fā)表于 2024-6-2 10:56 | 顯示全部樓層
zhth1979 發(fā)表于 2024-6-1 14:15
重新描述一下:液晶段碼或數(shù)碼管顯示數(shù)據(jù)時,如果顯示的數(shù)據(jù)發(fā)生變化,需要更新顯示,而如果數(shù)據(jù)沒有變化, ...

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

使用道具 舉報

ID:1109793 發(fā)表于 2024-6-2 12:56 | 顯示全部樓層
zhth1979 發(fā)表于 2024-6-1 14:15
重新描述一下:液晶段碼或數(shù)碼管顯示數(shù)據(jù)時,如果顯示的數(shù)據(jù)發(fā)生變化,需要更新顯示,而如果數(shù)據(jù)沒有變化, ...

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

使用道具 舉報

ID:686513 發(fā)表于 2024-6-4 08:13 | 顯示全部樓層
xiaobendan001 發(fā)表于 2024-6-2 12:56
這不就是一直顯示嗎?有啥討論的?有變化就變化,沒變化更新了也沒變化啊,或者說更新了你也看不到,那不 ...

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

使用道具 舉報

ID:686513 發(fā)表于 2024-6-4 08:14 | 顯示全部樓層
lzts88 發(fā)表于 2024-6-2 10:56
你程序就只管檢測, 更新顯示數(shù)據(jù)就達(dá)到你要的效果了. 至于顯示數(shù)據(jù)最后一位或幾位會跳變, 那是加了軟件濾 ...

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

使用道具 舉報

ID:161164 發(fā)表于 2024-6-4 17:59 | 顯示全部樓層
zhth1979 發(fā)表于 2024-6-1 10:32
可能我表達(dá)不夠清楚,檢測數(shù)據(jù)有變化都要更新顯示,只有檢測數(shù)據(jù)穩(wěn)定后不更新并鎖定顯示.
  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. }
復(fù)制代碼
回復(fù)

使用道具 舉報

ID:686513 發(fā)表于 2024-6-5 12:55 | 顯示全部樓層

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

使用道具 舉報

ID:161164 發(fā)表于 2024-6-6 08:56 | 顯示全部樓層
zhth1979 發(fā)表于 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++)
回復(fù)

使用道具 舉報

ID:686513 發(fā)表于 2024-6-7 10:22 | 顯示全部樓層
lkc8210 發(fā)表于 2024-6-6 08:56
UpperBuff和LowerBuff是用來定義上下限的變量
例如UpperBuff=2,LowerBuff=2
ADC_NEW == 10,ADC_Old = ...

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

使用道具 舉報

ID:1124188 發(fā)表于 2024-6-7 12:31 | 顯示全部樓層
可以在每次顯示數(shù)據(jù)之前,先將新數(shù)據(jù)與當(dāng)前顯示的數(shù)據(jù)進(jìn)行比較,只有在數(shù)據(jù)不相同時才更新顯示。
回復(fù)

使用道具 舉報

ID:686513 發(fā)表于 2024-6-14 12:50 | 顯示全部樓層
LotusVirginMary 發(fā)表于 2024-6-7 12:31
可以在每次顯示數(shù)據(jù)之前,先將新數(shù)據(jù)與當(dāng)前顯示的數(shù)據(jù)進(jìn)行比較,只有在數(shù)據(jù)不相同時才更新顯示。

理論上是對的,有例程嗎?
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表