⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vfd_hw.c

📁 MTK 1389e版 MINI组合音响代码
💻 C
📖 第 1 页 / 共 3 页
字号:
		      {
		     //   _bVfdKeyScan = _pbVfdKeyScan[i];
			tempbuff=_pbVfdKeyScan[i];
		        _fgVfdHold = TRUE;
		      }
	      		fgRelease = FALSE;
		}
    }
	
    vVfdClk(TRUE);   // to prevent clear clock to fast, maybe can be removed
  }
  vVfdStrobe(TRUE);     // pull the strobe to high

while(tempbuff!=_bKeyBuff)
{
  vVfdStrobe(FALSE);         // begin to write the VFD command
  vVfdUpdate(KEY_SCAN);
  vVfdClk(TRUE);          // waiting for the Twait (1 us)

vI2CDelay2us(0x04);
  vVfdData(TRUE);          // pull the data inout line to high
 vI2CDelay2us(0x04);

  vVfdClk(TRUE);
vI2CDelay2us(0x04);

  for(i = 0; i < SCANSIZE; i++)      // how many bits we should scan here
  {
    vVfdClk(FALSE);
	vI2CDelay2us(0x04);
    vVfdClk(FALSE);   // may can be removed
    vI2CDelay2us(0x04);
    vVfdClk(TRUE);
vI2CDelay2us(0x04);

    // get the bits from the datout pin
    if(DATA_PIN)
    {
	if(_bKeyData)
		{
		//  if(!_fgVfdHold)
		      {
		       // _bVfdKeyScan = _pbVfdKeyScan[i];
			tempbuff=_pbVfdKeyScan[i];
		        _fgVfdHold = TRUE;
		      }
	      		//fgRelease = FALSE;
		}
	else
		{
			if(!_fgVfdHold)
		      {
		        //_bVfdKeyScan = _pbVfdKeyScan[i];
			tempbuff=_pbVfdKeyScan[i];
		        _fgVfdHold = TRUE;
		      }
	      		fgRelease = FALSE;
		}
    }
	
    vVfdClk(TRUE);   // to prevent clear clock to fast, maybe can be removed
  }
  vVfdStrobe(TRUE);     // pull the strobe to high
_bKeyBuff=tempbuff;
//_bVfdKeyScan=tempbuff;
}
  _bVfdKeyScan=_bKeyBuff;
#endif


  if((_fgVfdHold) && (fgRelease))
  {
    _fgVfdHold = FALSE;   // release the LOCK here
  }

if((_bVfdKeyScan==IR_CH_VOL_ADD)||(_bVfdKeyScan==IR_CH_VOL_SUB))
{
_bKeyData=1;
}
else  _bKeyData=0;

#if  !defined(DVD_RECEIVER) 
  if(fgPwrDown)
  {
    //re key-map here
    switch(_bVfdKeyScan)
    {
      case IR_POWER:
      case IR_EJECT:
        break;

      /* panel play key is power key */
      case IR_PLAY:
      case IR_PLAY_PAUSE:
      case IR_PLAY_ENTER:
        _bVfdKeyScan = IR_POWER;
        break;
      default:
        _bVfdKeyScan = IR_NONE;
        break;
    }
  }
#else

    if (_bSysState == DVD_STATE)
       return  ;
    //_fgVfdLongKeyProced,_bVfdLongKeyCounter
   // if (_bSysState ==TUNER_STATE )
    	//{
    	#ifdef  CS360
	    if (_bVfdKeyScan == IR_NEXT)
	#else
	    if (_bVfdKeyScan == IR_FF)
	#endif		
	    {
	      if (_fgVfdLongKeyProced != 0x04 && _fgVfdLongKeyProced != 0x0f)   //First pushed the IR_FF key
	      {
	      	   _bVfdLongKeyCounter = 0;
	      	   _fgVfdLongKeyProced = 0x04;
	      }	   

	      _bVfdKeyScan = IR_NONE;
	    }	
	#ifdef   CS360
	    else if (_bVfdKeyScan == IR_PREV)
	#else
	    else if (_bVfdKeyScan == IR_FR)
	#endif		
	    {
	      if (_fgVfdLongKeyProced != 0x40 && _fgVfdLongKeyProced != 0xf0 )   //First pushed the IR_FF key
	      {
	      	   _bVfdLongKeyCounter = 0;       
	      	   _fgVfdLongKeyProced = 0x40;
	      }	   
	      _bVfdKeyScan = IR_NONE;
	    }
	    else  if (!_fgVfdHold)  //because when _fgVfdHold is TRUE and fgRelease is FALSE, _bVfdKeyScan == IR_NONE
	    {
	         //判断原先是否有IR_FF 或 IR_FR 按下
	         if (_fgVfdLongKeyProced == 0x04)
	         {
	             if (_bVfdLongKeyCounter >= LONGKEYTIME)
	                 _bVfdKeyScan = IR_UPSEARCH ;
	             else 
	                 _bVfdKeyScan =  IR_FF;
	         }    
	         else if (_fgVfdLongKeyProced == 0x40)
	         {
	              if (_bVfdLongKeyCounter >= LONGKEYTIME)
	                  _bVfdKeyScan = IR_DOWNSEARCH ;
	              else 
	                  _bVfdKeyScan =  IR_FR;
	         }
	         _bVfdLongKeyCounter = 0;
	         _fgVfdLongKeyProced = FALSE;
	     }	
	     else if (_bVfdLongKeyCounter >= LONGKEYTIME)
	     {
	         if (_fgVfdLongKeyProced == 0x04)
	             _bVfdKeyScan = IR_UPSEARCH ;
	          else if (_fgVfdLongKeyProced == 0x40)   
	             _bVfdKeyScan = IR_DOWNSEARCH ;
	     }
    	//}
	//if((_bKeyData==IR_CH_VOL_ADD)||(_bKeyData==IR_CH_VOL_SUB))
		//check_remkey(_bKeyData);
	//else _bKeyData=0xff;
