📄 v46x_panel.c
字号:
#include "..\inc\V46X_PANEL.h"
#include "..\inc\V46X_RegDef.h"
#include "..\inc\Gamma_Tab.h"
extern void I2C_Write(unsigned char,unsigned char,unsigned char,unsigned char *);
extern void I2C_Read(unsigned char,unsigned char,unsigned char,unsigned char *);
extern void I2C_WriteByte(unsigned char,unsigned char,unsigned char);
extern unsigned char I2C_ReadByte(unsigned char,unsigned char);
extern unsigned char CVD1_ReadWrite(unsigned char, unsigned char, unsigned char);
void V46X_Set_ScanLines(unsigned char);
bit V46X_If_CorrectCS();
#define V46X_WRID 0x28
#define W_TYPE 0x01 //Type for Write in CVD1
#define R_TYPE 0x00
extern unsigned char ColorEN;
//unsigned char _Color = NTSC, _Source = VIDEO1, _Screen = 0, _HPosition = 0x20, _VPosition = 0;
unsigned char _Scan = S525, _Color = NTSC, _Source = VIDEO1, _Screen = 0, _HPosition = 0x20, _VPosition = 0;
code unsigned char _VStatus[8] =
{
0x00, // NTSC
0x05, // PAL
0x06, // SECAM
0x01, // PAL M
0x05, // PAL N
0x01, // PAL 60
0x00, // NTSC 433
0x04, // NTSC N
};
void _Delay(unsigned int value)
{
while(value>0)
value--;
}
void V46X_RegInit()
{
// I2C_WriteByte(V46X_WRID, 0xAD, 0x07); //Enable TV-Decoder source detect interrupt
I2C_Write(V46X_WRID, 0x00, 0x87, TCON_Ctrl); //V462 Reg. from 0x00~ 0x86
I2C_WriteByte(V46X_WRID, 0xA7, TCON_Ctrl[0x87]); //RGBDAC output voltage
// I2C_WriteByte(V46X_WRID, 0x90, 0x04); //Dither ON (Digital Panel) *
// I2C_WriteByte(V46X_WRID, 0x92, 0x20); // (Digital Panel) *
V46X_Gamma_Init();
}
void V46X_Gamma_Init()
{
unsigned char i;
I2C_WriteByte(V46X_WRID, 0x0C, 0xF6);
for (i=0;;i++)
{
I2C_WriteByte(V46X_WRID, 0x15, Gamma_Table2[i]);
I2C_WriteByte(V46X_WRID, 0x15, Gamma_Table2[i]);
I2C_WriteByte(V46X_WRID, 0x15, Gamma_Table2[i]);
if ( i == 0xFF )
break;
}
I2C_WriteByte(V46X_WRID, 0x0C, 0xFA);
}
void V46X_HV(bit horizontal, bit vertical)
{
unsigned char hv;
hv = TCON_Ctrl[0x60];
if ( horizontal )
hv ^= 0x18;
if ( vertical )
hv ^= 0x60;
I2C_WriteByte(V46X_WRID, 0x60, hv);
}
bit V46X_If_Signal_In()
{
unsigned char r3A;
r3A = CVD1_ReadWrite(R_TYPE, 0x3A, 0x00) & 0x1;
if ( r3A == 0x0 )
return 1;
else
return 0;
}
void V46X_VideoSource(unsigned char video_source)
{
_Source = video_source;
if ( _Source <= SVIDEO2 )
{
V46X_Change_Mode(_Source, _Color, _Screen);
return;
}
}
void V46X_Set_ScreenMode(unsigned char screen_mode)
{
_Screen = screen_mode;
}
void V46X_ScreenMode(unsigned char screen_mode)
{
_Screen = screen_mode;
// _Screen = 0;
I2C_WriteByte(V46X_WRID, 0x1A, 0x80); // Turn OFF Screen;
I2C_Write(V46X_WRID, 0x08, 0x03, &TCON_Scaler[_Screen][_Scan][0]);
I2C_Write(V46X_WRID, 0x38, 0x28, &TCON_Scaler[_Screen][_Scan][3]);
_Delay(20000);
// I2C_WriteByte(V46X_WRID, 0x1A, 0x40); // Turn ON Screen;
}
unsigned char V46X_Get_ColorSystem()
{
return _Color;
}
void V46X_ColorSystem(unsigned char color_system)
{
unsigned char i,R00;
_Color = color_system;
if ( _Source == SVIDEO1 || _Source == SVIDEO2)
R00 = VideoSTD_Data[_Color][0] | 0x1;
else
R00 = VideoSTD_Data[_Color][0];
if ( _Scan == S625 )
R00 = R00 | 0x30;
else
R00 = R00 & 0xCF;
CVD1_ReadWrite(W_TYPE, 0x00, R00);
for (i=1; i<19; i++)
CVD1_ReadWrite(W_TYPE, VideoSTD_Addr[i], VideoSTD_Data[_Color][i]);
_Delay(20000);
}
unsigned char V46X_Detect_ColorSystem()
{
unsigned char r3A,r3C;
r3C = CVD1_ReadWrite(R_TYPE, 0x3C, 0x00);
r3A = CVD1_ReadWrite(R_TYPE, 0x3A, 0x00);
if ( (r3C&0x8) || (r3A&0x1) ) // Noisy or NO Signal
return _Color;
if ( V46X_If_CorrectCS() )
return _Color;
_Delay(200);
r3C = CVD1_ReadWrite(R_TYPE, 0x3C, 0x00);
r3A = CVD1_ReadWrite(R_TYPE, 0x3A, 0x00);
if ( (r3C&0x8) || (r3A&0x1) ) // Noisy or NO Signal
return _Color;
if ( V46X_If_CorrectCS() )
return _Color;
_Delay(200);
r3C = CVD1_ReadWrite(R_TYPE, 0x3C, 0x00);
r3A = CVD1_ReadWrite(R_TYPE, 0x3A, 0x00);
if ( (r3C&0x8) || (r3A&0x1) ) // Noisy or NO Signal
return _Color;
if ( V46X_If_CorrectCS() )
return _Color;
I2C_WriteByte(V46X_WRID, 0x1A, 0x80); // Turn OFF Screen;
_Delay(50000);
_Delay(30000);
r3A = CVD1_ReadWrite(R_TYPE, 0x3A, 0x00);
r3C = CVD1_ReadWrite(R_TYPE, 0x3C, 0x00);
if ( r3A&0x1 ) // No Signal
{
// I2C_WriteByte(V46X_WRID, 0x1A, 0x40); // Turn ON Screen;
return _Color;
}
if ( (r3C&0x4) ) // 625 Detected
{
if ( ColorEN&0x2 )
{
V46X_ColorSystem(PAL);
if ( V46X_If_CorrectCS() )
{
// I2C_WriteByte(V46X_WRID, 0x1A, 0x40); // Turn ON Screen;
return _Color;
}
}
if ( ColorEN&0x4 )
V46X_ColorSystem(SECAM);
}
else
{
V46X_ColorSystem(NTSC);
}
// I2C_WriteByte(V46X_WRID, 0x1A, 0x40); // Turn ON Screen;
return _Color ;
}
unsigned char V46X_Detect_ColorSystem_AV()
{
unsigned char r3A,r3C;
r3A = CVD1_ReadWrite(R_TYPE, 0x3A, 0x00);
r3C = CVD1_ReadWrite(R_TYPE, 0x3C, 0x00);
if ( r3A&0x1 ) // No Signal
return _Color;
while (1)
{
if ((r3C&0x4) && _Color != PAL )
break;
if ( (r3C&0x4)==0 && _Color != NTSC )
break;
if ( !V46X_If_CorrectCS() )
break;
return _Color;
}
/*
if ( r3A&0x1 ) // No Signal
return _Color;
if ( (r3C&0x4) && _Color == PAL )
return _Color;
if ( (r3C&0x4)==0 && _Color == NTSC )
return _Color;
_Delay(500);
r3A = CVD1_ReadWrite(R_TYPE, 0x3A, 0x00);
r3C = CVD1_ReadWrite(R_TYPE, 0x3C, 0x00);
if ( r3A&0x1 ) // No Signal
return _Color;
if ( (r3C&0x4) && _Color == PAL )
return _Color;
if ( (r3C&0x4)==0 && _Color == NTSC )
return _Color;
_Delay(500);
r3A = CVD1_ReadWrite(R_TYPE, 0x3A, 0x00);
r3C = CVD1_ReadWrite(R_TYPE, 0x3C, 0x00);
if ( r3A&0x1 ) // No Signal
return _Color;
if ( (r3C&0x4) && _Color == PAL )
return _Color;
if ( (r3C&0x4)==0 && _Color == NTSC )
return _Color;
*/
I2C_WriteByte(V46X_WRID, 0x1A, 0x80); // Turn OFF Screen;
_Delay(60000);
_Delay(60000);
r3A = CVD1_ReadWrite(R_TYPE, 0x3A, 0x00);
r3C = CVD1_ReadWrite(R_TYPE, 0x3C, 0x00);
if ( r3A&0x1 ) // No Signal
return _Color;
if ( r3C&0x4 )
{
V46X_Set_ScanLines(S625);
V46X_ColorSystem(PAL);
}
else
{
V46X_Set_ScanLines(S525);
V46X_ColorSystem(NTSC);
}
// I2C_WriteByte(V46X_WRID, 0x1A, 0x40); // Turn ON Screen;
return _Color;
}
void V46X_Set_ScanLines(unsigned char scan)
{
unsigned char R00;
_Scan = scan;
R00 = CVD1_ReadWrite(R_TYPE, 0x00, 0x00);
if ( _Scan )
R00 = R00 | 0x30;
else
R00 = R00 & 0xCF;
CVD1_ReadWrite(W_TYPE, 0x00, R00);
CVD1_ReadWrite(W_TYPE, 0x3F, 0x01);
CVD1_ReadWrite(W_TYPE, 0x3F, 0x00);
I2C_Write(V46X_WRID, 0x08, 0x03, &TCON_Scaler[_Screen][_Scan][0]);
I2C_Write(V46X_WRID, 0x38, 0x28, &TCON_Scaler[_Screen][_Scan][3]);
_Delay(20000);
}
void V46X_Detect_ScanLines()
{
unsigned char r3A,r3C;
r3A = CVD1_ReadWrite(R_TYPE, 0x3A, 0x00);
r3C = CVD1_ReadWrite(R_TYPE, 0x3C, 0x00);
if ( r3A&0x1 ) // No Signal
return ;
if ( (r3C&0x4)==4 && _Scan == S625 )
return ;
if ( (r3C&0x4)==0 && _Scan == S525 )
return ;
I2C_WriteByte(V46X_WRID, 0x1A, 0x80);
if ( r3C&0x4 )
V46X_Set_ScanLines(S625);
else
V46X_Set_ScanLines(S525);
_Delay(20000);
}
bit V46X_If_CorrectCS()
{
unsigned char r3A,r3C;
r3A = CVD1_ReadWrite(R_TYPE, 0x3A, 0x00);
r3C = CVD1_ReadWrite(R_TYPE, 0x3C, 0x00);
/*
if ( _Color == SECAM )
{
if ( (r3A&0x8) == 0x08 && (r3C&0x7) == 0x6 ) // Chroma Locked
return 1; // and In correct color system
else
return 0;
}
*/
if ( (r3A&0x8) == 0x08 && (r3C&0x3) == (_VStatus[_Color]&0x3) ) // Chroma Locked
return 1; // and In correct color system
else
return 0;
}
void V46X_Change_Mode(unsigned char video_source, unsigned char color_system,
unsigned char screen_mode )
{
unsigned char i;
_Source = video_source;
_Color = color_system;
_Screen = screen_mode;
I2C_WriteByte(V46X_WRID, 0x1A, 0x80); //Turn OFF Screen;
I2C_WriteByte(V46X_WRID, 0x00, 0x60);
I2C_WriteByte(V46X_WRID, 0x01, 0x01);
I2C_WriteByte(V46X_WRID, 0x05, 0x00);
I2C_Write(V46X_WRID, 0x08, 0x03, &TCON_Scaler[_Screen][_Scan][0]);
I2C_Write(V46X_WRID, 0x38, 0x28, &TCON_Scaler[_Screen][_Scan][3]);
for (i=0; i<9; i++)
CVD1_ReadWrite(W_TYPE, VideoSUR_Addr[i], VideoSUR_Data[_Source][i]);
if ( _Source == SVIDEO1 || _Source == SVIDEO2 )
i = VideoSTD_Data[_Color][0] | 0x1;
else
i = VideoSTD_Data[_Color][0];
if ( _Scan == S625 )
i = i | 0x30;
else
i = i & 0xCF;
CVD1_ReadWrite(W_TYPE, 0x00, i);
for (i=1; i<19; i++)
CVD1_ReadWrite(W_TYPE, VideoSTD_Addr[i], VideoSTD_Data[_Color][i]);
_Delay(60000);
// I2C_WriteByte(V46X_WRID, 0x1A, 0x40); //Turn ON Screen;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -