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

📄 zfctr.c

📁 MCS51源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <reg51.h>

sbit sda 	= P2^0;			// The state of SDA line of I2C bus
sbit scl 	= P2^1;			// The state of SCL line of I2C bus
sbit RST1_N	= P2^2;			// Pull this bit low to reset TVP5145
sbit INSEL 	= P2^3;			// This pin high selects VGA, otherwise video
sbit PAL_N	= P2^5;			// When PAL is detected, pull this bit low

sbit BRT_N	= P1^0;			// 亮度控制窄
sbit BRT_W	= P1^1;			// 亮度控制宽
sbit CTR_N	= P1^2;			// 对比度控制窄
sbit CTR_W	= P1^3;			// 对比度控制宽
sbit OUT_N	= P1^4;			// 输出选择窄
sbit OUT_W	= P1^5;			// 输出选择宽
sbit INS_N	= P1^6;			// 输入选择窄
sbit INS_W	= P1^7;			// 输入选择宽

sbit XGA_LD	= P0^0;			// XGA  输出模式指示
sbit SVGA_LD	= P0^1;			// SVGA 输出模式指示
sbit VGA_LD	= P0^2;			// VGA  输出模式指示

sbit VGA_IN	= P0^3;			// 由 VGA   输入指示
sbit S_VID	= P0^4;			// 由 S_VID 输入指示
sbit VID3	= P0^5;			// 由 VID3  输入指示
sbit VID2	= P0^6;			// 由 VID2  输入指示
sbit VID1	= P0^7;			// 由 VID1  输入指示

sbit init2402	= P3^7;			// 上电检测该点为低时,对2402的内容初始化

#define WRITE_I2CTIME	10
#define I2CTIME		1
#define BYTE 		unsigned char
#define BOOL 		bit
#define low		0
#define high		1
#define FALSE		0 
#define TRUE		1

#define STANDARD_PAL		0
#define STANDARD_NTSC		1
#define STANDARD_UNKNOWN	100

#define SELECT_VIDEO1		1
#define SELECT_VIDEO2		2
#define SELECT_VIDEO3		3
#define SELECT_SVIDEO		4
#define SELECT_IN_VGA		5

#define FORMAT_VGA		1
#define FORMAT_SVGA		2
#define FORMAT_XGA		3

#define DISABLE			0x55
#define ENABLE			0xAA

#define NV221_ADDRESS		0x6C
#define TVP5145_ADDRESS		0xB8
#define A2402_ADDRESS		0xA0

BYTE code TVP5145_register[][2] =
				{
				0x00, 0x08,
				0x03, 0x19,
				0x07, 0x09,
				0x08, 0x00,
				0x09, 0x80,
				0x0a, 0x80,
				0x0b, 0x00,
				0x0c, 0x80,
				0x0d, 0x07,
				0x0e, 0x00,
				0x16, 0x72,
				0x20, 0x03,
				0x25, 0x01,
				0x28, 0x00,
				};

BYTE code NV221_register[][2] =
				{
				0X10, 0X03,
				0X11, 0X64,
				0X12, 0X36,
				0X14, 0X00,
				0X28, 0X00,
				0X29, 0X28,
				0X2A, 0X1D,	// 0x7D for active low HS, VS
				0X2B, 0X00,
				0X2C, 0X2c,
				0X2D, 0X16,
				0X2E, 0X59,
				0X2F, 0X8F,
				0X30, 0X03,
				0X33, 0X04,
				0X40, 0X59,
				0X41, 0X8F,
				0X44, 0X90,	//0x8f  画面中间抖动
				0X45, 0X00,
				0X46, 0X00,
				0X47, 0X03,
				0X4C, 0X00,
				0X4D, 0X3A,
				0X4E, 0X48,
				0X4F, 0X70,
				0X50, 0X02,
				0X51, 0X26,
				0X56, 0X08,
				0X57, 0X02,
				0X58, 0X90,
				0X59, 0X00,
				0X5C, 0X59,
				0X5D, 0X8F,
				0X60, 0X03,
				0X61, 0X00,
				0X62, 0X40,
				0X63, 0X48,
				0X64, 0X5A,
				0X65, 0X5A,
				0X66, 0X03,
				0X67, 0X02,
				0X68, 0X1A,
				0X69, 0X78,
				0X6A, 0X0D,
				0X6B, 0X02,
				0X6C, 0X1A,
				0X70, 0X01,
				0X71, 0X10,
				0X72, 0X59,
				0X73, 0X77,
				0X78, 0X05,	// 05 for RGB, 00 for YPbPr
				0X79, 0X23,
				0X7A, 0XD4,
				0X7B, 0X72,
				0XD0, 0X02,
				0XD1, 0X02,
				0XD2, 0X01,
				0XD3, 0X08,
				0XD4, 0X40,
				0XD5, 0X8F,
				0XD8, 0X00,
				0XD9, 0X50,
				0XDE, 0X00,
				0XDF, 0X00,
				0XE6, 0X00,
				0XEA, 0X00,	// 00 for RGB, 02 for YPbPr
				0XF0, 0X00,
				0XF1, 0X00
				};

