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

標題: 壓力變化更新顯示,沒變化鎖定顯示,如何實現?如網上視頻所示效果 [打印本頁]

作者: zhth1979    時間: 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();                                      //關機
                 }
         }
}



作者: yaosongjin    時間: 2024-5-24 14:27
加個標志位進行判斷,當壓力不變化的時候就不再刷新顯示,同理當檢測到壓力變化時把標志位清0,繼續顯示
作者: yzwzfyz    時間: 2024-5-24 15:02
1、顯示與壓力分開寫。
2、顯示的內容,僅從變XS中取數據顯示。無論是掃描顯示,還是固定顯示,屏上都只顯示XS中值。
3、將首次壓力值送入XS中,以后當壓力有變化時,更新XS。無變化時,什么也不做。
作者: zhth1979    時間: 2024-5-25 09:09
yzwzfyz 發表于 2024-5-24 15:02
1、顯示與壓力分開寫。
2、顯示的內容,僅從變XS中取數據顯示。無論是掃描顯示,還是固定顯示,屏上都只 ...

多謝,目前我是顯示和壓力檢測分開寫的,壓力數據送給顯示變量,這個過程是在定時器中完成的,1ms發送一次,休眠是新的壓力數據和上次數據做比較,沒有變化就休眠,是不是在這個比較里面放個標志位,如果標志位為1發送上次數據,為0發送新數據?
作者: zhth1979    時間: 2024-5-25 10:50
zhth1979 發表于 2024-5-25 09:09
多謝,目前我是顯示和壓力檢測分開寫的,壓力數據送給顯示變量,這個過程是在定時器中完成的,1ms發送一 ...

好像也不行,有這方面的例程嗎?
作者: zhth1979    時間: 2024-5-25 10:50
yaosongjin 發表于 2024-5-24 14:27
加個標志位進行判斷,當壓力不變化的時候就不再刷新顯示,同理當檢測到壓力變化時把標志位清0,繼續顯示

好像也不行,有這方面的例程嗎?
作者: yzwzfyz    時間: 2024-5-27 08:29
正解。
顯示程序判斷你設定的標記即可,記住:用過之后要將標記清0。
作者: yaosongjin    時間: 2024-5-27 09:27
zhth1979 發表于 2024-5-25 10:50
好像也不行,有這方面的例程嗎?

加個記錄數據的全局變量,當壓力不變時顯示上次記錄的值
作者: zhth1979    時間: 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();                                      //關機
                 }
         }
}
作者: zhth1979    時間: 2024-5-28 13:58
yzwzfyz 發表于 2024-5-27 08:29
正解。
顯示程序判斷你設定的標記即可,記住:用過之后要將標記清0。

本來想在休眠判斷里開關定時器0,會出現:1.要么可以鎖定顯示,數據變化時不能更新顯示新數據。2.要么可以更新新數據,但不能鎖定顯示。
作者: zhth1979    時間: 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;
                          }
作者: zhth1979    時間: 2024-5-28 14:00
yaosongjin 發表于 2024-5-27 09:27
加個記錄數據的全局變量,當壓力不變時顯示上次記錄的值

同上回復。
作者: xiaobendan001    時間: 2024-5-28 15:05
上個數據是0,這次數據大于0就更新,并且下次比上次數據大就更新,下次數據變小就不更新。
作者: lzts88    時間: 2024-5-28 16:02
描述不準確, 應該這樣寫, 檢測壓力大于一個較小的值, 更新顯示, 小于這個值(對應拿開, 按我理解壓力應該為0), 不更新顯示. 再測量重復以上
作者: zhth1979    時間: 2024-6-1 10:27
xiaobendan001 發表于 2024-5-28 15:05
上個數據是0,這次數據大于0就更新,并且下次比上次數據大就更新,下次數據變小就不更新。

