找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1025|回复: 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();                                      //关机
                 }
         }
}


回复

使用道具 举报

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发送新数据?
回复

使用道具 举报

ID:686513 发表于 2024-5-25 10:50 | 显示全部楼层
zhth1979 发表于 2024-5-25 09:09
多谢,目前我是显示和压力检测分开写的,压力数据送给显示变量,这个过程是在定时器中完成的,1ms发送一 ...

好像也不行,有这方面的例程吗?
回复

使用道具 举报

ID:686513 发表于 2024-5-25 10:50 | 显示全部楼层
yaosongjin 发表于 2024-5-24 14:27
加个标志位进行判断,当压力不变化的时候就不再刷新显示,同理当检测到压力变化时把标志位清0,继续显示

好像也不行,有这方面的例程吗?
回复

使用道具 举报

ID:123289 发表于 2024-5-27 08:29 | 显示全部楼层
正解。
显示程序判断你设定的标记即可,记住:用过之后要将标记清0。
回复

使用道具 举报

ID:23640 发表于 2024-5-27 09:27 | 显示全部楼层
zhth1979 发表于 2024-5-25 10:50
好像也不行,有这方面的例程吗?

加个记录数据的全局变量,当压力不变时显示上次记录的值
回复

使用道具 举报

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();                                      //关机
                 }
         }
}
回复

使用道具 举报

ID:686513 发表于 2024-5-28 13:58 | 显示全部楼层
yzwzfyz 发表于 2024-5-27 08:29
正解。
显示程序判断你设定的标记即可,记住:用过之后要将标记清0。

本来想在休眠判断里开关定时器0,会出现:1.要么可以锁定显示,数据变化时不能更新显示新数据。2.要么可以更新新数据,但不能锁定显示。
回复

使用道具 举报

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;
                          }
回复

使用道具 举报

ID:686513 发表于 2024-5-28 14:00 | 显示全部楼层
yaosongjin 发表于 2024-5-27 09:27
加个记录数据的全局变量,当压力不变时显示上次记录的值

同上回复。
回复

使用道具 举报

ID:1109793 发表于 2024-5-28 15:05 | 显示全部楼层
上个数据是0,这次数据大于0就更新,并且下次比上次数据大就更新,下次数据变小就不更新。
回复

使用道具 举报

ID:341045 发表于 2024-5-28 16:02 | 显示全部楼层
描述不准确, 应该这样写, 检测压力大于一个较小的值, 更新显示, 小于这个值(对应拿开, 按我理解压力应该为0), 不更新显示. 再测量重复以上
回复

使用道具 举报

ID:686513 发表于 2024-6-1 10:27 | 显示全部楼层
xiaobendan001 发表于 2024-5-28 15:05
上个数据是0,这次数据大于0就更新,并且下次比上次数据大就更新,下次数据变小就不更新。

可能我表达不够清楚,下次数据变小也要更新,也就是说检测数据有变化都要更新,只有检测数据稳定后不更新并显示.
回复

使用道具 举报

ID:686513 发表于 2024-6-1 10:32 | 显示全部楼层
lzts88 发表于 2024-5-28 16:02
描述不准确, 应该这样写, 检测压力大于一个较小的值, 更新显示, 小于这个值(对应拿开, 按我理解压力应该为0 ...

可能我表达不够清楚,检测数据有变化都要更新显示,只有检测数据稳定后不更新并锁定显示.
回复

使用道具 举报

ID:686513 发表于 2024-6-1 14:15 | 显示全部楼层
重新描述一下:液晶段码或数码管显示数据时,如果显示的数据发生变化,需要更新显示,而如果数据没有变化,则保持当前显示不变,这种效果如何实现?最好有例程参考一下,谢谢!
回复

使用道具 举报

ID:341045 发表于 2024-6-2 10:56 | 显示全部楼层
zhth1979 发表于 2024-6-1 14:15
重新描述一下:液晶段码或数码管显示数据时,如果显示的数据发生变化,需要更新显示,而如果数据没有变化, ...

你程序就只管检测, 更新显示数据就达到你要的效果了. 至于显示数据最后一位或几位会跳变, 那是加了软件滤波的效果, 这滤波好多种, 各有各的优点和缺点, 你可网上找例子看下. 或者你也可这样弄. 检测一次并显示后, 隔0.5秒, 或者隔3, 4 秒后再检测并显示下一次, 这样也可避免最后一位闪.
回复

使用道具 举报

ID:1109793 发表于 2024-6-2 12:56 | 显示全部楼层
zhth1979 发表于 2024-6-1 14:15
重新描述一下:液晶段码或数码管显示数据时,如果显示的数据发生变化,需要更新显示,而如果数据没有变化, ...

这不就是一直显示吗?有啥讨论的?有变化就变化,没变化更新了也没变化啊,或者说更新了你也看不到,那不就是显示不变?你自己也没搞懂到底想要啥
回复

使用道具 举报

ID:686513 发表于 2024-6-4 08:13 | 显示全部楼层
xiaobendan001 发表于 2024-6-2 12:56
这不就是一直显示吗?有啥讨论的?有变化就变化,没变化更新了也没变化啊,或者说更新了你也看不到,那不 ...

没变化的时候,没数据进来,也要保持显示最后一次数据直至休眠,如视频效果。https://www.bilibili.com/video/BV19e4y177FL/
回复

使用道具 举报

ID:686513 发表于 2024-6-4 08:14 | 显示全部楼层
lzts88 发表于 2024-6-2 10:56
你程序就只管检测, 更新显示数据就达到你要的效果了. 至于显示数据最后一位或几位会跳变, 那是加了软件滤 ...

不是滤波的问题,ADC不送来数据,屏也要显示最后一次数据直至休眠。
回复

使用道具 举报

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. }
复制代码
回复

使用道具 举报

ID:686513 发表于 2024-6-5 12:55 | 显示全部楼层

UpperBuff   LowerBuff   这两个代表什么?假如ADC_Filter()获取到如下几个AD值:  10   9  8   7  -------    ADC_NEW == 10,ADC_Old ==9,那  UpperBuff==?    LowerBuff==?
回复

使用道具 举报

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++)
回复

使用道具 举报

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小的一个数据保持显示。这个是随机的有可能是对的,有可能比真实值小。
回复

使用道具 举报

ID:1124188 发表于 2024-6-7 12:31 | 显示全部楼层
可以在每次显示数据之前,先将新数据与当前显示的数据进行比较,只有在数据不相同时才更新显示。
回复

使用道具 举报

ID:686513 发表于 2024-6-14 12:50 | 显示全部楼层
LotusVirginMary 发表于 2024-6-7 12:31
可以在每次显示数据之前,先将新数据与当前显示的数据进行比较,只有在数据不相同时才更新显示。

理论上是对的,有例程吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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