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

📄 microvfd.c

📁 一个两碟控制的VCD的代码,两碟之间的转动及连续播放,已大量生产的CODE.
💻 C
📖 第 1 页 / 共 3 页
字号:
{
    VFD_strobeSendByte(VFD_ADDRESS_FIX);
    VFD_next_state = VFD_state_refresh_3;
}

PRIVATE void VFD_state_refresh_3()
{
    unsigned char * refresh_tbl = T_VFD_refresh_tbl;

    RefreshCounter = POPVFD;
    CLEAR_VFD_STROBE;
    VFD_objectSendByte(refresh_tbl[RefreshCounter] | VFD_ADDRESS_MASK);
    VFD_next_state = VFD_state_refresh_4;
}

PRIVATE void VFD_state_refresh_4()
{
    VFD_objectSendByte(ShadowRam[RefreshCounter]);
    SET_VFD_STROBE;
    VFD_next_state = VFD_state_refresh_5;
}

PRIVATE void VFD_state_refresh_5()
{
    if (EnableFlashing && (glbTimer > ObjectTime.FlashTime)) {
	ObjectTime.FlashTime = glbTimer + HALF_SECOND;
	flashCalendar();
    }
    VFD_next_state = VFD_state_scan_key_0;
}

#endif /* D16312 */

#ifdef MN12510
/* By Liang Weihua */
PRIVATE	int	AddrCounter;
PRIVATE	int	ShadowCounter;
PRIVATE	int	ReadKey;
/************************************************************************
 ********************** State machine for 12510 *************************
 ************************************************************************/
PRIVATE void VFD_state_init()
{
/*  STATE_INIT is too long,and it can reset by itself,so I don't send 0 to it
                  --- Liang Weihua */
    CLEAR_VFD_STROBE;
    VFD_objectSendByte(0x00);
    VFD_objectSendByte(FLPCNT);
    SET_VFD_STROBE;
    CLEAR_VFD_STROBE;
    VFD_objectSendByte(0x01);
    VFD_objectSendByte(DGTCNT);
    SET_VFD_STROBE;
    CLEAR_VFD_STROBE;
    VFD_objectSendByte(0x02);
    VFD_objectSendByte(SEGCNT);
    SET_VFD_STROBE;
    CLEAR_VFD_STROBE;
    VFD_objectSendByte(0x03);
    VFD_objectSendByte(P01CNT);
    SET_VFD_STROBE;
    CLEAR_VFD_STROBE;
    VFD_objectSendByte(0x04);
    VFD_objectSendByte(P2DIR);
    SET_VFD_STROBE;
    CLEAR_VFD_STROBE;
    VFD_objectSendByte(0x05);
    VFD_objectSendByte(P2CNT);
    SET_VFD_STROBE;
    CLEAR_VFD_STROBE;
    VFD_objectSendByte(0x06);
    VFD_objectSendByte(P3DIR);
    SET_VFD_STROBE;
    CLEAR_VFD_STROBE;
    VFD_objectSendByte(0x07);
    VFD_objectSendByte(P3CNT);
    SET_VFD_STROBE;
    CLEAR_VFD_STROBE;
    VFD_objectSendByte(0x08);
    VFD_objectSendByte(KEYCNT);
    SET_VFD_STROBE;
    CLEAR_VFD_STROBE;
    VFD_objectSendByte(0x0c);
    VFD_objectSendByte(P01DATA);
    SET_VFD_STROBE;
    CLEAR_VFD_STROBE;
    VFD_objectSendByte(0x0d);
    VFD_objectSendByte(P2DATA);
    SET_VFD_STROBE;
    CLEAR_VFD_STROBE;
    VFD_objectSendByte(0x0e);
    VFD_objectSendByte(P3DATA);
    SET_VFD_STROBE;
    VFD_next_state = VFD_state_scan_key_0;
}

