📄 zfctr.c
字号:
}
/***************************************************************************/
void Write_24C02_register(unsigned char sub_address, unsigned char datum)
{
write_to_i2c(A2402_ADDRESS,sub_address,1,&datum);
return;
}
/***************************************************************************/
unsigned char Read_24C02_register(unsigned char sub_address)
{
unsigned char datum, comp_read;
comp_read = A2402_ADDRESS + 1;
read_from_i2c(comp_read, sub_address, &datum);
return(datum);
}
/***************************************************************************/
void Initialize_TVP5145() // 初始化5145
{
unsigned char i,a;
a=0;
Write_TVP5145_register(0x7f,0);
Delay_ms(250);
for(i=0;i<sizeof(TVP5145_register)/2; i++)
write_to_i2c(TVP5145_ADDRESS,TVP5145_register[i][0],1,&TVP5145_register[i][1]);
return;
}
/***************************************************************************/
void Initialize_NV221(void) // 初始化221
{
unsigned char i;
for(i=0; i<sizeof(NV221_register)/2; i++)
write_to_i2c(NV221_ADDRESS,NV221_register[i][0],1,&NV221_register[i][1]);
STANDARD_detect_NV221();
return;
}
/***************************************************************************/
void STANDARD_detect_NV221(void) // 输入视频模式判定
{
unsigned char temp;
if(Video_input_select == SELECT_IN_VGA)
{
Video_standard_NV221 = STANDARD_UNKNOWN;
PAL_N = high;
}
else
{
temp = Read_NV221_register(0X28);
if(temp & 0X20) // DVD video error
{
Video_standard_NV221 = STANDARD_UNKNOWN; // 输入视频模式不正确
PAL_N = !PAL_N; // PAL LED blink
Delay_ms(125);
PAL_N = !PAL_N; // PAL LED blink
Delay_ms(100);
return;
}
temp &= 0X1C;
if(temp == 0X08) // PAL
{
if(Video_standard_NV221 == STANDARD_PAL) return;
Video_standard_NV221 = STANDARD_PAL; // 输入视频模式 PAL
Write_NV221_register(0X2B, 0X84);
Write_NV221_register(0X2C, 0X2C);
Write_NV221_register(0X2D, 0X16);
PAL_N = low;
}
else // NTSC
{
if(Video_standard_NV221 == STANDARD_NTSC) return;
Video_standard_NV221 = STANDARD_NTSC; // 输入视频模式 NTSC
Write_NV221_register(0X2B, 0X7A);
Write_NV221_register(0X2C, 0X20);
Write_NV221_register(0X2D, 0X10);
PAL_N = high;
}
}
return;
}
/***************************************************************************/
void Screen_save(void) // 黑屏
{
NV221_clear_screen(ENABLE, 0, 0, 0);
return;
}
/***************************************************************************/
void Screen_restore(void) // 亮屏
{
STANDARD_detect_NV221();
Delay_ms(50);
NV221_clear_screen(DISABLE, 128, 128, 128);
return;
}
/***************************************************************************/
void NV221_clear_screen(unsigned char enable, unsigned char color_Y_G,
unsigned char color_U_B, unsigned char color_V_R)
{
unsigned char temp;
Write_NV221_register(0X79, color_Y_G);
Write_NV221_register(0X7A, color_U_B);
Write_NV221_register(0X7B, color_V_R);
if(enable == ENABLE)
{
temp = Read_NV221_register(0X78);
temp |= 0X80;
Write_NV221_register(0X78, temp);
}
if(enable == DISABLE)
{
temp = Read_NV221_register(0X78);
temp &= 0X7F;
Write_NV221_register(0X78, temp);
}
return;
}
/***************************************************************************/
void Process_INS(void) // 输入选择处理
{
CY = INS_N;
if(CY == 1) return; // Key not pressed
if(CY == 0)
{
Delay_ms(3);
CY = INS_N;
if(CY == 1) return; // Key shock
while(CY == 0) CY = INS_N; // Wait for key release
}
Delay_us(100);
CY = INS_W;
if(CY == 0)
{
if(Video_input_select == SELECT_VIDEO1) Video_input_select = SELECT_VIDEO2;
else if(Video_input_select == SELECT_VIDEO2) Video_input_select = SELECT_VIDEO3;
else if(Video_input_select == SELECT_VIDEO3) Video_input_select = SELECT_SVIDEO;
else if(Video_input_select == SELECT_SVIDEO) Video_input_select = SELECT_IN_VGA;
else if(Video_input_select == SELECT_IN_VGA) Video_input_select = SELECT_VIDEO1;
}
else
{
if(Video_input_select == SELECT_VIDEO1) Video_input_select = SELECT_IN_VGA;
else if(Video_input_select == SELECT_IN_VGA) Video_input_select = SELECT_SVIDEO;
else if(Video_input_select == SELECT_SVIDEO) Video_input_select = SELECT_VIDEO3;
else if(Video_input_select == SELECT_VIDEO3) Video_input_select = SELECT_VIDEO2;
else if(Video_input_select == SELECT_VIDEO2) Video_input_select = SELECT_VIDEO1;
}
Write_24C02_register(INS_address, Video_input_select);
SOURCE_select(Video_input_select); // 置选定的输入通道
return;
}
/***************************************************************************/
void Process_OUT(void) // 输出选择处理
{
CY = OUT_N;
if(CY == 1) return; // Key not pressed
if(CY == 0)
{
Delay_ms(3);
CY = OUT_N;
if(CY == 1) return; // Key shock
while(CY == 0) CY = OUT_N; // Wait for key release
}
Delay_us(100);
CY = OUT_W;
if(CY == 0)
{
if(Output_format == FORMAT_VGA) Output_format = FORMAT_SVGA;
else if(Output_format == FORMAT_SVGA) Output_format = FORMAT_XGA;
else if(Output_format == FORMAT_XGA) Output_format = FORMAT_VGA;
}
else
{
if(Output_format == FORMAT_VGA) Output_format = FORMAT_XGA;
else if(Output_format == FORMAT_XGA) Output_format = FORMAT_SVGA;
else if(Output_format == FORMAT_SVGA) Output_format = FORMAT_VGA;
}
Write_24C02_register(OUT_address, Output_format);
FORMAT_select(Output_format); // 置选定的输出模式
return;
}
/***************************************************************************/
void Process_BRT(void) // 亮度调整处理
{
CY = BRT_N;
if(CY == 1) return; // Key not pressed
if(CY == 0)
{
Delay_ms(1);
CY = BRT_N;
if(CY == 1) return; // Key shock
while(CY == 0) CY = BRT_N; // Wait for key release
}
Delay_us(100);
CY = BRT_W;
if(CY == 0) // 亮度增加
{
if(brightness < 124) brightness = brightness + 5;
}
else // 亮度减小
{
if(brightness > -124) brightness = brightness - 5;
}
Write_24C02_register(BRT_address, brightness);
Write_NV221_register(0XD7, brightness);
return;
}
/***************************************************************************/
void Process_CTR(void) // 对比度调整处理
{
CY = CTR_N;
if(CY == 1) return; // Key not pressed
if(CY == 0)
{
Delay_ms(1);
CY = CTR_N;
if(CY == 1) return; // Key shock
while(CY == 0) CY = CTR_N; // Wait for key release
}
Delay_us(100);
CY = CTR_W;
if(CY == 0) // 对比度增加
{
if(contrast < 63) contrast++;
}
else // 对比度减小
{
if(contrast > 5) contrast--;
}
Write_24C02_register(CTR_address, contrast);
Write_NV221_register(0XD6, contrast);
return;
}
/***************************************************************************/
void SOURCE_select(unsigned char select) // 5145的输入选择
{
Screen_save();
if(select == SELECT_VIDEO1)
{
VID1=0, VID2=1, VID3=1, S_VID=1, VGA_IN=1; // 亮VIDEO1指示灯
INSEL = low;
Write_TVP5145_register(0x00, 0x08);
Write_TVP5145_register(0x20, 0x03);
}
else if(select == SELECT_VIDEO2)
{
VID1=1, VID2=0, VID3=1, S_VID=1, VGA_IN=1; // 亮VIDEO2指示灯
INSEL = low;
Write_TVP5145_register(0x00, 0x01);
Write_TVP5145_register(0x20, 0x03);
}
else if(select == SELECT_VIDEO3)
{
VID1=1, VID2=1, VID3=0, S_VID=1, VGA_IN=1; // 亮VIDEO3指示灯
INSEL = low;
Write_TVP5145_register(0x00, 0x02);
Write_TVP5145_register(0x20, 0x00);
}
else if(select == SELECT_SVIDEO)
{
VID1=1, VID2=1, VID3=1, S_VID=0, VGA_IN=1; // 亮SVIDEO指示灯
INSEL = low;
Write_TVP5145_register(0x00, 0x00);
Write_TVP5145_register(0x20, 0x01);
}
else if(select == SELECT_IN_VGA)
{
VID1=1, VID2=1, VID3=1, S_VID=1, VGA_IN=0; // 亮VGA指示灯
INSEL = high;
}
Screen_restore();
return;
}
/***************************************************************************/
void FORMAT_select(unsigned char select) // 输出模式设定
{
unsigned char* data_ptr;
unsigned char data_length, i;
Screen_save();
if(select == FORMAT_VGA)
{
VGA_LD = 0, SVGA_LD = 1, XGA_LD = 1; // 亮VGA指示灯
data_ptr = (unsigned char*)RegNV221_VGA;
data_length = sizeof(RegNV221_VGA) / 2;
}
else if(select == FORMAT_SVGA)
{
VGA_LD = 1, SVGA_LD = 0, XGA_LD = 1; // 亮SVGA指示灯
data_ptr = (unsigned char*)RegNV221_SVGA;
data_length = sizeof(RegNV221_SVGA) / 2;
}
else if(select == FORMAT_XGA)
{
VGA_LD = 1, SVGA_LD = 1, XGA_LD = 0; // 亮XGA指示灯
data_ptr = (unsigned char*)RegNV221_XGA;
data_length = sizeof(RegNV221_XGA) / 2;
}
for(i=0; i<data_length; i++)
Write_NV221_register(data_ptr[i*2], data_ptr[i*2+1]);
Screen_restore();
return;
}
/***************************************************************************/
void Init_24C02_value(void) // 将出厂值写入24C02
{
CY = init2402;
if(CY == 1) return; // P3.7 not pressed
else
{
Delay_ms(100);
CY = init2402;
if(CY == 1) return; // P3.7 shock
}
Write_24C02_register(CTR_address, contrast);
Delay_ms(100);
Write_24C02_register(BRT_address, brightness);
Delay_ms(100);
Write_24C02_register(INS_address, Video_input_select);
Delay_ms(100);
Write_24C02_register(OUT_address, Output_format);
while(1)
{
VID1=0, VID2=1, VID3=1, S_VID=1, VGA_IN=1;
Delay_ms(200);
VID1=1, VID2=0, VID3=1, S_VID=1, VGA_IN=1;
Delay_ms(200);
VID1=1, VID2=1, VID3=0, S_VID=1, VGA_IN=1;
Delay_ms(200);
VID1=1, VID2=1, VID3=1, S_VID=0, VGA_IN=1;
Delay_ms(200);
VID1=1, VID2=1, VID3=1, S_VID=1, VGA_IN=0;
Delay_ms(200);
}
return;
}
/***************************************************************************/
/***************************************************************************/
void main(void)
{
Delay_ms(50);
Init_24C02_value();
RST1_N = low; // Reset TVP5145: Start
Delay_ms(50); // Keep RST1_N low 50mS
RST1_N = high; // Reset TVP5145: End
Delay_ms(20);
Initialize_TVP5145(); // 初始化5145
Delay_ms(20);
Initialize_NV221(); // 初始化221
Delay_ms(20);
contrast = Read_24C02_register(CTR_address);
Write_NV221_register(0XD6, contrast);
brightness = Read_24C02_register(BRT_address);
Write_NV221_register(0XD7, brightness);
Video_input_select = Read_24C02_register(INS_address);
SOURCE_select(Video_input_select); // 置选定的输入通道
Output_format = Read_24C02_register(OUT_address);
FORMAT_select(Output_format); // 置选定的输出模式
while(1)
{
Process_INS();
Process_OUT();
Process_BRT();
Process_CTR();
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -