📄 vfd_hw.c
字号:
{
// _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 + -