PRIVATE void VFD_state_scan_key_0()
{
    CLEAR_VFD_STROBE;
    DataLength = KEY_LENGTH;
    ReadKey = 0x60;
    VFD_state_scan_key_1();
}

PRIVATE void VFD_state_scan_key_1()
{
    CLEAR_VFD_STROBE;
    VFD_objectSendByte(ReadKey++);
    VFD_next_state = VFD_state_scan_key_2;
}

PRIVATE void VFD_state_scan_key_2()
{
    VFD_objectReadByte();
    ObjectKey.KeyBuffer[KEY_LENGTH - DataLength] = ReceivedByte;
    --DataLength;
    VFD_next_state = VFD_state_scan_key_3;
}

PRIVATE void VFD_state_scan_key_3()
{
    VFD_objectReadByte();
    ObjectKey.KeyBuffer[KEY_LENGTH - DataLength] = ReceivedByte;
    SET_VFD_STROBE;
    if (--DataLength)
      VFD_next_state = VFD_state_scan_key_1;
    else 
      VFD_next_state = VFD_state_scan_key_4;
}

PRIVATE void VFD_state_scan_key_4()
{
    VFD_searchKey();
    VFD_next_state = VFD_state_scan_key_5;
}

PRIVATE void VFD_state_scan_key_5()
{
    VFD_parseKey();
    VFD_next_state = VFD_state_refresh_0;
}

PRIVATE void VFD_state_refresh_0()
{
    if (!VFDptr) 
      VFD_state_refresh_4();
    else 
      VFD_state_refresh_1();
}

PRIVATE void VFD_state_refresh_1()
{
    unsigned char * refresh_tbl = T_VFD_refresh_tbl;

    RefreshCounter = POPVFD;
    AddrCounter = (int)(RefreshCounter/2);
    if (RefreshCounter & 0x1)
      ShadowCounter = (RefreshCounter - 1);
    else
      ShadowCounter = RefreshCounter;             
    CLEAR_VFD_STROBE;
    VFD_objectSendByte(refresh_tbl[AddrCounter] | VFD_ADDRESS_MASK);
    VFD_next_state = VFD_state_refresh_2;
}

PRIVATE void VFD_state_refresh_2()
{
    VFD_objectSendByte(ShadowRam[ShadowCounter++]);
    VFD_next_state = VFD_state_refresh_3;
}

PRIVATE void VFD_state_refresh_3()
{
    VFD_objectSendByte(ShadowRam[ShadowCounter]);
    SET_VFD_STROBE;
    VFD_next_state = VFD_state_refresh_4;
}

PRIVATE void VFD_state_refresh_4()
{
    if (EnableFlashing && (glbTimer > ObjectTime.FlashTime)) {
	ObjectTime.FlashTime = glbTimer + HALF_SECOND;
	flashCalendar();
    }
    VFD_next_state = VFD_state_scan_key_0;
}

#endif /* MN12510 */


#ifdef BU2872
/* By Liang Weihua */
PRIVATE	int	AddrCounter;
PRIVATE	int	ShadowCounter;
/************************************************************************
 ********************** State machine for 2872 **************************
 ************************************************************************/
PRIVATE void VFD_state_init()
{
    /*
     * BU2872AK VFD driver only send two bit per send a address,its speed
     * very slow, sending  0 to it in STATE_INIT use time,and it can reset ,
     * so I don't do it!  --- Liang Weihua
     */
    VFD_strobeSendByte(VFD_MODE);
    VFD_next_state = VFD_state_scan_key_0;
}

PRIVATE void VFD_state_scan_key_0()
{
    SET_VFD_STROBE;
    DataLength = KEY_LENGTH;
    VFD_objectSendByte(VFD_READ_KEY);
    VFD_next_state = VFD_state_scan_key_1;
}

PRIVATE void VFD_state_scan_key_1()
{
    VFD_objectReadByte();
    VFD_next_state = VFD_state_scan_key_2;
}