unsigned char code RegNV221_VGA[][2] =
				{
				0X12, 0X32,
				0X60, 0X03,
				0X61, 0X00,
				0X62, 0X1C,
				0X63, 0X20,
				0X64, 0X5A,
				0X65, 0X20,
				0X66, 0X03,
				0X67, 0X02,
				0X68, 0X1A,
				0X69, 0X78,
				0X6A, 0X0D,
				0X6B, 0X02,
				0X6C, 0X1A,
				0X72, 0X59,
				0X73, 0X77
				};

unsigned char code RegNV221_SVGA[][2] =
				{
				0X12, 0X50,
				0X60, 0X03,
				0X61, 0X00,
				0X62, 0X80,
				0X63, 0X58,
				0X64, 0X64,
				0X65, 0X20,
				0X66, 0X04,
				0X67, 0X04,
				0X68, 0X16,
				0X69, 0X96,
				0X6A, 0X74,
				0X6B, 0X02,
				0X6C, 0X16,
				0X72, 0X63,
				0X73, 0X95
				};

unsigned char code RegNV221_XGA[][2] =
				{
				0X12, 0X82,
				0X60, 0X03,
				0X61, 0X00,
				0X62, 0X88,
				0X63, 0XA0,
				0X64, 0X80,
				0X65, 0X40,
				0X66, 0X05,
				0X67, 0X06,
				0X68, 0X1C,
				0X69, 0XC0,
				0X6A, 0X26,
				0X6B, 0X03,
				0X6C, 0X1C,
				0X72, 0X7F,
				0X73, 0XBF
				};

unsigned char CTR_address = 0X10;
unsigned char BRT_address = 0X11;
unsigned char INS_address = 0X12;
unsigned char OUT_address = 0X13;

signed char brightness = 0X0e;				// 出厂时亮度值
unsigned char contrast = 0X20;				// 出厂时对比度值

unsigned char Video_input_select = SELECT_VIDEO1;	// 出厂时输入通道
unsigned char Output_format = FORMAT_SVGA;		// 出厂时输出格式

unsigned char Video_standard_NV221 = STANDARD_UNKNOWN;

void Write_NV221_register(unsigned char sub_address, unsigned char datum);
unsigned char Read_NV221_register(unsigned char sub_address);

void Write_TVP5145_register(unsigned char sub_address, unsigned char datum);

void Write_24C02_register(unsigned char sub_address, unsigned char datum);
unsigned char Read_24C02_register(unsigned char sub_address);

void Init_24C02_value(void);
void Initialize_TVP5145(void);
void Initialize_NV221(void);

void SOURCE_select(unsigned char select);
void FORMAT_select(unsigned char select);

void Process_INS(void);
void Process_OUT(void);
void Process_BRT(void);
void Process_CTR(void);

void STANDARD_detect_NV221(void);
void Screen_save(void);
void Screen_restore(void);
void NV221_clear_screen(unsigned char enable, unsigned char color_Y_G,
			unsigned char color_U_B, unsigned char color_V_R);

/***************************************************************************/
void Delay_us(unsigned char time)
{
  unsigned char i,k=0;
  for(i=0; i<time; i++)
     {
      k++;
      k--;
     }
  return;
}

/***************************************************************************/
void Delay_ms(unsigned char time)
{
  unsigned char i, j, k=0;
  for(i=0; i<time; i++)
     {
     for(j=0; j<198; j++)
        {
         k++;
         k--;
        }
     }
  return;
}

