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

📄 auto.c

📁 7302VideoAP.zip----------一个多媒体液晶显示器内部控制器(主芯片为:EL7302)的源程序(KC51)
💻 C
字号:
#include "fnt_inc.h"
///////////////////////////////////////////////////////////////////////////////////
void SetDefault(void)
{
unsigned int VTotal;

  VTotal=(Reg7300[0x58]+(Reg7300[0x59]<<8));
  Reg7300[0x20]=((VTotal-1)&0x00ff);
  Reg7300[0x21]=((VTotal-1)>>8);
  Reg7300[0x24]=(CurModePtr[4]&0x00ff);
  Reg7300[0x25]=(CurModePtr[4]>>8);  
  Reg7300[0x1e]=(CurModePtr[3]&0x00ff);
  Reg7300[0x1f]=(CurModePtr[3]>>8);
  Reg7300[0x1a]=((CurModePtr[5]-CurModePtr[3])&0x00ff);
  Reg7300[0x1b]=((CurModePtr[5]-CurModePtr[3])>>8);
  Reg7300[0x1c]=((CurModePtr[6]+CurModePtr[7]-22)&0x00ff);
  Reg7300[0x1d]=((CurModePtr[6]+CurModePtr[7]-22)>>8);
  Reg7300[0x23]=(CurModePtr[9]&0x00ff);
  OriginalColock=(Reg7300[0x5d]<<8)+Reg7300[0x5c]+1;      
}
///////////////////////////////////////////////////////////////////////////////////
unsigned int ReportHActive(void)
{
unsigned int value;

 value=0;
 if(SourceType!=_DigitalSource){
    while(value!=(Reg7300[0x31]<<8)+Reg7300[0x30]-(Reg7300[0x2f]<<8)-Reg7300[0x2e]+1){
    value=(Reg7300[0x31]<<8)+Reg7300[0x30]-(Reg7300[0x2f]<<8)-Reg7300[0x2e]+1;
    Wait1Frame();
   }
 }
 else {
   Reg7300[0x5e]=0x19;
   value=Reg7300[0x5f];
   Reg7300[0x5e]=0x1a; 
   value=value + (Reg7300[0x5f]<<8);
 }
 return(value);
}
///////////////////////////////////////////////////////////////////////////////////
unsigned int ReportVActive(void)
{
unsigned int VActive;

 VActive=0;
 if(SourceType!=_DigitalSource){
   while(VActive!=(Reg7300[0x35]<<8)+Reg7300[0x34]-(Reg7300[0x33]<<8)-Reg7300[0x32]+1){
       VActive=(Reg7300[0x35]<<8)+Reg7300[0x34]-(Reg7300[0x33]<<8)-Reg7300[0x32]+1; 
       Wait1Frame();
   }
 }
 else {
   Reg7300[0x5e]=0x1b;
   VActive=Reg7300[0x5f];
   Reg7300[0x5e]=0x1c; 
   VActive=VActive + (Reg7300[0x5f]<<8);
 }
 return(VActive); 
}     
////////////////////////////////////////////////////////////////////////////////////
void SetFullScreen(void)
{
unsigned int BoundryValue;

  BoundryValue=Reg7300[0x1c]+(Reg7300[0x1d]<<8)+10;
  Reg7300[0x26]=(BoundryValue&0x00ff);
  Reg7300[0x27]=(BoundryValue>>8);
  BoundryValue=BoundryValue+Reg7300[0x1e]+(Reg7300[0x1f]<<8)-20;
  Reg7300[0x28]=(BoundryValue&0x00ff);
  Reg7300[0x29]=(BoundryValue>>8);
  
  BoundryValue=Reg7300[0x23]+10;
  Reg7300[0x2a]=(BoundryValue&0x00ff);
  Reg7300[0x2b]=0;
  BoundryValue=BoundryValue+Reg7300[0x24]+(Reg7300[0x25]<<8)-20;
  Reg7300[0x2c]=(BoundryValue&0x00ff);
  Reg7300[0x2d]=(BoundryValue>>8);
}
////////////////////////////////////////////////////////////////////////////////////////////
void AverageMaxMin(unsigned int *Ra,unsigned int *Ga,unsigned int *Ba,
                   unsigned int *Ri,unsigned int *Gi,unsigned int *Bi,unsigned char iter){
unsigned char i;
  *Ra=0;*Ga=0;*Ba=0;*Ri=0;*Gi=0;*Bi=0;
  for(i=0;i<iter;i++){    
    Wait1Frame();
    *Ra=*Ra+Reg7300[0x46];
    *Ri=*Ri+Reg7300[0x49];
    *Ga=*Ga+Reg7300[0x47];
    *Gi=*Gi+Reg7300[0x4a];
    *Ba=*Ba+Reg7300[0x48];
    *Bi=*Bi+Reg7300[0x4b];    
  }                 
}

