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

📄 misc.c

📁 采用台湾MRT晶捷公司的MRT4方案的液晶电视的程序
💻 C
字号:
/************************************************
 *                                              *
 *      MISC.C:  Misc. sub-routines             *
 *                                              *
 ************************************************/
#include <reg51.h>
#include <intrins.h>
#include "mascot.h"
#include "osd.h"
#include "global.h"




//
//      Turn off LCD BackLight
//
void miscTurnOnBackLight(void)
{

	backlightOffFlag = 0;
	
#if BACK_LIGHT_INVERT
	RegBitOut(0x58,0x0D,0x0F); // turn on LCD Backlight
	PANEL_BKL_PIN = 0;
#else
	RegBitOut(0x58,0x0F,0x0F); // turn on LCD Backlight
	PANEL_BKL_PIN = 1;    
#endif    

#if DEBUGMSG
	printf("  BackLight on  ");
#endif
}



//
//      Turn off LCD BackLight
//
void miscTurnOffBackLight(void)
{
	
	backlightOffFlag = 1;
	
#if BACK_LIGHT_INVERT
	RegBitOut(0x58,0x02,0x02); // turn off LCD Backlight
	PANEL_BKL_PIN = 1;
#else
	RegBitOut(0x58,0x00,0x02); // turn off LCD Backlight
	PANEL_BKL_PIN = 0;    
#endif    

#if DEBUGMSG
	printf("  BackLight off  ");
#endif
}



//
//      Turn on LCD panel
//

void miscTurnOnPanel(void)
{

#if DEBUGMSG
	printf("  Panel ON\n");
#endif

	if ( PanelOnFlag )
	{
		setBrightness(eepData.brightness);
		miscTurnOnBackLight();
		return;
	}

	PanelOnFlag = 1;

#if 0 	//for LVDS power
	RegBitOut(0x58,0x08,0x08); // turn on LCD VEE FOR LVDS
#endif

#if PANEL_VDD_INVERT
	RegBitOut(0x58,0x00,0x04); // turn on LCD VDD
	PANEL_VCC_PIN = 0;
#else 
	RegBitOut(0x58,0x04,0x04); // turn on LCD VDD
	PANEL_VCC_PIN = 1;
#endif

#if (USE_TCON + USE_RSDS)
	miscDelay(5);  
 #if 1	//MVXPRL
	RegBitOut(0x24, 0x80, 0xC0); // turn on data output
 #else
	RegBitOut(0x24, 0x00, 0xC0); // turn on data output
 #endif
#endif
	
	miscDelay(10);  
	RegBitOut(0x58,0x01,0x01); // turn on data output

	miscDelay(100);

	setBrightness(eepData.brightness);
	miscTurnOnBackLight();

#if WITH_AUDIO	
 #if MVRL_NEC15
	setVolume(1);
 #else
	setVolume(eepData.volume);
 #endif
#endif    
}


//
//      Turn off LCD panel
//
void miscTurnOffPanel(void)
{
	
#if DEBUGMSG
    printf("  Panel off  ");
#endif

	if ( !PanelOnFlag )
		return;

	PanelOnFlag = 0;
	miscTurnOffBackLight();
	dspMute(2);
	miscDelay(30);    

#if (USE_TCON + USE_RSDS)
	RegBitOut(0x24, 0x40, 0xC0); // turn off data output
	miscDelay(1);
#endif 
	RegBitOut(0x58,0x00,0x01); // turn off data output
	miscDelay(10);
   
#if PANEL_VDD_INVERT
	RegBitOut(0x58,0x04,0x04); // turn off LCD VDD
	PANEL_VCC_PIN = 1;
#else	
	RegBitOut(0x58,0x00,0x04); // turn off LCD VDD
	PANEL_VCC_PIN = 0;
#endif	

#if 0 //for LVDS power
	RegBitOut(0x58,0x00,0x08); // turn off LCD VEE FOR LVDS
#endif

#if DEBUGMSG
	printf("OFF\n");
#endif
}



//
//	Enter sleep mode
//
void miscEnterSleepMode()
{
	if (SleepModeFlag) return;

#if DEBUGMSG
	printf("Enter SleepMode\n");
#endif

	SleepModeFlag = 1;

	disableOSD();
	miscTurnOffPanel();

	miscClkOff();

	LED_G_Pin = 1; LED_O_Pin = 0;

#if WITH_AUDIO	
	setVolume(0);
#endif    
}