#endif  
}

void vVfdClearAll(void) large
{
  BYTE i;

  if(_bVfdTimer) //BillDen
  {
    return;
  }

  for(i = 0; i <= MAX_VFD_ADDR; i++)
  {
#if defined(DVD_RECEIVER)
//    if (_bSysState != DVD_STATE)
   if (_bPWRMode >= 4)     //#define SV_PWR_STANDBY 4
       pbVFDShadow[i] = 0;   //When PowerDown Use these to replace shareinfo
    else
#endif  	
    vSetSharedInfo(SI_VFD_TMPBUF_START + i, 0);  // reset the tmpbuf to zero
    vVfdSetQueueMark(i);
//    vVfdWrite(i);                                // initial the display memory(the shadow will also initial here)
//    vSetSharedInfo(SI_VFD_SHADOW_START + i, 0);
//    vVfdDirectWrite(i, 0);
  }

  for(i = 0; i < VFD_SEG_BAK_SIZE; i++)
  {
  #if defined(DVD_RECEIVER)
//     if (_bSysState != DVD_STATE) 
     if (_bPWRMode < 4)     //#define SV_PWR_STANDBY 4
  #endif	
         vSetSharedInfo(SI_VFD_SEG_BAK + i, 0xff);
  }
 
  #if defined(DVD_RECEIVER)
//     if (_bSysState != DVD_STATE)
     if (_bPWRMode >= 4)     //#define SV_PWR_STANDBY 4
         bVfdRefreshPos = 0;
     else    
  #endif	
        vSetSharedInfo(SI_VFD_UPDATE_WRIDX, 0);
        
    
  _bVfdDiscPos = MAX_DISC_NUM;
  _bVfdTimer = 0;
}


void vVfdDirectClrAll(void) large
{
  BYTE i;

  for(i = 0; i < QUEUEMARKSIZE; i++)
  {
    _bVfdQueueMark[i] = 0;
  }

  for(i = 0; i <= MAX_VFD_ADDR; i++)
  {
    vVfdDirectWrite(i, 0);
  }

  _bVfdDiscPos = MAX_DISC_NUM;
  _bVfdTimer = 0;


}

// lvl : 0 for 1/16
//       1 for 2/16
//       2 for 4/16
//       3 for 10/16
//       4 for 11/16
//       5 for 12/16
//       6 for 13/16
//       7 for 14/16
void vVfdSetPulseWidth(BYTE bLvl, BOOL fgDispOn) large
{
  _bVfdPulseLvl = (((BYTE)fgDispOn << 3) + bLvl + 0x80);

  vVfdStrobe(FALSE);
  vVfdUpdate(_bVfdPulseLvl);
  vVfdStrobe(TRUE);
}

//======================= Test Vfd function============

#ifdef TEST_VFD
void vVfdSetConfigMode(void)large;
 void vVfdSetNode(BYTE bAddr, BYTE bData) large
{
  if(bAddr == 0xff)
  {
    return;
  }

  vVfdStrobe(FALSE);
  vVfdUpdate(DATA_SET_INC) ;  // issue the write data command
  vVfdStrobe(TRUE);

  
  vVfdStrobe(FALSE);
  vVfdUpdate(ADDR_SET | bAddr);  // after setting the address, the strobe need not to pull high
  vVfdStrobe(FALSE);

  vVfdUpdate(bData);   // the final data is written , strobe pull high
  vVfdStrobe(TRUE);
}
void vVfdSetAllNode(BYTE bOnOff)large
{
  BYTE i;
     
  for(i = 0; i <= TEST_MAX_VFD_ADDR; i++)
  {
    vVfdSetNode(i,0xff * bOnOff);
  }
}

