亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? vfd_hw.c

?? mtk1389L latest sourcecode enjoy
?? C
?? 第 1 頁 / 共 2 頁
字號:
/***************    MTK CONFIDENTIAL & COPYRIGHTED     ****************/
/***************                                       ****************/
/*************** Description : VFD Driver Routine      ****************/
/***************                                       ****************/
/***************                                       ****************/
/***************     Company : MediaTek Inc.           ****************/
/***************  Programmer : Harrison Hsieh          ****************/
/**********************************************************************/
#define _VFD_HW_C_

#pragma NOAREGS

#include "8032api.h"
#include VFD_CUS_H
#include "vfd_hw.h"

#ifdef VFD_SUPPORT

#include "vfd.h"

#ifdef LCD_HT1621
static void vVfdSendCom(BYTE bVal, BYTE bCnt) large;
static void VfdSendAddr(BYTE Addr) large;
static void VfdSendData(BYTE bData,BYTE bCnt) large;
#endif
//BOOL _fgAa = FALSE;

void vVfdInit(void) large
{
  BYTE i;
#ifdef LCD_HT1621
 //for SYS_EN
  vVfdStrobe(FALSE); 
  vVfdSendCom(LCD_CMD, 3);
  vVfdSendCom(LCD_SYS_EN, 8);
  vVfdSendCom(0, 1);
  vVfdStrobe(TRUE); 

  //for LCD_ON
  vVfdStrobe(FALSE); 
  vVfdSendCom(LCD_CMD, 3);
  vVfdSendCom(LCD_ON, 8);
  vVfdSendCom(0, 1);
  vVfdStrobe(TRUE); 
  
  //for TIMER_EN
  vVfdStrobe(FALSE); 
  vVfdSendCom(LCD_CMD, 3);
  vVfdSendCom(LCD_TIMER_EN, 8);
  vVfdSendCom(0, 1);
  vVfdStrobe(TRUE); 
  
   //for  rc 256k
  vVfdStrobe(FALSE); 
  vVfdSendCom(LCD_CMD, 3);
  vVfdSendCom(LCD_RC_256K, 8);
  vVfdSendCom(0, 1);
  vVfdStrobe(TRUE);
  
  //for bias 1/3, 4com
  vVfdStrobe(FALSE); 
  vVfdSendCom(LCD_CMD, 3);
  vVfdSendCom(LCD_BIAS13_COM4, 8);
  vVfdSendCom(0, 1);
  vVfdStrobe(TRUE);
  
  //for TNORMAL 
  vVfdStrobe(FALSE); 
  vVfdSendCom(LCD_CMD, 3);
  vVfdSendCom(LCD_TNORMAL, 8);
  vVfdSendCom(0, 1);
  vVfdStrobe(TRUE);
  vVfdDirectClrAll();
  vVfdShowMsg(SEG_MSG_HELLO, TRUE);
  for(i = 0; i < MAX_VFD_ADDR; i++)
  {
    vSetSharedInfo(SI_VFD_SHADOW_START + i, 0xff);  // reset the tmpbuf to zero
  }
   vVfdClearAll();
  
   _bVfdState = 0;
  _bVfdKeyScan = IR_NONE;

#else
  vVfdDirectClrAll();
  vVfdShowMsg(SEG_MSG_HELLO, TRUE);
  vVfdStrobe(FALSE);         // begin to write the VFD command
  vVfdUpdate(MODESET);
  vVfdStrobe(TRUE);          // strobe pull high to release the mode set
  
  vVfdStrobe(FALSE);         // begin to write the VFD command
  vVfdUpdate(VFD_CONTROL);
  _bVfdPulseLvl = VFD_CONTROL;
  vVfdStrobe(TRUE);          // strobe pull high to release the mode set

  for(i = 0; i < MAX_VFD_ADDR; i++)
  {
    vSetSharedInfo(SI_VFD_SHADOW_START + i, 0xff);  // reset the tmpbuf to zero
  }


  vVfdClearAll();

/*
  for(i = 0; i < MAX_VFD_ADDR; i++)
  {
//    vSetSharedInfo(SI_VFD_TMPBUF_START + i, 0);  // reset the tmpbuf to zero
    vSetSharedInfo(SI_VFD_SHADOW_START + i, 0);
  }
*/

  vVfdSetFlash(FALSE);
  _bVfdState = 0;
  _bVfdKeyScan = IR_NONE;
#endif
}

