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

📄 zfctr.c

📁 MCS51源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
}

/***************************************************************************/
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 + -