可能我表達不夠清楚,下次數據變小也要更新,也就是說檢測數據有變化都要更新,只有檢測數據穩定后不更新并顯示.
作者: zhth1979    時間: 2024-6-1 10:32
lzts88 發表于 2024-5-28 16:02
描述不準確, 應該這樣寫, 檢測壓力大于一個較小的值, 更新顯示, 小于這個值(對應拿開, 按我理解壓力應該為0 ...

可能我表達不夠清楚,檢測數據有變化都要更新顯示,只有檢測數據穩定后不更新并鎖定顯示.
作者: zhth1979    時間: 2024-6-1 14:15
重新描述一下:液晶段碼或數碼管顯示數據時,如果顯示的數據發生變化,需要更新顯示,而如果數據沒有變化,則保持當前顯示不變,這種效果如何實現?最好有例程參考一下,謝謝!

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

你程序就只管檢測, 更新顯示數據就達到你要的效果了. 至于顯示數據最后一位或幾位會跳變, 那是加了軟件濾波的效果, 這濾波好多種, 各有各的優點和缺點, 你可網上找例子看下. 或者你也可這樣弄. 檢測一次并顯示后, 隔0.5秒, 或者隔3, 4 秒后再檢測并顯示下一次, 這樣也可避免最后一位閃.
作者: xiaobendan001    時間: 2024-6-2 12:56
zhth1979 發表于 2024-6-1 14:15
重新描述一下:液晶段碼或數碼管顯示數據時,如果顯示的數據發生變化,需要更新顯示,而如果數據沒有變化, ...

這不就是一直顯示嗎?有啥討論的?有變化就變化,沒變化更新了也沒變化啊,或者說更新了你也看不到,那不就是顯示不變?你自己也沒搞懂到底想要啥
作者: zhth1979    時間: 2024-6-4 08:13
xiaobendan001 發表于 2024-6-2 12:56
這不就是一直顯示嗎?有啥討論的?有變化就變化,沒變化更新了也沒變化啊,或者說更新了你也看不到,那不 ...

沒變化的時候,沒數據進來,也要保持顯示最后一次數據直至休眠,如視頻效果。https://www.bilibili.com/video/BV19e4y177FL/
作者: zhth1979    時間: 2024-6-4 08:14
lzts88 發表于 2024-6-2 10:56
你程序就只管檢測, 更新顯示數據就達到你要的效果了. 至于顯示數據最后一位或幾位會跳變, 那是加了軟件濾 ...

不是濾波的問題,ADC不送來數據,屏也要顯示最后一次數據直至休眠。
作者: lkc8210    時間: 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. }
復制代碼

作者: zhth1979    時間: 2024-6-5 12:55
lkc8210 發表于 2024-6-4 17:59

UpperBuff   LowerBuff   這兩個代表什么?假如ADC_Filter()獲取到如下幾個AD值:  10   9  8   7  -------    ADC_NEW == 10,ADC_Old ==9,那  UpperBuff==?    LowerBuff==?
作者: lkc8210    時間: 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++)
作者: zhth1979    時間: 2024-6-7 10:22
lkc8210 發表于 2024-6-6 08:56
UpperBuff和LowerBuff是用來定義上下限的變量
例如UpperBuff=2,LowerBuff=2
ADC_NEW == 10,ADC_Old = ...

我把您這段代碼放在定時器里基本功能能實現,但會出現斷開氣源,鎖定顯示的壓力會跳變。如當前測得50PSI壓力,斷開氣源,會隨機顯示比50PSI小的一個數據保持顯示。這個是隨機的有可能是對的,有可能比真實值小。
作者: LotusVirginMary    時間: 2024-6-7 12:31
可以在每次顯示數據之前,先將新數據與當前顯示的數據進行比較,只有在數據不相同時才更新顯示。
作者: zhth1979    時間: 2024-6-14 12:50
LotusVirginMary 發表于 2024-6-7 12:31
可以在每次顯示數據之前,先將新數據與當前顯示的數據進行比較,只有在數據不相同時才更新顯示。

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




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 福利视频网站 | 精品国产99久久久久久宅男i | 久久视频免费在线观看 | 日韩欧美黄色片 | 欧美日韩激情 | 国产精品久久久久久无人区 | 日韩a在线| 麻豆成人91精品二区三区 | 亚洲人成在线观看 | 成人aaa| 日韩视频免费看 | 久久精品av| 夜夜操夜夜| 在线婷婷 | 成人欧美视频 | 黄色国产视频 | 久久精品av | 九九香蕉视频 | 最新中文字幕在线观看 | 五月天婷婷丁香 | 日韩欧美一级片 | 日韩精品小视频 | 欧美日韩亚洲一区二区三区 | 国产一区久久 | 国产午夜免费 | 亚洲激情综合网 | 亚洲第一伊人 | 国产精品视频一区二区三区 | 福利视频免费观看 | 国产精品第五页 | www.av在线播放 | 黄色大片一级 | 亚洲国产欧美日韩在线 | 国产裸体永久免费视频网站 | 亚洲69视频 | 黄色成年人视频 | 亚洲一区欧美 | 日韩成人一区 | 欧美级毛片 | 成人爽a毛片一区二区免费 亚洲午夜在线观看 | 国产成人毛片 |