void vVfdPwrDownInit(BOOL fgCleanAll) large
{
  BYTE i;

#ifdef LCD_HT1621
  if(fgCleanAll)
  {
    for(i = 0; i < MAX_VFD_ADDR; i++)
    {
      vVfdDirectWrite(i, 0);
    }
    vVfdStrobe(FALSE);         // begin to write the VFD command
    vVfdSendCom(LCD_CMD, 3);
    vVfdSendCom(LCD_OFF, 8);
    vVfdSendCom(0, 1);
    vVfdStrobe(TRUE);   
  }
  _bVfdState = 0;
  _bVfdKeyScan = IR_NONE;
#else
  vVfdStrobe(FALSE);         // begin to write the VFD command
  vVfdUpdate(MODESET);
  vVfdStrobe(TRUE);          // strobe pull high to release the mode set


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

    vVfdStrobe(FALSE);         // begin to write the VFD command
    vVfdUpdate(0x80);
    vVfdStrobe(TRUE);          // strobe pull high to release the mode set
  }
  vVfdSetFlash(FALSE);
  _bVfdState = 0;
  _bVfdKeyScan = IR_NONE;
#endif
}


#ifdef LCD_HT1621
static void vVfdSendCom(BYTE bVal, BYTE bCnt) large
{
  BYTE i;
  bVal <<=(8-bCnt);
  for (i = 0; i < bCnt; i++)
  {
    vVfdClk(FALSE);
      
    DATA_PIN = (bVal & 0x80);
    _nop_(); _nop_();
    bVal <<= 1;
    
    vVfdClk(TRUE);
    _nop_(); _nop_(); _nop_(); _nop_();
  }
}

static void VfdSendAddr(BYTE Addr) large
{
  BYTE i; 

  Addr <<= 2;
  for (i = 0; i < 6; i++)
  {
    vVfdClk(FALSE);
    if(Addr & 0x80)
    {
      DATA_PIN = 1;
    }
    else
    {
      DATA_PIN = 0;
    }
    _nop_(); _nop_(); _nop_(); _nop_();
    Addr <<= 1;
    
    vVfdClk(TRUE);
    _nop_(); _nop_(); _nop_(); _nop_();
  }
}

static void VfdSendData(BYTE bData,BYTE bCnt) large
{
  BYTE i;
  
  for (i = 0; i < bCnt; i++)
  {
     vVfdClk(FALSE);
     DATA_PIN = (bData & 0x01);
     bData >>= 1;
    _nop_(); _nop_(); _nop_(); _nop_();
     vVfdClk(TRUE);
    _nop_(); _nop_(); _nop_(); _nop_();
  }
  _nop_(); _nop_(); _nop_(); _nop_();
  vVfdData(TRUE);
}
#else

static void vVfdUpdate(BYTE bTmp) large
{
  BYTE i;

  for (i = 0; i < 8; i++)
  {
    vVfdClk(FALSE);

    vVfdCombineBit(bTmp);
    bTmp >>= 1;

    vVfdClk(TRUE);
  }

  vVfdData(TRUE);
}
#endif
// should use increamental address and add a check to see that if we need to update address again

