microvfd.c

来自「ESS3890+SL原代码(1*16内存)」· C语言 代码 · 共 1,859 行 · 第 1/3 页

C
1,859
字号
{    if (!VFDptr)       VFD_state_refresh_5();    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;                 VFD_STROBE_ACTIVE;    VFD_objectSendByte(refresh_tbl[AddrCounter] | VFD_ADDRESS_MASK);    SCH_DELAY_BETWEEN_DATA;    VFD_next_state = VFD_state_refresh_2;}PRIVATE void VFD_state_refresh_2(){    RETURN_BEFORE_SCHEDULED_TIME;    VFD_objectSendByte(ShadowRam[ShadowCounter++]);    SCH_DELAY_BETWEEN_DATA;    VFD_next_state = VFD_state_refresh_3;}PRIVATE void VFD_state_refresh_3(){    RETURN_BEFORE_SCHEDULED_TIME;    VFD_objectSendByte(ShadowRam[ShadowCounter]);    SCH_DELAY_AFTER_DATA;    VFD_next_state = VFD_state_refresh_4;}PRIVATE void VFD_state_refresh_4(){    RETURN_BEFORE_SCHEDULED_TIME;    VFD_STROBE_INACTIVE;    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 /* MN12510 */#ifdef BU2872/* By Liang Weihua */PRIVATE	int	AddrCounter;PRIVATE	int	ShadowCounter;/* * 2872 requires  * 	1) 40us between neighbouring bytes *	2) 80us overall for a data byte. *	3) 13.3us between end of data and rising of CS# */#define	DELAY_BETWEEN_DATA	MICROSECOND(40)#define DELAY_AFTER_DATA	MICROSECOND(40)/************************************************************************ ********************** 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(T_VFD_mode[0], DELAY_AFTER_DATA);    VFD_next_state = VFD_state_scan_key_0;}PRIVATE void VFD_state_scan_key_0(){    VFD_STROBE_ACTIVE;    DataLength = KEY_LENGTH;    VFD_objectSendByte(VFD_READ_KEY);    SCH_DELAY_BETWEEN_DATA;    VFD_next_state = VFD_state_scan_key_1;}PRIVATE void VFD_state_scan_key_1(){    RETURN_BEFORE_SCHEDULED_TIME;    VFD_objectReadByte();    SCH_DELAY_BETWEEN_DATA;    VFD_next_state = VFD_state_scan_key_2;}PRIVATE void VFD_state_scan_key_2(){    RETURN_BEFORE_SCHEDULED_TIME;    ObjectKey.KeyBuffer[KEY_LENGTH - DataLength] = ReceivedByte;    if (--DataLength)      VFD_state_scan_key_1();    else {	VFD_STROBE_INACTIVE;	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_5();     else {	VFD_STROBE_ACTIVE;	VFD_objectSendByte(T_VFD_mode[0]);	SCH_DELAY_AFTER_DATA;	VFD_next_state = VFD_state_refresh_1;    }}PRIVATE void VFD_state_refresh_1(){    unsigned char * refresh_tbl;    RETURN_BEFORE_SCHEDULED_TIME;    VFD_STROBE_INACTIVE;    refresh_tbl = T_VFD_refresh_tbl;    RefreshCounter = POPVFD;    AddrCounter = (int)(RefreshCounter/2) + 1;    if (RefreshCounter & 0x1)      ShadowCounter = RefreshCounter;    else      ShadowCounter = (RefreshCounter + 1);    VFD_STROBE_ACTIVE;    VFD_objectSendByte(refresh_tbl[AddrCounter] | VFD_ADDRESS_MASK);    SCH_DELAY_BETWEEN_DATA;    VFD_next_state = VFD_state_refresh_2;}PRIVATE void VFD_state_refresh_2(){    RETURN_BEFORE_SCHEDULED_TIME;    VFD_objectSendByte(ShadowRam[ShadowCounter--]);    SCH_DELAY_BETWEEN_DATA;    VFD_next_state = VFD_state_refresh_3;}PRIVATE void VFD_state_refresh_3(){    RETURN_BEFORE_SCHEDULED_TIME;    VFD_objectSendByte(ShadowRam[ShadowCounter]);    SCH_DELAY_BETWEEN_DATA;    VFD_next_state = VFD_state_refresh_4;}PRIVATE void VFD_state_refresh_4(){    RETURN_BEFORE_SCHEDULED_TIME;    VFD_STROBE_INACTIVE;    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 /* BU2872 */#ifdef HT1621/************************************************************************ ****************** State machine for 16311 or 16312 ******************** ************************************************************************/static ff= 1;PRIVATE void VFD_state_init(){        int i;        if(ff){	LCD_objectSendcommand(LCD_SYS_EN);   /* only init one time */	LCD_objectSendcommand(LCD_LCD_ON);	LCD_objectSendcommand(LCD_RC_256);	LCD_objectSendcommand(LCD_IRQ_DIS);	LCD_objectSendcommand(LCD_BIAS);           for(i = 0;i <=0x20; i ++){              LCD_objectSenddata(i,0x00);   /* clear */          }          ff = 0;        }        VFD_next_state = VFD_state_refresh_0;}PRIVATE void VFD_state_refresh_0(){    if (!VFDptr)      VFD_state_refresh_3();    else {        VFD_next_state = VFD_state_refresh_1;    }}PRIVATE void VFD_state_refresh_1(){    VFD_next_state = VFD_state_refresh_2;/*    if(tenkey)         VFD_parseKey();  /* lyt */}PRIVATE void VFD_state_refresh_2(){    RefreshCounter = POPVFD;    #ifdef LCD_2DANCE           LCD_objectSenddata(RefreshCounter*2,ShadowRam[RefreshCounter]);    #elif defined(LCD_6DANCE)         LCD_objectSenddata(RefreshCounter,ShadowRam[RefreshCounter]);    #else    if(RefreshCounter == 16)         LCD_objectSenddata(0x0f,ShadowRam[RefreshCounter]);    else if(RefreshCounter == 17)         LCD_objectSenddata(0x1d,ShadowRam[RefreshCounter]);    else         LCD_objectSenddata(RefreshCounter*2,ShadowRam[RefreshCounter]);    #endif    VFD_next_state = VFD_state_refresh_3;}#if 1/*def LCD_6DANCE*/char wheel_dance = 0;int wheel_time2;extern unsigned char cd_opened;/*extern char initCD_done;*/int cd_wheelstop;#endifunsigned int Wheel_Timer=0;extern unsigned char cd_opened;extern int CDinited;PRIVATE void VFD_state_refresh_3(){#ifdef LCD_2DANCE static int mode=0;#endif#ifdef LCD_6DANCE static int mode=0;#endif    VFD_next_state = VFD_state_refresh_0;    if(glbTimer > Wheel_Timer) {         Wheel_Timer = glbTimer + 10;             #ifdef LCD_2DANCE                             mode++;                             if(mode>11)mode=0;             #endif#if defined(LCD_6DANCE)||defined(LCD_DISC)    if(cd_wheelstop == 2)          VFD_spin_wheel(VFD_WHEEL_SET_FAN);     else if((cd_wheelstop == 0)&&(initCD_done==1))          VFD_spin_wheel(VFD_WHEEL_SPIN);     else  if((cd_wheelstop == -1)&&(initCD_done==0))          VFD_spin_wheel(VFD_WHEEL_CLEAR_FAN);#else       if((play_state != ENTRY_STATE || !cd_opened)&&(!IS_POWER_DOWN))          {          VFD_spin_wheel(2);          #ifdef LCD_2DANCE              VFD_dance(mode);          #endif          }         else          VFD_spin_wheel(0);#endif    }#ifdef LCD_6DANCEif ((play_state==PLAY_NORMAL_STATE) && (glbTimer >= wheel_time2)) {	mode++;	if(mode>11)mode=1;        wheel_time2 = glbTimer + 15;        VFD_dance(mode);    }#endif}void LCD_sendcmd(int cmd){    int i;     CLR_LCD_CS;     for(i = 0;i<3;i++)     {	lcd_delay();	CLR_LCD_WR;        if(cmd & 0x01){	   SET_LCD_DATA;	}else{	   CLR_LCD_DATA;        }        cmd>>=1;        lcd_delay();	SET_LCD_WR;     }}PRIVATE void LCD_objectSendcommand(int command){    int i,j= 0x01;    LCD_sendcmd(j);     j = command;     for(i = 0;i<8;i++)     {	lcd_delay();	CLR_LCD_WR;        if(j & 0x80){	   SET_LCD_DATA;	}else{	   CLR_LCD_DATA;        }        j<<=1;        lcd_delay();	SET_LCD_WR;     }     lcd_delay();     CLR_LCD_WR;     CLR_LCD_DATA;     lcd_delay();     SET_LCD_WR;   SET_LCD_CS;}PRIVATE void LCD_objectSenddata(int address,int data){	char i;        int command_id = 5;        LCD_sendcmd(command_id);        for(i=0; i<6; i++) {    	   lcd_delay();    	   CLR_LCD_WR;           if(address & 0x20) {    		SET_LCD_DATA;    	   } else{    		CLR_LCD_DATA;           }     	   lcd_delay();           address <<= 1;    	   SET_LCD_WR;        }     #ifdef LCD_2DANCE        for(i=0; i<8; i++) {     #else        for(i=0; i<4; i++) {     #endif        	lcd_delay();		CLR_LCD_WR;                if(data & 0x80) {			SET_LCD_DATA;		} else{			CLR_LCD_DATA;                }	        lcd_delay();	 	SET_LCD_WR;                data <<= 1;	}        SET_LCD_CS;}void lcd_delay(){   int i;   for(i=0;i<35;i++) {    asm("nop");    asm("nop");   }}#endif /* ht1621 */#endif /* HOST_SLAVE */PRIVATE int micro_convert_irkey(int ir_key){    int irKey;    int newKey;    char *key_tbl = T_IR_key_tbl;        irKey = ir_key & 0xff;    #ifdef IR_PHILIPS    /* Philips IR */    newKey = key_tbl[irKey];#endif /* IR_PHILIPS */#if (IR_NEC || IR_SANYO)#ifndef  HOST_SLAVE    /*     * By IR_Key_tbl convention, there is no key between 0x20 and 0x3f!     */    if (irKey >= 0x40) irKey -= 0x20;    /* Only assign key if it is defined within the IR_key_table */    newKey = _NO_KEY;    if (irKey < T_IR_key_tbl_SZ) newKey = key_tbl[irKey];#endif /* HOST_SLAVE */            newKey = key_tbl[irKey];#endif /* IR_NEC || IR_SANYO */	 	//zty changed	IMPORT int zoom_level;	if((newKey == _ZOOM_LEFT_KEY)&&(zoom_level == 0))		newKey = _ECHO_MINUS;	if((newKey == _ZOOM_RIGHT_KEY)&&(zoom_level == 0))		newKey = _ECHO_PLUS;//    return (newKey);}int micro_is_power_key(int ir_key){    int newKey;    newKey = micro_convert_irkey(ir_key);    return(newKey == _POWER_KEY);}#ifdef IO3898#define DSC_status             POW_status#define DSC_STATUS_RUNNING     POW_STATUS_RUNNING#endifint oldTimer;void microEngine(void){#ifdef TOP_LOADER		extern int read_door_state(void);		extern unsigned char cd_opened;	    int i; 		i = read_door_state();		if(((i == 1)&&(cd_opened == 0))||((i == 2)&&(cd_opened != 0)))		{			ObjectKey.FireKey = EJECT_KEY;  			VFD_parseKey();		}#endif     if (REMOTE_VALID) {        CLEAR_REMOTE;	ObjectKey.FireKey = (char) micro_convert_irkey(codeIR);  	VFD_parseKey();    }    #ifdef HOST_SLAVE    Slave_Message_Dispatch();    #else#if (defined DSC || defined IO3898)    if (DSC_status == DSC_STATUS_RUNNING) {#ifndef HT1621#ifdef MARANELLO_A9B8	if(play_state == PLAY_GMBY_STATE) { 	    VFD_next_state();	    return;	}  #endif /* MARANELLO_A9B8 */	if (glbTimer <= oldTimer+5  && 	    (VFD_next_state == VFD_state_scan_key_0) && !VFDptr)	    return;	oldTimer = glbTimer;#if 0 /* according to Weihua, this will interfere with panel key inputs       * during FF/FR.       */	if (VFDptr && (VFD_next_state == VFD_state_scan_key_0)) {	    VFD_next_state = VFD_state_refresh_0;	}#endif#else HT1621/*        if (glbTimer <= oldTimer+5  &&	    (VFD_next_state == VFD_state_refresh_0) && !VFDptr)	    return;        oldTimer = glbTimer;  */	if (VFDptr && (VFD_next_state == VFD_state_refresh_0)) {	    VFD_next_state = VFD_state_refresh_0;    }#endif HT1621    }#endif        VFD_next_state();    #endif /* HOST_SLAVE */      }#ifndef HOST_SLAVEPRIVATE void VFD_objectReadByte(void){    int i;    volatile int *ptrDelay = (int *) bank3safe;    for (i = 0; i < 8; i++) {#ifdef VFD_RCV_MSB_FIRST	/* Receive most significant bit first */        ReceivedByte <<= 1;        CLEAR_VFD_CLK;	*ptrDelay;        SET_VFD_CLK;	*ptrDelay;	ReceivedByte &= ~0x01;        if (VFD_DATA_HIGH) ReceivedByte |= 0x01;#else	/* Receive least significant bit first */        ReceivedByte >>= 1;        CLEAR_VFD_CLK;	*ptrDelay;	ReceivedByte &= ~0x80;        if (VFD_DATA_HIGH) ReceivedByte |= 0x80;        SET_VFD_CLK;	*ptrDelay;#endif /* VFD_RCV_MSB_FIRST */    }    TRISTATE_VFD_DATA;#ifdef VFD_SHARED_PIN    TRISTATE_VFD_CLK;#endif}PRIVATE void VFD_objectSendByte(int SendByte){    int i;    volatile int *ptrDelay = (int *) bank3safe;     for (i = 0;i <8;i++) {#ifdef VFD_XMIT_MSB_FIRST	/* Transmit most significant bit first */        CLEAR_VFD_CLK;	*ptrDelay;        if (SendByte & 0x80) {            SET_VFD_DATA;        } else {            CLEAR_VFD_DATA;        }        SET_VFD_CLK;        SendByte <<= 1;	*ptrDelay;#else	/* Transmit least significant bit first */        CLEAR_VFD_CLK;	*ptrDelay;        if (SendByte & 0x01) {            SET_VFD_DATA;        } else {            CLEAR_VFD_DATA;        }        SET_VFD_CLK;        SendByte >>= 1;	*ptrDelay;#endif /* VFD_XMIT_MSB_FIRST */    }    TRISTATE_VFD_DATA;#ifdef VFD_SHARED_PIN    TRISTATE_VFD_CLK;#endif}/* * Specify delay in microseconds. Delay can only be used during  * initialization. */PRIVATE void VFD_strobeSendByte(int data, int delay){    VFD_STROBE_ACTIVE;    VFD_objectSendByte(data);        if (delay) {	if (IS_POWER_DOWN) delay /= IDLEFACTOR;	risc_sleep_a_bit(delay);    }    VFD_STROBE_INACTIVE;}#endif /* HOST_SLAVE */void Waiting_powerkey_up(){#ifndef HOST_SLAVE	    while (KeySearchLock)#endif  	microEngine();}

⌨️ 快捷键说明

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