PRIVATE void VFD_state_scan_key_2()
{
    ObjectKey.KeyBuffer[KEY_LENGTH - DataLength] = ReceivedByte;
    if (--DataLength)
      VFD_state_scan_key_1();
    else {
	CLEAR_VFD_STROBE;
	VFD_state_scan_key_3();
    }
}

PRIVATE void VFD_state_scan_key_3()
{
    VFD_searchKey();
    VFD_next_state = VFD_state_scan_key_4;
}

PRIVATE void VFD_state_scan_key_4()
{
    VFD_parseKey();
    VFD_next_state = VFD_state_refresh_0;
}

PRIVATE void VFD_state_refresh_0()
{
    if (!VFDptr)
      VFD_state_refresh_4(); 
    else {
	VFD_strobeSendByte(VFD_MODE);
	VFD_next_state = VFD_state_refresh_1;
    }
}

PRIVATE void VFD_state_refresh_1()
{
    unsigned char * refresh_tbl = T_VFD_refresh_tbl;

    RefreshCounter = POPVFD;
    AddrCounter = (int)(RefreshCounter/2) + 1;
    if (RefreshCounter & 0x1)
      ShadowCounter = RefreshCounter;
    else
      ShadowCounter = (RefreshCounter + 1);

    SET_VFD_STROBE;
    VFD_objectSendByte(refresh_tbl[AddrCounter] | VFD_ADDRESS_MASK);
    VFD_next_state = VFD_state_refresh_2;
}

PRIVATE void VFD_state_refresh_2()
{
    VFD_objectSendByte(ShadowRam[ShadowCounter--]);
    VFD_next_state = VFD_state_refresh_3;
}

PRIVATE void VFD_state_refresh_3()
{
    VFD_objectSendByte(ShadowRam[ShadowCounter]);
    CLEAR_VFD_STROBE;
    VFD_next_state = VFD_state_refresh_4;
}

PRIVATE void VFD_state_refresh_4()
{
    if (EnableFlashing && (glbTimer > ObjectTime.FlashTime)) {
	ObjectTime.FlashTime = glbTimer + HALF_SECOND;
	flashCalendar();
    }
    VFD_next_state = VFD_state_scan_key_0;
}

#endif /* BU2872 */

int micro_convert_irkey(int ir_key)
{
    int irKey;
    int newKey;
    char * key_tbl = T_IR_key_tbl;

    irKey = ir_key & 0xff;
#ifdef DEBUG_OSD
/*     debug_osd("IRKEY",irKey,13);*/
#endif


#ifdef IR_PHILIPS
	/* Philips IR */
	newKey = key_tbl[irKey];
#endif /* IR_PHILIPS */

#if (IR_NEC || IR_SANYO)
	/* NEC or SANYO */
        if (REMOTE_KEY > 0x20)
	  newKey = key_tbl[irKey - 0x20];
        else
	  newKey = key_tbl[irKey];
#endif /* IR_NEC || IR_SANYO */

    return (newKey);
}

int micro_is_power_key(int ir_key)
{
    int newKey;
#ifndef MASTER
    newKey = micro_convert_irkey(ir_key) | 0xff00;
    if (newKey == POWER_KEY)
	return (1);
#endif
    return (0);
}

#ifdef VCDROM
int micro_is_reset_key(int ir_key)
{
    int newKey;

    newKey = micro_convert_irkey(ir_key);
    if ((newKey == POWER_KEY) || (newKey == EJECT_KEY))
	return (1);

    return (0);
}
#endif