void vVfdSetConfigMode(void)large
{
   vVfdStrobe(FALSE);         // begin to write the VFD command
   vVfdUpdate(MODESET);
   vVfdStrobe(TRUE); 
   vVfdStrobe(FALSE);         // begin to write the VFD command
   vVfdUpdate(VFD_CONTROL);
   vVfdStrobe(TRUE); 
}
#endif
//================================
void vVfdFlash(void) large
{
  _bVfdPulseLvl ^= 0x8;
  
  vVfdStrobe(FALSE);
  vVfdUpdate(_bVfdPulseLvl);
  vVfdStrobe(TRUE);
}

static void vVfdFlashState(void) large
{
  _bVfdFlashTimer--;
  if(_bVfdFlashTimer == 0)
  {
    vVfdFlash();                        // should flash
  }

  if(_bVfdFlashTimer > FLASH_INTERVAL)  // for bug prevention
  { 
     // should be removed
    _bVfdFlashTimer = FLASH_INTERVAL;
  }
}


// bOption : 0xff => light on all
// bOption : 0    => off all wheel
// bOption : 1    => spin to the next position depends on the style
// bVfdWheelPos : 0xff => light on all, MAX_WHEEL_NUM => all off, others => the current spinning position
// initial , the wheel are all off, and _bVfdDiscPos set as MAX_WHEEL_NUM
void vVfdRotate(BYTE bOption) large
{
  BYTE bAddr = VFD_ADDR_LIMIT;
  BYTE bData;
  BYTE i;
  WORD wDiscData;

  if(MAX_DISC_NUM == 0)
  {
    return;
  }


  switch(bOption)
  {
    case VFD_DISC_LIGHT_ALL:
      wDiscData = 0xffff;
      _bVfdDiscPos = 0xff;
      break;
    case VFD_DISC_LIGHT_OFF:
      wDiscData = 0;
      _bVfdDiscPos = MAX_DISC_NUM;
      break;
    case VFD_DISC_SPIN:
      if(_bVfdDiscPos >= MAX_DISC_NUM)
      {
        _bVfdDiscPos = 0;
      }
      else
      {      
// may need add more option here      
#if (DISC_STYLE == 0) 
        _bVfdDiscPos++;
        if(_bVfdDiscPos == (MAX_DISC_NUM >> 1))
        {
          _bVfdDiscPos = 0;
        }
      }
      wDiscData = (1 << _bVfdDiscPos) + (1 << (_bVfdDiscPos + (MAX_DISC_NUM >> 1)));
#elif (DISC_STYLE == 1)  
        _bVfdDiscPos--;
        if(_bVfdDiscPos == 0xff)
        {
          _bVfdDiscPos = ((MAX_DISC_NUM >> 1) - 1);
        }
      }
      wDiscData = (1 << _bVfdDiscPos) + (1 << (_bVfdDiscPos + (MAX_DISC_NUM >> 1)));
#elif (DISC_STYLE == 2)
        _bVfdDiscPos++;
        if(_bVfdDiscPos == (MAX_DISC_NUM))
        {
          _bVfdDiscPos = 0;
        }
      }
      wDiscData = (~(1 << _bVfdDiscPos)) & 0xffff;
#elif (DISC_STYLE == 3)      
        _bVfdDiscPos--;
        if(_bVfdDiscPos == 0xff)
        {
          _bVfdDiscPos = MAX_DISC_NUM - 1;
        }
      }
      wDiscData = (~(1 << _bVfdDiscPos)) & 0xffff;
#elif (DISC_STYLE == 4)
        _bVfdDiscPos++;
        if(_bVfdDiscPos == (MAX_DISC_NUM >> 1))
        {
          _bVfdDiscPos = 0;
        }
      }
      wDiscData = (1 << _bVfdDiscPos) + (1 << (_bVfdDiscPos + (MAX_DISC_NUM >> 1)));
      wDiscData = (~wDiscData) & 0xffff;
#endif
      break;
    default:
      break;
  }

  vVfdSequenceUpdate(MAX_DISC_NUM, _pbVfdDisc, wDiscData);
}

#else

static code BYTE pbVfdHw[1] = { 0 };

void vVfdInit(void) large
{
  _bVfdState = pbVfdHw[0];
  _bVfdKeyScan = IR_NONE;
}

void vVfdPwrDownInit(BOOL fgCleanAll) large
{
  _bVfdState = pbVfdHw[0];
  _bVfdKeyScan = IR_NONE;  
}

void vVfdTimerState(BOOL fgPowerDown) large    // 20 ms timer routine
{
  _bVfdKeyScan = IR_NONE;   // always IR_NONE
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -