📄 zfctr.c
字号:
#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 + -