static void vVfdWrite(BYTE bAddr) large
{
  BYTE bCnt = 0;
  BYTE bData;

#ifdef LCD_HT1621
  vVfdStrobe(FALSE);
  vVfdSendCom(LCD_WRITE,3);
  VfdSendAddr(bAddr);
  while(TRUE)
  {
    bCnt++;
    bData = bSharedInfo(SI_VFD_TMPBUF_START + bAddr);  // get the data from the shadow

    VfdSendData(bData,4);
     
    vSetSharedInfo(SI_VFD_SHADOW_START + bAddr, bData);  // set the data in the display buf
    vVfdClrQueueMark(bAddr);    // after updating, clear the queue mark
    bAddr++;   // update the address to next
    if(bAddr == VFD_MAX_ADDR)
    {
      bAddr = 0;   //reset to 0;
    }

    if((bCnt >= VFD_MAX_UPDATE_CNT) || (!fgVfdQueueMark(bAddr)))
    {
      break;
    }
  }
  vVfdStrobe(TRUE);
#else

  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);


  while(TRUE)
  {
    bCnt++;
    bData = bSharedInfo(SI_VFD_TMPBUF_START + bAddr);  // get the data from the shadow

    vVfdUpdate(bData);   // the final data is written , strobe pull high
  
    vSetSharedInfo(SI_VFD_SHADOW_START + bAddr, bData);  // set the data in the display buf
    vVfdClrQueueMark(bAddr);    // after updating, clear the queue mark
    bAddr++;   // update the address to next
    if(bAddr == VFD_MAX_ADDR)
    {
      bAddr = 0;   //reset to 0;
    }

    if((bCnt >= VFD_MAX_UPDATE_CNT) || (!fgVfdQueueMark(bAddr)))
    {
      break;
    }
  }
  vVfdStrobe(TRUE);
#endif
}

void vVfdSegDisplay(BYTE SegPos, BYTE bNum, BOOL fgDirect) large
{
#if ((SEG_SIZE == 10) || (SEG_SIZE == 14))
  WORD wSegInfo;
#else
  BYTE bSegInfo;
#endif  
  
  BYTE i;
  BYTE bData;
  BYTE bAddr = VFD_ADDR_LIMIT;   // a initial unknown value in VFD memory

  if(!fgDirect)
  {    
    if((_bVfdTimer) || (bSharedInfo(SI_VFD_SEG_BAK + SegPos) == bNum))
    return;
  }


#if ((SEG_SIZE == 10) || (SEG_SIZE == 14))
  wSegInfo = _pbSegUnit[bNum] + (_pbSegUnitHi[bNum] << 8);
  if(fgDirect)
  {
    vDirectSequenceUpd(SEG_SIZE, _pbVfdSeg[SegPos], wSegInfo);  
  }
  else
  {
    vVfdSequenceUpdate(SEG_SIZE, _pbVfdSeg[SegPos], wSegInfo);  
  }
#else
  bSegInfo = _pbSegUnit[bNum];        // segment size = 7/8
  if(fgDirect)
  {
    vDirectSequenceUpd(SEG_SIZE, _pbVfdSeg[SegPos], (WORD)bSegInfo);  
  }
  else
  {
    vVfdSequenceUpdate(SEG_SIZE, _pbVfdSeg[SegPos], (WORD)bSegInfo);  
  }
#endif  
  

  // update into tmp buf here
  if(!fgDirect)
  {
    vSetSharedInfo(SI_VFD_SEG_BAK + SegPos, bNum);
  }
//  vVfdWriteQueue(bAddr, bData);  
}


// bTime one unit for half seconds

#if(defined(VFD_TEMP_TEXT)||defined(VFD_MESSAGE_FR)||defined(VFD_MESSAGE_PAUSE)||defined(VFD_MESSAGE_FR))
//peiyu,For UNCALLED SEGMENT
void vVfdShowTempMsg(BYTE bMsgId, BYTE b20msCnt) large
{
  BYTE i;

  for(i = 0; i < MAX_SEG_SEQ_NUM; i++)
  {
    vSetSharedInfo(SI_VFD_SEG_ORG + i, bSharedInfo(SI_VFD_SEG_BAK + i));  // backup the original
  }

  vVfdShowMsg(bMsgId, FALSE);

  _bVfdTimer = b20msCnt;  
}

