找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2024|回复: 2
打印 上一主题 下一主题
收起左侧

再发一贴:还是关于单片机数码管设置时某位让它闪烁的问题

[复制链接]
跳转到指定楼层
楼主
采用老贴各位大神的方法,目前数码管设置时可以让它闪烁了,但还不是我想要的功能。我想加或减键按下数码管(含小数点)需要显示的位(含小数点)闪烁,加减调整时不闪烁,调整完成后闪烁3秒退出。现在的情况是:按下加或减数字会按设定的500ms闪烁,不管调整不调整都一直闪烁到3s退出(主要是闪烁时调数字不方便观看)。
定时部分单片机源程序如下:

void Timer1Init(void)                //1毫秒@12.000MHz
{
        TMOD &= 0x0F;                     //设置定时器模式
        TMOD |= 0x10;                     //设置定时器模式
        TL1 = 0x18;                       //设置定时初始值
        TH1 = 0xFC;                       //设置定时初始值
        TF1 = 0;                         //清除TF1标志
        ET1=1;               //定时器1开关
        TR1 = 1;                         //定时器1开始计时
}
void timer1_ISR(void) interrupt 3          //定时器中断1,中断号:3
{        
  TR1=0;                                   //定时器1计时关闭

//定时设定值3S显示
  if(T1Cnt != 0)                           //如果T1Cnt不等于0
    {                                
      T1Cnt--;                             //每次进入定时中断都自减1,直到等于零为止。
    keyflag=1;                           //3S到keyflag=1:读EEPROM值,显示3S按键调整值               
    }
  else                                      
          {
                keyflag=0;                           //3S到keyflag=0:退出显示压力值
          }
        
        if(++SSCnt>=500)                        //闪烁累加>=500ms
                {
                   SSCnt=0;                                 //清0,下一个500ms
               flag =~ flag;                                        //闪烁标志500ms取反一次
                }


显示部分
if(keyflag)
         {
        switch(wnd)                                //不同窗口显示按键值
              {                        
                case 0: parm1 = keynum1;    break;         //窗口1显示按键值
                case 1: parm2 = keynum2;    break;         //窗口2显示按键值
                case 2: parm3 = keynum3;    break;         //窗口3显示按键值
                case 3: parm4 = keynum4;    break;         //窗口4显示按键值
                default:break;                        
               }        
          }
else
         {
          switch(wnd)                                 //不同窗口显示压力值//补气值
            {                        
                case 0: if(md1==1) parm1 = press-30;         else parm1 = press; if(press<30) parm1=0; break;      //窗口1显示压力值
                case 1: if(md1==1) parm2 = press*0.689-30;   else parm2 = press; if(press<30) parm2=0; break;   //窗口2显示压力值                case 2: if(md1==1) parm3 = press*0.689-30;   else parm2 = press; if(press<30) parm3=0; break;   //窗口3显示压力值
                case 3: if(md1==1) parm4 = press*0.7-30;     else parm2 = press; if(press<30) parm4=0; break;    //窗口4显示压力值
                default:break;                        
             }
         }
按键部分      keynum1<996本来这里是按小于1000判断的,但不知道为什么退一位后再加直接跳到104,不能显示101 102 103,再往回减到101再加可以102,103,如果减到995再加又直接跳到104.    改到小于996后可以正常加减并正常显示,但不知道为什么?   注:只有三位数码管,小于100显示两位整数加一位小数,超出100,舍弃小数位,显示三位整数。
void key_Service()
{        
switch(key_scan(160))
    {        
      case 1:
        switch(wnd)       按下按键先读取eeprom,然后判断加减范围,现在发现第一次上电后按减键会超出范围,显示乱码,只有按加键才行,不理                                        解?还有加减后保存到eeprom,每次只能保存一个窗口的值,再选到其它窗口再设置保存后,上次的窗口的值就会复位还原!
        {        
       case 0:T1Cnt=epxs_short; keynum1 = Read_EEPROM_u16(0x0400);
          if(keynum1<996) keynum1 = keynum1+5;else keynum1++;   if(keynum1>1050) keynum1=30;  Save_EEPROM_u16(0x0400, keynum1); break;                                                                                                                                          //范围:0~150,0~100加5,到100退位显示100~150加1
       case 1:T1Cnt=epxs_short; keynum2 = Read_EEPROM_u16(0x0500);
         if(keynum2<996) keynum2 = keynum2+5; else keynum2++;   if(keynum2>1003) keynum2=20;  Save_EEPROM_u16(0x0500, keynum2); break;                                                                                                                                
      case 2:T1Cnt=epxs_short; keynum3 = Read_EEPROM_u16(0x0600);
                     keynum3 = keynum3+5;                   if(keynum3>995)  keynum3=20;  Save_EEPROM_u16(0x0600, keynum3); break; //kpa:20-995
      case 3: T1Cnt=epxs_short; keynum4 = Read_EEPROM_u16(0x0700);
        if(keynum4<996) keynum4 = keynum4+5; else keynum4++;   if(keynum4>1003) keynum4=20;  Save_EEPROM_u16(0x0700, keynum4); break;                                                                                //kg/cm:0.2-10.5                                                                                                          }                                                                                        FMQCnt = FMQ_short;        //按键声音触发,滴一声就停。                                                                                break;


上面红字部分都是我需要各路大神的指点,不胜感激!!

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2022-4-19 09:03 | 只看该作者
LED各个位闪烁的方法(设8个LED):
1、做一个标记S03,S03每0.3秒求反一次。(在时间中断中实现,你可以不用0.3秒,改用其它值)
2、用一个字节BX其8个位叫:BX7-BX0(其中的一个叫BXN),分别对应指出哪个LED位正在闪烁。
   例如当BX=10000000(即BX7=1,BX6-0=0)表示只有LED7闪动显示,其它不闪。BX=10100000,表示LED7,5同时闪。
3、定义一个字节ID,指示扫描正处于显示哪一个LED,每次时间中断将ID+1,且ID=0-7。比如ID=4,则显示LED4,其它的不显示。
4、定义8个字节RXS7-RXS0,用于存放LED的显示内容(当然需要你事先做好译码工作)。
5、每次中断只显示的一个LED(先关全部,再显示一个),显示哪一位由ID指出。
6、是否将RXSN(RXS7-RXS0中的一个)送到LED进行显示,由下列计算决定:BXS=/BXN+BXN*S03
     当BXS=1时,表示显示,则将RXSN送至LED显示;

     当BXS=0时,则将不显示(实际是将黑字送到LED,通常是FFH或00H,也可用“-”)。
例如:ID=2,RXS2=“3”(译码后的3),BX2=1(闪动),S03=0。则:BXS=/BX2+BX2*S03=/1+1*0=0,所以不显示,将FFH送至LED2(无显)。
     如果送“_”则形成“_”与“3”互闪。
例如:ID=2,RXS2=“3”(译码后的3),BX2=1(闪动),S03=1。则:BXS=/BX2+BX2*S03=/1+1*1=1,所以显示,将“3”送至LED2。
例如:ID=2,RXS2=“3”(译码后的3),BX2=0(不闪动),S03=x。则:BXS=/BX2+BX2*S03=/0+1*S03=1,所以显示,将“3”送至LED2。

如此闪动就操作简单了:需要哪位闪动,就将哪位对应的BXn置1,即可。不闪就清0。
回复

使用道具 举报

板凳
ID:686513 发表于 2022-4-22 21:22 | 只看该作者
yzwzfyz 发表于 2022-4-19 09:03
LED各个位闪烁的方法(设8个LED):
1、做一个标记S03,S03每0.3秒求反一次。(在时间中断中实现,你可以不用 ...

多谢 !
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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