/////////////////////////////////////////////////////////////////////////////////////
void UltAutoColor(void)    //2-4-8 frames & (15,20*2,20*3) & with 3-breaking & (10-14,980-988)for 4 frames & (20-28,1960-1976)for 8 frames
{ 
unsigned char GainValue, IterCnt, FrameAveNum;
unsigned int Ra,Ri,Ga,Gi,Ba,Bi, WhiteMaxAdj, WhiteMinAdj, BlackMaxAdj, BlackMinAdj;   
unsigned int i,Cnt=0;

  Reg7300[0x61]=0x00;//for command table test
  SetFullScreen();
  Reg7300[0x04]=0x2f;
  Wait1Frame();

  for(IterCnt=0;IterCnt<6;IterCnt++)Reg7300[0x09+IterCnt]=0x80;

  for(FrameAveNum=0;FrameAveNum<3;FrameAveNum++){//Average of 1frame,4frame,8frame
    Cnt=0;
    for(i=0;i<100;i++){
      if(Cnt<2){  
        if(FrameAveNum==0){
          GainValue=2;
          AverageMaxMin(&Ra,&Ga,&Ba,&Ri,&Gi,&Bi,1);
          WhiteMaxAdj=ColorSetting[0];
  	  WhiteMinAdj=ColorSetting[1];
  	  BlackMaxAdj=ColorSetting[2];
  	  BlackMinAdj=ColorSetting[3];
        }
        else{
          GainValue=1;
          AverageMaxMin(&Ra,&Ga,&Ba,&Ri,&Gi,&Bi,(FrameAveNum<<2));
          WhiteMaxAdj=(ColorSetting[0]<<(FrameAveNum+1))-(FrameAveNum);
  	  WhiteMinAdj=(ColorSetting[1]<<(FrameAveNum+1))+(FrameAveNum);
  	  BlackMaxAdj=(ColorSetting[2]<<(FrameAveNum+1))-(FrameAveNum);
  	  BlackMinAdj=(ColorSetting[3]<<(FrameAveNum+1))+(FrameAveNum);
        }
        if(Ri<BlackMinAdj)Reg7300[0x0c]-=GainValue;
        else if(Ri>BlackMaxAdj)Reg7300[0x0c]+=GainValue;       
        if(Ra<WhiteMinAdj)Reg7300[0x09]+=GainValue;
        else if(Ra>WhiteMaxAdj)Reg7300[0x09]-=GainValue;
  
        if(Gi<BlackMinAdj)Reg7300[0x0d]-=GainValue;
        else if(Gi>BlackMaxAdj)Reg7300[0x0d]+=GainValue;       
        if(Ga<WhiteMinAdj)Reg7300[0x0a]+=GainValue;
        else if(Ga>WhiteMaxAdj)Reg7300[0x0a]-=GainValue; 	

        if(Bi<BlackMinAdj)Reg7300[0x0e]-=GainValue;
        else if(Bi>BlackMaxAdj)Reg7300[0x0e]+=GainValue;       
        if(Ba<WhiteMinAdj)Reg7300[0x0b]+=GainValue;
        else if(Ba>WhiteMaxAdj)Reg7300[0x0b]-=GainValue;
        if((Ri>=BlackMinAdj)&&(Ri<=BlackMaxAdj)&&(Ra>=WhiteMinAdj)&&(Ra<=WhiteMaxAdj)&&(Bi>=BlackMinAdj)&&(Bi<=BlackMaxAdj)&&(Ba>=WhiteMinAdj)&&(Ba<=WhiteMaxAdj)&&(Gi>=BlackMinAdj)&&(Gi<=BlackMaxAdj)&&(Ga>=WhiteMinAdj)&&(Ga<=WhiteMaxAdj))
          Cnt++;
      }//if(Cnt<2)
    }//for->i
  }//for->FrameAveNum
  Reg7300[0x61]=0x66;//for command table test
}
//////////////////////////////////////////////////////////////////////////////////////
unsigned char CalCoarsePhaseStep(void){//_CorPhaseDiv=8;_SeudoClk=100.0;_PhaseStep=320ps/step
float tmp;
 
 if(CurVtotal>1024)tmp=0.3125;
 else tmp=0.4167;
 return(((float)((Reg7300[0x15]<<8)+Reg7300[0x14])*(1000.0)/((float)_CorPhaseDiv*_SeudoClk))
       /((float)((Reg7300[0x1f]<<8)+Reg7300[0x1e]+(Reg7300[0x1b]<<8)+Reg7300[0x1a])
       *tmp)+0.5);
}     
////////////////////////////////////////////////////////////////////////////////////// 
void FreqCalibration(void)
{

unsigned int CurHPor,RecHPor;
unsigned char CorPhaseStep,MatchCnt,MatchMax,CurPhase,ScanCnt,IterCnt; 

  Reg7300[0x61]=0x00;//for command table test              
  CurHPor=CurModePtr[5]-CurModePtr[3];					//CurModePtr[5]=Htotal;CurModePtr[3]=Hsize;   
  Reg7300[0x1e]=(CurModePtr[3]&0x00ff);
  Reg7300[0x1f]=(CurModePtr[3]>>8);
  Reg7300[0x1a]=(CurHPor&0x00ff);
  Reg7300[0x1b]=(CurHPor>>8);
  Reg7300[0x36]=_HTHValue;						//_HTHValue=0x70
  Reg7300[0x07]=(Reg7300[0x07]|0x04);					//Bit2=1->Reset internal source digital PLL   
  Reg7300[0x07]=(Reg7300[0x07]&0xfb);					//&11111011->clear Reset 
  Wait2Frame();								//waite PLL stable
  CurHPor=((double)(CurModePtr[3]+CurHPor)*(double)CurModePtr[3]	//Rough Adjust 
          /(double)ReportHActive()-(double)CurModePtr[3]+0.5);          
  Reg7300[0x1a]=(CurHPor&0x00ff);
  Reg7300[0x1b]=(CurHPor>>8);    
  CorPhaseStep=CalCoarsePhaseStep();
  MatchMax=0;         
  CurHPor=CurHPor-1;
  for(ScanCnt=0;ScanCnt<3;ScanCnt++){                                              
     Reg7300[0x1a]=(CurHPor&0x00ff);
     Reg7300[0x1b]=(CurHPor>>8);
     CurPhase=0x08;
     MatchCnt=0;
     for(IterCnt=0;IterCnt<_CorPhaseDiv;IterCnt++){
       Reg7300[0x0f]=CurPhase;
       //Wait2Frame();
       Wait1Frame();
       if(ReportHActive()==CurModePtr[3])MatchCnt++;  
       CurPhase=CurPhase+CorPhaseStep;
     }
     if(MatchCnt>=MatchMax){
        MatchMax=MatchCnt;
        RecHPor=CurHPor;
     }
     CurHPor++;  
  } 
  Reg7300[0x1a]=(RecHPor&0x00ff);
  Reg7300[0x1b]=(RecHPor>>8);
  OriginalColock=(Reg7300[0x5d]<<8)+Reg7300[0x5c]+1;                                            
  Reg7300[0x61]=0x66;//for command table test
}

//////////////////////////////////////////////////////////////////////////////////////
void PhaseCalibration(void)//Sum
{
unsigned char CurPhase, TimeOutCnt, TimeOut;
unsigned char MeanPhase, MinPhase1, CyclePhaseNum; 
unsigned long PrSum, NxSum;
float  PhaseStep,tmp;

  Reg7300[0x61]=0x00;//for command table test
  if(CurVtotal>1024)tmp=0.3125;
  else tmp=0.4167;
  SetFullScreen();
  CurPhase=0x48;
  TimeOutCnt=0;
  MinPhase1=0;
  CyclePhaseNum=((float)((Reg7300[0x15]<<8)+Reg7300[0x14])*10.0/(float)((Reg7300[0x5d]<<8)+Reg7300[0x5c]+1))/tmp+0.5;  
   
  if(CyclePhaseNum<16){TimeOut=CyclePhaseNum;PhaseStep=1.0;}
  else {TimeOut=16;PhaseStep=(float)CyclePhaseNum/16.0;}

    
  Reg7300[0x0f]=CurPhase;
  Wait1Frame();//

⌨️ 快捷键说明

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