/***************************************************/
/*                I2c 子程序                       */
/***************************************************/
/*************************************/
/*  initial i2c start status         */
/*************************************/
void start_i2c(void)
{
    sda=high;
    Delay_us(I2CTIME);
    scl=high;
    Delay_us(I2CTIME);
    sda=low;
    Delay_us(I2CTIME);
    scl=low;
    Delay_us(I2CTIME);
}
/*************************************/
/*  initial status i2c stop          */
/*************************************/
void stop_i2c(void)
{
    sda=low;
    Delay_us(I2CTIME);
    scl=high;
    Delay_us(I2CTIME);
    sda=high;
    Delay_us(I2CTIME);
}
/*******************************************/
/* send a byte data to i2c sda line        */
/* return TRUE & FALSE                     */
/*******************************************/
bit send_to_i2c(BYTE eeprom_data)
{
    BYTE i;
    BOOL error_eeprom=1; 
    for(i=0;i<8;i++)
       {
        scl=low;
        sda=(bit)(eeprom_data&0x80);
        Delay_us(I2CTIME);
        scl=high;
        eeprom_data<<=1;
        Delay_us(I2CTIME);
       }
    scl=low;
    Delay_us(I2CTIME);
/********************************************/
/* i2c device send an ACK to MCU            */
/********************************************/
    sda=high;
    scl=high;
    for(i=0;i<=99;i++)		/*等待100次判断,没有ACK信号,退出,以免死机*/
       {
       if(sda==1)		/*等待 i2c 的ACK信号*/
         error_eeprom=1;
      else
         {
          error_eeprom=0;
          break;
         }
       }
    scl=low;
    return error_eeprom;
}
/**********************************************/
/* write block_size byte data to i2c device   */
/**********************************************/
bit write_to_i2c(BYTE comp_write,BYTE spec_address,BYTE n,BYTE * block_size)
{
    BYTE i;
    start_i2c();
    if(send_to_i2c(comp_write)==1)
	 	return FALSE;
    if(send_to_i2c(spec_address)==1)
	 	return FALSE;
    for(i=0;i<n;i++)
       {
        if(send_to_i2c(* block_size)==1)
	 	return FALSE;
        if(i<n-1)		/*avoid point excess when i=n-1*/
        block_size++;       
       }
    stop_i2c();
    Delay_us(WRITE_I2CTIME);
    return TRUE;
}
/********************************************/
/* receive a byte data from i2c data line   */
/* no ACK                                   */
/********************************************/
BYTE receive_from_i2c(void)
{
    BYTE eeprom_data=0;
    register BYTE i;
    scl=low;
    for(i=0;i<8;i++)
       {
       scl=high;
       Delay_us(I2CTIME);
       if(sda==1)
         eeprom_data++;
       if(i<7)
         eeprom_data<<=1;
       scl=low;
       Delay_us(I2CTIME);
       }
    sda=high;
    scl=high;
    sda=low;                 /*MCU send  a ACK to OSD*/
    Delay_us(I2CTIME);
    sda=low;
    scl=low;
    return eeprom_data;
}
/**********************************************/
/*      read 1 byte data from i2c device      */
/**********************************************/
bit read_from_i2c(BYTE comp_read,BYTE spec_address,BYTE * block_size)
{
    start_i2c();
    if(send_to_i2c(comp_read-1)==1)     /*write device address to i2c*/ 
      return FALSE;
    if(send_to_i2c(spec_address)==1)
      return FALSE;
    start_i2c();
    if(send_to_i2c(comp_read)==1)
      return FALSE;
    * block_size=receive_from_i2c();
    stop_i2c();
    return TRUE;
}
/***************************************************************************/

/***************************************************************************/
void Write_NV221_register(unsigned char sub_address, unsigned char datum)
{
  write_to_i2c(NV221_ADDRESS,sub_address,1,&datum);
  return;
}

/***************************************************************************/
unsigned char Read_NV221_register(unsigned char sub_address)
{
  unsigned char datum, comp_read;
  comp_read = NV221_ADDRESS + 1;
  read_from_i2c(comp_read, sub_address, &datum);
  return(datum);
}

/***************************************************************************/
void Write_TVP5145_register(unsigned char sub_address, unsigned char datum)
{
  write_to_i2c(TVP5145_ADDRESS,sub_address,1,&datum);
  return;

⌨️ 快捷键说明

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