//
//	Exit sleep mode
//
void miscExitSleepMode()
{
	if (!SleepModeFlag) return;

#if DEBUGMSG
	printf("Exit SleepMode\n");
#endif

	SleepModeFlag = 0;
	miscClkOn();
}



void miscTurnOnPower(void)
{
	miscExitSleepMode();

	LED_G_Pin = 0; LED_O_Pin = 1;

	miscTurnOnPanel();
}


void miscClkOn(void)
{

	if (sogSyncFlag)				// ADC Power on
		RegByteOut(0x25, 0xFD);	
	else
    	RegByteOut(0x25, 0xFC);


	RegBitOut(0x2F, 0x80, 0x90);    // SCLK on

#if USE_GAMMA    
    RegBitOut(0x50, 0x08, 0x08);    // Gamma on
#endif
}


void miscClkOff(void)
{

    RegByteOut(0x25, 0x80);			// ADC Power off 

	RegBitOut(0x2F, 0x10, 0x90);    // SCLK off

#if USE_GAMMA 
    RegBitOut(0x50, 0x00, 0x08);    // Gamma off
#endif
}



//
//      Delay (n) ms
//
void miscDelay(int n)
{
        unsigned int i;

    while (n--) {
            i = 1000/11 ;  // one loop below takes about 11 us
        while (i--);
    }
}



void miscSetADCPhase(unsigned char phase)
{

	RegByteOut(TDA_PHASE, (phase & PHASEMSK)|0x40);

    RegByteOut(TDA_DIVL, RegByteIn(TDA_DIVL));

}


void miscSetADCPitch(unsigned int pitch)
{

	unsigned char data tpitchH;
	
	tpitchH = RegByteIn(TDA_DIVH) & 0xf8;

    RegByteOut(TDA_DIVH, tpitchH | ((unsigned char)(pitch>>8)&0x07));
    RegByteOut(TDA_DIVL, (unsigned char)pitch);


#if (DEBUGMSG>=3)
    printf("    Pitch=%d", pitch);
#endif

}



#if (!MODE_ADJ_BY_CALCULATE)
#if MODE_ADJ_SMALL_STEP


#define mt  ival
#define nt  ival1

#define NMUL    7 
#define MINM    4
#define MAXM    0x3F
#define MAXN    0x1FF

void miscDClkUp(unsigned char delta)
{
    unsigned long F, fs, ft;
    unsigned int M, N;
	unsigned char i;


    M = RegByteIn(0x2B);
    N = (((unsigned int)RegByteIn(0x2D)&0x0F)<<8) + RegByteIn(0x2C);


#if (DEBUGMSG >= 3)
    printf("    miscDClkUp: %04X/%02X %d", 
        (unsigned int)N, (unsigned int)M, (unsigned int)((long)1200*N/M));
#endif

	for (i = 0; i < delta; i++)    
	{
	F = ((unsigned long)N << NMUL) / M;

    fs = 0xFFF << NMUL;
    for (mt = MINM; mt <= MAXM; mt++) {
        for (nt = (F*mt)>>NMUL; nt <= MAXN; nt++) {
            ft = ((unsigned long)nt<<NMUL)/mt;
            if (ft > F) {
                if (fs > ft-F) {
                    fs = ft-F; N = nt; M = mt;
                }
                break;
            }
        }
    }
	
	}
    RegByteOut(0x2B, (unsigned char) M);	
    RegByteOut(0x2C, (unsigned char) N);
    RegByteOut(0x2D, (unsigned char) (N>>8) & 0x0F);	
    
#if (DEBUGMSG >= 3)
    printf(" -> %04X/%02X %d\n",
        (unsigned int)N, (unsigned int)M, (unsigned int)((long)1200*N/M));
#endif
}

void miscDClkDown(unsigned char delta)
{
    unsigned long F, fs, ft;
    unsigned int M, N;
	unsigned char i;


    M = RegByteIn(0x2B);
    N = (((unsigned int)RegByteIn(0x2D)& 0x0F)<<8) + RegByteIn(0x2C);

#if (DEBUGMSG >= 3)
    printf("    miscDClkDown: %04X/%02X %d", N, M, (unsigned int)((long)1200*N/M));
#endif

	for (i = 0; i < delta; i++)    
	{
	F = ((unsigned long)N << NMUL) / M;

    fs = 0xFF<<NMUL;
    for (mt = MINM; mt <= MAXM; mt++) {
        for (nt = ((F*mt)>>NMUL)+1; nt > 2; nt--) {
            ft = ((unsigned long)nt<<NMUL)/mt;
            if (F > ft) {
                if (fs > F-ft) {
                    fs = F-ft; N = nt; M = mt;
                }
                break;
            }
        }
    }

	}
    RegByteOut(0x2B, (unsigned char) M);	
    RegByteOut(0x2C, (unsigned char) N);	
    RegByteOut(0x2D, (unsigned char) (N>>8)&0x0F);	


#if (DEBUGMSG >= 3)
    printf(" -> %04X/%02X %d\n",(unsigned int)N, (unsigned int)M, (unsigned int)((long)1200*N/M));
#endif
}