#endif
static void vVfdRecoverSeg(void) large
{
  BYTE i;
  BYTE bSeg;

  for(i = 0; i < MAX_SEG_SEQ_NUM; i++)
  {
    bSeg = _pbSegSequence[i];
    vVfdSegDisplay(bSeg, bSharedInfo(SI_VFD_SEG_ORG + bSeg), FALSE);
  }
}


void vVfdShowMsg(BYTE bMsgIdIdx, BOOL fgDirect) large
{
  BYTE bPos; 
  BYTE bBound;
  BYTE i;
  WORD wMsgId;

  wMsgId = _pwMsgTable[bMsgIdIdx];
  
  if(_bVfdTimer)     // temp msg is still showed, do not cover it
  {
    return;
  }

  if(fgDirect)
  {
#ifndef LCD_HT1621
    vVfdStrobe(FALSE);         // begin to write the VFD command
    vVfdUpdate(MODESET);
    vVfdStrobe(TRUE);          // strobe pull high to release the mode set

    vVfdStrobe(FALSE);         // begin to write the VFD command
    vVfdUpdate(VFD_CONTROL);
    _bVfdPulseLvl = VFD_CONTROL;
    vVfdStrobe(TRUE);          // strobe pull high to release the mode set
#endif
  }
  
  bPos = (_pbVfdMsg[wMsgId] & 0xf0) >> 4;

  bBound = bPos + (_pbVfdMsg[wMsgId] & 0xf);

  for(i = 0; i < MAX_SEG_SEQ_NUM; i++)
  {
    if((i >= bPos) && (i < bBound))
    {
      vVfdSegDisplay(_pbSegSequence[i], _pbVfdMsg[wMsgId + i - bPos + 1], fgDirect);
    }
    else
    {
      vVfdSegDisplay(_pbSegSequence[i], SEG_CLEAN, fgDirect);
    }
  }

#ifdef DIRECT_CROSS_TABLE  
  if(fgDirect)
  {
    bPos = _pbMsgDirectTable[bMsgIdIdx];   // start position

    if(bPos == 0xff)
    {
      return;
    }

    bBound = _pbVfdDirectMsg[bPos];
 
    for(i = 0; i < bBound; i++)
    {
      i = i << 1;
      vVfdDirectWrite(_pbVfdDirectMsg[bPos + 1 + i], _pbVfdDirectMsg[bPos + 1 + i + 1]);

      i = i >> 1;
    }
  }

#endif
}




void vVfdSetMode(BYTE bMode, BOOL fgEnable) large
{
  BYTE bData;

  if(_pbVfdMode[bMode] == VFD_UNKNOWN_ADDR)
  {
    return;     // ignore this command
  }

  bData = bSharedInfo(SI_VFD_TMPBUF_START + _pbVfdMode[bMode]);

  if(fgEnable)
  {  
    bData = bData | _pbVfdMode[bMode + 1];
  }
  else
  {
    bData = bData & (~_pbVfdMode[bMode + 1]);
  }

  vVfdWriteQueue(_pbVfdMode[bMode], bData);
}


static void vVfdUpdateState(void) large // update into the VFD display memory
{
  BYTE i;
  BYTE bCnt = 0;    // initial value to 0
  BYTE bLimit;

  i = bSharedInfo(SI_VFD_UPDATE_WRIDX);
  bLimit = i;

  while(TRUE)
  {
    if(bCnt > VFD_MAX_UPDATE_CNT)
    {
      vSetSharedInfo(SI_VFD_UPDATE_WRIDX, i);
      break;
    }

    if(fgVfdQueueMark(i))
    {
      vVfdWrite(i);
      bCnt++;
    }    

    i++;

    if(i == VFD_MAX_ADDR)
    {
      i = 0;    // reset i to 0, wrap around to the head of the ring buffer
    }
    
    if(i == bLimit)    // all loop finish
    {
      break;   // write index not change in this case
    }
  }

}