void microEngine(void)
{
    int tmpKey;
    static int oldTimer;
    extern int dsa_status;
#ifdef SGAME
    static unsigned int hltimer;
#endif

    if (REMOTE_VALID) {
        CLEAR_REMOTE;
	tmpKey =  micro_convert_irkey(codeIR);
        ObjectKey.FireKey = tmpKey;
#ifdef SGAME
   if (vcd_game_loaded == 1){
      if ((ObjectKey.FireKey == 0x68) || (ObjectKey.FireKey == 0x69))
       goto sgame_loop;
    }
#endif
        VFD_parseKey();
    }

#ifdef SGAME
sgame_loop:
   if (vcd_game_loaded == 1){
        if (ObjectKey.FireKey == 0x68) {
            av_game_flag ^=1;
          if (av_game_flag == 1)
               SET_VCD_V;
           else
            SET_GAME_V;
            VFD_parseKey(); 
            return;
        }
       if (ObjectKey.FireKey == 0x69) {
           CLEAR_H_L;
     /*    CLEAR_WE;*/
           hltimer = glbTimer;
           while(1) if((glbTimer - hltimer) > 10) break;
           SET_H_L;
           SET_WE;
           av_game_flag = 0;
           SET_GAME_V;
           VFD_parseKey();
           return;
         }
   }
#endif 


#if defined(DVD_VCD) && defined(SLAVE) /* vcd slave have no VFD to show */
    return;
#endif

#ifdef DSC
    if (DSC_status == DSC_STATUS_RUNNING) {
	if (glbTimer <= oldTimer+5  && 
	    (VFD_next_state == VFD_state_scan_key_0) && !VFDptr)
	  return;
	oldTimer = glbTimer;
	if (VFDptr && (VFD_next_state == VFD_state_scan_key_0)) {
	    VFD_next_state = VFD_state_refresh_0;
	}
    }
#endif

    VFD_next_state();
}

PRIVATE void VFD_objectReadByte(void)
{
    int i;
    for (i = 0; i < 8; i++) {
#ifdef VFD_RCV_MSB_FIRST
	/* Receive most significant bit first */
        ReceivedByte <<= 1;
        CLEAR_VFD_CLK;
        asm("nop");asm("nop");
        SET_VFD_CLK;

	ReceivedByte &= ~0x01;
        if (VFD_DATA_HIGH)
	  ReceivedByte |= 0x01;
#else
	/* Receive least significant bit first */
        ReceivedByte >>= 1;
        CLEAR_VFD_CLK;
        TRIGGER_HOST_PORT;

	ReceivedByte &= ~0x80;
        if (VFD_DATA_HIGH)
	  ReceivedByte |= 0x80;

        SET_VFD_CLK;
#endif /* VFD_RCV_MSB_FIRST */
    }
    TRISTATE_VFD_DATA ;
}

PRIVATE void VFD_objectSendByte(int SendByte)
{
    int i;
 
    for (i = 0;i <8;i++) {
#ifdef VFD_XMIT_MSB_FIRST
	/* Transmit most significant bit first */
        CLEAR_VFD_CLK;
        if (SendByte & 0x80) {
            SET_VFD_DATA;
        } else {
            CLEAR_VFD_DATA;
        }
        SET_VFD_CLK;
        SendByte <<= 1;
#else
	/* Transmit least significant bit first */
        CLEAR_VFD_CLK;
        if (SendByte & 0x01) {
            SET_VFD_DATA;
        } else {
            CLEAR_VFD_DATA;
        }
        SET_VFD_CLK;
        SendByte >>= 1;
#endif /* VFD_XMIT_MSB_FIRST */
    }
    TRISTATE_VFD_DATA;
}

/*
 * If the item is already in the list of things to update, then
 * don't do anything. Otherwise, put the item in the list.
 */
PRIVATE void VFD_push(state)  
{
    int i;

    for (i = 0; i < VFDptr; i++) 
      if (VFD_refresh_stack[i] == state) 
	return;

    VFD_refresh_stack[VFDptr++] = state;
}

PRIVATE void VFD_strobeSendByte(int data)
{
   VFD_STROBE_ACTIVE;
   VFD_objectSendByte(data);
   VFD_STROBE_INACTIVE;
}

void Waiting_powerkey_up()
{
   while (KeySearchLock)
     microEngine();
}

⌨️ 快捷键说明

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