#else //MODE_ADJ_SMALL_STEP

#define NMUL    	7			//6
#define MINM		4			//4
#define MAXM    	0x1D		//0F
#define MAXN    	0xFD		//7F

#define ft  ival
#define fs  ival1
#define F   ival2

void miscDClkUp(unsigned char delta)
{
    unsigned int mt, nt;
    unsigned char M, N;
    unsigned char i;


    M = RegByteIn(0x2B);
    nt = (((unsigned int)RegByteIn(0x2D)&0x0F)<<8) + RegByteIn(0x2C);
	#if (DEBUGMSG >= 3)
    printf("    miscDClkUp: %04X/%02X %d",(unsigned int)nt, (unsigned int)M, (unsigned int)((long)1200*nt/M));
	#endif
	F = ((unsigned long)nt << NMUL) / M;

	fs = 0xFF<<NMUL;

	for (i = 0; i < delta; i++)    
	{
		for (mt = MINM; mt <= MAXM; mt++) {
			nt = (F*mt)>>NMUL;
        	if (nt > 0xff)	break;
        	for (; nt <= MAXN; nt++) {
            	ft = (nt<<NMUL)/mt;
            	if (ft > F) {
                	if (fs >= ft-F) {
                    	fs = ft-F; N = nt; M = mt;
                	}
               	 	break;
            	}
        	}
    	}
    	F = ((unsigned int)N<<NMUL) / M;
    	fs = 0xFF<<NMUL;
	}

    RegByteOut(0x2B, (unsigned char) M);	
    RegByteOut(0x2C, (unsigned char) N);	
    RegByteOut(0x2D, (unsigned char) (N>>8) & 0x0F);	
	#if (DEBUGMSG >= 3)
    printf(" -> %04X/%02X %d\n",(unsigned int)N, (unsigned int)M, (unsigned int)((long)1200*N/M));
	#endif
}

void miscDClkDown(unsigned char delta)
{
	unsigned int mt, nt;
	unsigned char M, N;
    unsigned char i;


    M = RegByteIn(0x2B);
    nt = (((unsigned int)RegByteIn(0x2D)& 0x0F)<<8) + RegByteIn(0x2C);
	#if (DEBUGMSG >= 3)
    printf("    miscDClkDown: %04X/%02X %d",(unsigned int)nt,(unsigned int)M, (unsigned int)((long)1200*nt/M));
	#endif
	F = ((unsigned long)nt<<NMUL) / M;

	fs = 0xFF<<NMUL;
	for (i = 0; i < delta; i++)    
	{
    	for (mt = 1+2; mt <= MAXM; mt++) {
			nt = ((F*mt)>>NMUL)+1 ;
			if (nt > 0xff) break;
        	for ( ; nt > 2; nt--) {
     		 	ft = (nt<<NMUL)/mt;
            	if (F > ft) {
                	if (fs > F-ft) {
               		 	fs = F-ft; N = nt; M = mt;
                	}
                	break;
            	}
        	}
   	 	}
 	 	F = ((unsigned int)N<<NMUL) / M;
 	 	fs = 0xFF<<NMUL;
	}

    RegByteOut(0x2B, (unsigned char) M);	
    RegByteOut(0x2C, (unsigned char) N);	
    RegByteOut(0x2D, (unsigned char) (N>>8)&0x0F);	
	#if (DEBUGMSG >= 3)
    printf(" -> %04X/%02X %d\n",(unsigned int)N, (unsigned int)M, (unsigned int)((long)1200*N/M));
	#endif

}

#undef ft
#undef fs
#undef F

#endif //MODE_ADJ_SMALL_STEP 

#endif //(!MODE_ADJ_BY_CALCULATE)




#if USE_TCON
void miscSwitchTCONReg(unsigned char flag)
{
	TCON_Page_Flag = flag?1:0;
	RegByteOut(0xC0, flag?0x40:0x3C);
}
#endif

⌨️ 快捷键说明

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