static void vVfdDirectWrite(BYTE bAddr, BYTE bData) large
{
  if(bAddr == 0xff)
  {
    return;
  }
#ifdef LCD_HT1621
  vVfdStrobe(FALSE);
  vVfdSendCom(LCD_WRITE,3);
  VfdSendAddr(bAddr);
  VfdSendData(bData,4);
  vVfdStrobe(TRUE);
#else
  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);
#endif
}


static void vVfdWriteQueue(BYTE bAddr, BYTE bData) large
{
  BYTE bShadowData;

  if(bAddr == 0xff)
  {
    return;
  }

  bShadowData = bSharedInfo(SI_VFD_SHADOW_START + bAddr);

  if(bShadowData != bData)  // if it is the same as VFD display data, ignore this command
  {
    vSetSharedInfo(SI_VFD_TMPBUF_START + bAddr, bData);   // set the tmp buf data

    if(!fgVfdQueueMark(bAddr))  // the position is not in update queue already
    {
      vVfdSetQueueMark(bAddr);  // add the queue mark
    }
  }
  else
  {
    vSetSharedInfo(SI_VFD_TMPBUF_START + bAddr, bShadowData);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美综合亚洲图片综合区| 91官网在线观看| 欧美久久一二区| 欧美国产综合色视频| 日本不卡视频在线| 色中色一区二区| 久久久久久久久伊人| 日韩电影在线免费看| 一本大道久久精品懂色aⅴ| 国产视频在线观看一区二区三区| 丝袜美腿高跟呻吟高潮一区| 91丨九色丨尤物| 国产亚洲精品aa午夜观看| 蜜桃av一区二区| 欧美另类变人与禽xxxxx| 亚洲同性gay激情无套| 黑人巨大精品欧美黑白配亚洲| 欧美日韩一级二级| 亚洲另类一区二区| 成人99免费视频| 欧美国产成人精品| 国产精品一色哟哟哟| 精品国产免费人成电影在线观看四季 | 国产成人亚洲综合色影视| 这里只有精品电影| 亚洲不卡在线观看| 色婷婷综合久久久中文一区二区| 日本一区二区综合亚洲| 狠狠狠色丁香婷婷综合激情 | av资源网一区| 中文欧美字幕免费| 成人小视频在线观看| 国产视频亚洲色图| 国产精品亚洲第一| 久久精品一二三| 国产精品99久久久久久似苏梦涵| 欧美不卡在线视频| 精品在线你懂的| 久久夜色精品国产欧美乱极品| 免费看欧美女人艹b| 日韩一卡二卡三卡国产欧美| 天天综合日日夜夜精品| 欧美日本韩国一区| 亚洲高清一区二区三区| 欧美三级电影在线观看| 亚洲电影视频在线| 欧美色成人综合| 日韩高清电影一区| 欧美一区二区精品| 久久99精品久久只有精品| 欧美mv日韩mv| 国产剧情一区二区三区| 久久精品欧美一区二区三区不卡 | 三级在线观看一区二区| 欧美一级一区二区| 麻豆精品精品国产自在97香蕉 | 欧美日韩在线三级| 五月综合激情婷婷六月色窝| 在线成人av网站| 久久99久国产精品黄毛片色诱| 欧美精品一区二区三区蜜桃视频| 国产一区二区三区在线观看免费| 国产蜜臀97一区二区三区| www.色综合.com| 樱桃视频在线观看一区| 欧美精品乱人伦久久久久久| 久久精品国产999大香线蕉| 久久精品无码一区二区三区| 成人免费的视频| 一区二区三区高清| 欧美一区二区三区日韩| 激情文学综合网| 亚洲少妇屁股交4| 欧美日韩国产a| 国产一区二区美女| 亚洲视频在线一区观看| 欧美浪妇xxxx高跟鞋交| 国模大尺度一区二区三区| 国产精品麻豆欧美日韩ww| 欧美亚一区二区| 久久超碰97人人做人人爱| 国产精品视频线看| 欧美视频一区二| 国产很黄免费观看久久| 亚洲人妖av一区二区| 91精品午夜视频| 成人精品免费看| 视频一区二区欧美| 国产三级一区二区| 精品污污网站免费看| 国产激情视频一区二区三区欧美| 一区二区高清视频在线观看| 日韩一区二区影院| 91免费观看视频| 久久99最新地址| 亚洲欧美日韩一区二区三区在线观看| 欧美精品在线观看播放| 国产成人久久精品77777最新版本| 一区二区不卡在线视频 午夜欧美不卡在| 日韩一级欧美一级| 91免费版在线看| 国产精品综合一区二区三区| 亚洲午夜视频在线| 欧美激情艳妇裸体舞| 69堂亚洲精品首页| av不卡在线播放| 久久se这里有精品| 亚洲国产综合视频在线观看| 欧美极品aⅴ影院| 91精品国产麻豆| 一本大道久久a久久精二百| 国产在线精品免费| 午夜激情久久久| 国产精品大尺度| 久久影院电视剧免费观看| 欧美午夜免费电影| av成人老司机| 国内成人自拍视频| 日韩精品一区第一页| 亚洲欧美日韩国产成人精品影院 | 欧美性受xxxx| www.亚洲在线| 捆绑调教美女网站视频一区| 一区二区三区四区蜜桃| 国产午夜精品在线观看| 日韩女优视频免费观看| 欧美视频在线一区| 91美女视频网站| 丁香一区二区三区| 国内不卡的二区三区中文字幕 | 久久se精品一区精品二区| 亚洲成人av一区| 亚洲精品视频一区| 国产日韩av一区| 欧美精品一区二区三区在线 | 91搞黄在线观看| 99久久精品国产麻豆演员表| 国产精品一区二区久激情瑜伽| 日本中文字幕一区| 亚洲国产人成综合网站| 综合欧美亚洲日本| 国产精品天天看| 久久综合久色欧美综合狠狠| 欧美一级淫片007| 3d成人动漫网站| 51精品久久久久久久蜜臀| 精品视频免费在线| 欧美性猛交xxxx黑人交| 色爱区综合激月婷婷| 91在线观看视频| 91日韩精品一区| 色婷婷亚洲精品| 91国偷自产一区二区开放时间| 99re8在线精品视频免费播放| 国产成人av电影免费在线观看| 国产在线看一区| 国精产品一区一区三区mba桃花| 精彩视频一区二区| 狠狠色综合日日| 国产乱码精品一区二区三| 久久久亚洲高清| 国产精品一区二区不卡| 国产精品网站导航| 91精品国产色综合久久不卡蜜臀| 日韩av中文在线观看| 精品盗摄一区二区三区| 波多野结衣在线aⅴ中文字幕不卡| 18欧美亚洲精品| 5566中文字幕一区二区电影 | 欧美绝品在线观看成人午夜影视| 人人精品人人爱| 亚洲免费观看高清完整| 日韩欧美你懂的| 欧美日韩一区久久| 国产成人亚洲精品青草天美| 亚洲国产裸拍裸体视频在线观看乱了| 日韩亚洲欧美一区二区三区| 精品影视av免费| 青青草成人在线观看| 亚洲精选免费视频| 欧美色窝79yyyycom| 免费黄网站欧美| 亚洲一卡二卡三卡四卡| 国产精品久久久久aaaa| 91精品国产综合久久久久久久久久| 色先锋资源久久综合| 蜜桃av噜噜一区| 国产精品女主播av| 国产午夜精品久久久久久久| 91精品国产全国免费观看 | 正在播放亚洲一区| 丁香六月综合激情| 视频一区二区三区中文字幕| 专区另类欧美日韩| 精品国产91久久久久久久妲己| 91亚洲男人天堂| 91尤物视频在线观看| 欧美性生活大片视频| 国产成人aaa| 国产综合一区二区|