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

📄 osd.c

📁 TECHWELL 之tw2835 四画面合一之驱动代码,CCIR656输出,KEIL C51 平台编译,
💻 C
📖 第 1 页 / 共 3 页
字号:
//	U8 _t1_;
	U8 _t2_, _t3_;
	
#if	defined(__EN_ISR__)
//	EA = 0;
#endif
//	U8 _t1_;

	WriteAsicByteOSD(_dvc,0x00,0xff);					//... 1st pixel
	WriteAsicByteOSD(_dvc,0x01,0xff);					//... 2nd pixel
	WriteAsicByteOSD(_dvc,0x02,0xff);					//... 3rd pixel
	WriteAsicByteOSD(_dvc,0x03,0xff);					//... 4th pixel
	//... acceleration 阑 荤侩且 版快 buffer write 苞沥 积帆啊瓷.
//	WriteAsicByteOSD(_dvc,0x04,0x80);					//... write to buffer

//... start position
//	_pos_x <<= 2;														//... (_pos_x)*4 -> 4 pixel * 4 -> 16 pixel char
	_pos_y = (_pos_y<<1)+(_pos_y<<3);							//... (_pos_y)*(2+8)

//	WriteAsicByteOSD(_dvc,0x05,_pos_x);
	WriteAsicByteOSD(_dvc,0x07,_pos_y&0xff);

//... end position
//	_pos_x += _wdth<<2;
	_hght = _pos_y+((_hght<<1)+(_hght<<3));

//	WriteAsicByteOSD(_dvc,0x06,--_pos_x);
	WriteAsicByteOSD(_dvc,0x08,(--_hght)&0xff);

//	WriteAsicByteOSD(_dvc,0x09,((_pos_y>>8)<<2)+(_hght>>8));		//... odd field
//	WriteAsicByteOSD(_dvc,0x0a,0xc0);										//... acceleration|x path
//
//	while(ReadAsicOSDMemWr(_dvc)&BIT7);								//... wait finishing write for odd field
////Delay(1);

	WriteAsicByteOSD(_dvc,0x09,0x02|((_pos_y>>8)<<2)+(_hght>>8));	//... ~ even field
//	WriteAsicByteOSD(_dvc,0x0a,0xc0);										//... acceleration|x path
//
//	while(ReadAsicOSDMemWr(_dvc)&BIT7);								//... wait finishing write for even field
////Delay(1);
	_pos_x <<= 2;
	_wdth <<= 2;
	
	_t2_ = _wdth>>4;
	_t3_ = _wdth&0x0f;
	
//	for(_t1_=0;_t1_<=_t2_;_t1_++){
//		if(_t1_<_t2_){
//			WriteAsicByteOSD(0,0x05,_pos_x+(_t1_<<4));//_t1_);
//			WriteAsicByteOSD(0,0x06,_pos_x+((_t1_+1)<<4));//79);
//		}
//		else{
//			WriteAsicByteOSD(0,0x05,_pos_x+(_t2_<<4));//_t1_);
//			WriteAsicByteOSD(0,0x06,_pos_x+((_t2_<<4)+(--_t3_)));//79);
//		}
//		WriteAsicByteOSD(0,0x0a,0xc0);										//... acceleration|x path
//		while(ReadAsicOSDMemWr(_dvc)&BIT7){}								//... wait finishing write for even field
//	}
	if (_t2_ != 0) {
			WriteAsicByteOSD(0,0x05,_pos_x);
			WriteAsicByteOSD(0,0x06,_pos_x+(_t2_<<4));//79);
		WriteAsicByteOSD(0,0x0a,0xc0);										//... acceleration|x path
		while(ReadAsicOSDMemWr(_dvc)&BIT7){}								//... wait finishing write for even field
	}
	if (_t3_ != 0){
			WriteAsicByteOSD(0,0x05,_pos_x+(_t2_<<4));//_t1_);
			WriteAsicByteOSD(0,0x06,_pos_x+((_t2_<<4)+_t3_-1));//79);
		WriteAsicByteOSD(0,0x0a,0xc0);										//... acceleration|x path
		while(ReadAsicOSDMemWr(_dvc)&BIT7){}								//... wait finishing write for even field
	}
	

#if	defined(__EN_ISR__)
//	EA = 1;
#endif
}
//==================================================================================
void WriteOSDClrY(U8 _dvc, U8 _pos_x, U16 _pos_y, U8 _wdth, U16 _hght)	//... only one _pth at once
{
//	U8 _t1_;
	U8 _t2_, _t3_;
	
#if	defined(__EN_ISR__)
//	EA = 0;
#endif
//	U8 _t1_;

	WriteAsicByteOSD(_dvc,0x00,0xff);					//... 1st pixel
	WriteAsicByteOSD(_dvc,0x01,0xff);					//... 2nd pixel
	WriteAsicByteOSD(_dvc,0x02,0xff);					//... 3rd pixel
	WriteAsicByteOSD(_dvc,0x03,0xff);					//... 4th pixel
	//... acceleration 阑 荤侩且 版快 buffer write 苞沥 积帆啊瓷.
//	WriteAsicByteOSD(_dvc,0x04,0x80);					//... write to buffer

//... start position
//	_pos_x <<= 1;														//... (_pos_x)*2 -> 8 pixel * 2 -> 16 pixel char
	_pos_y = (_pos_y<<1)+(_pos_y<<3);							//... (_pos_y)*(2+8)

//	WriteAsicByteOSD(_dvc,0x05,_pos_x);
	WriteAsicByteOSD(_dvc,0x07,_pos_y&0xff);

//... end position
//	_pos_x += _wdth<<1;
	_hght = _pos_y+((_hght<<1)+(_hght<<3));

//	WriteAsicByteOSD(_dvc,0x06,--_pos_x);
	WriteAsicByteOSD(_dvc,0x08,(--_hght)&0xff);

//	WriteAsicByteOSD(_dvc,0x09,((_pos_y>>8)<<2)+(_hght>>8));		//... odd field
//	WriteAsicByteOSD(_dvc,0x0a,0xe0);										//... acceleration|y path
//
//	while(ReadAsicOSDMemWr(_dvc)&BIT7);								//... wait finishing write for odd field
////Delay(1);

	WriteAsicByteOSD(_dvc,0x09,0x02|((_pos_y>>8)<<2)+(_hght>>8));	//... ~ even field
//	WriteAsicByteOSD(_dvc,0x0a,0xe0);										//... acceleration|y path
//
//	while(ReadAsicOSDMemWr(_dvc)&BIT7);								//... wait finishing write for even field
////Delay(1);
	_pos_x <<= 1;														//... (_pos_x)*2 -> 8 pixel * 2 -> 16 pixel char
	_wdth <<= 1;
	
	_t2_ = _wdth>>4;
	_t3_ = _wdth&0x0f;
	
//	for(_t1_=0;_t1_<=_t2_;_t1_++){
//		if(_t1_<_t2_){
//			WriteAsicByteOSD(0,0x05,_pos_x+(_t1_<<4));//_t1_);
//			WriteAsicByteOSD(0,0x06,_pos_x+((_t1_+1)<<4));//79);
//		}
//		else{
//			WriteAsicByteOSD(0,0x05,_pos_x+(_t2_<<4));//_t1_);
//			WriteAsicByteOSD(0,0x06,_pos_x+((_t2_<<4)+(--_t3_)));//79);
//		}
//		WriteAsicByteOSD(0,0x0a,0xe0);										//... acceleration|y path
//		while(ReadAsicOSDMemWr(_dvc)&BIT7){}								//... wait finishing write for even field
//	}
	if (_t2_ != 0) {
			WriteAsicByteOSD(0,0x05,_pos_x);
			WriteAsicByteOSD(0,0x06,_pos_x+(_t2_<<4));//79);
		WriteAsicByteOSD(0,0x0a,0xe0);										//... acceleration|y path
		while(ReadAsicOSDMemWr(_dvc)&BIT7){}								//... wait finishing write for even field
	}
	if (_t3_ != 0){
			WriteAsicByteOSD(0,0x05,_pos_x+(_t2_<<4));//_t1_);
			WriteAsicByteOSD(0,0x06,_pos_x+((_t2_<<4)+_t3_-1));//79);
		WriteAsicByteOSD(0,0x0a,0xe0);										//... acceleration|y path
		while(ReadAsicOSDMemWr(_dvc)&BIT7){}								//... wait finishing write for even field
	}

#if	defined(__EN_ISR__)
//	EA = 1;
#endif
}
//==================================================================================
void WriteOSDClr(U8 _pth, U8 _dvc, U8 _pos_x, U16 _pos_y, U8 _wdth, U16 _hght)	//... 16x20 font 扁霖.
{
	if(BitSet(_pth,PTH_X))	WriteOSDClrX(_dvc,_pos_x,_pos_y,_wdth,_hght);
	if(BitSet(_pth,PTH_Y))	WriteOSDClrY(_dvc,_pos_x,_pos_y,_wdth,_hght);
}
//==================================================================================
/*
U8 DsplyOSDDatHexX(U8 _dvc, U8 _pos_x, U8 _pos_y, U8 _pg, U8 _addr)
{
	U8 _rdat_;
//	U8 _pg=0, _addr=0;
	U8 _t3_;
	
//	_pg = _addr>>16;
//	_addr = _addr&0xff;
	if(_pg == 0xff)	_rdat_ = _addr;
//	else if((_dvc == TW9901)||(_dvc == SAA7121))	_rdat_ = ReadI2CByte(_dvc,_addr);
//	else if(_dvc == TW9901)	_rdat_ = ReadI2CByte(_dvc,_addr);
	else	_rdat_ = ReadAsicByte(_dvc,_pg,_addr);

	for(_t3_=0;_t3_<2;_t3_++){
		_pg = _rdat_&(0x0f<<(_t3_<<2));
		_pg >>= _t3_<<2;
		if(_pg < 0x0a)	_addr = 0x10;//0x30;	
		else	_addr = 0x17;//0x37;

//		if(_size < 2)	WriteOSDFntX(MASTER,_pos_x,_pos_y,0x00,_pg+_addr);	// _size(1: bit[3-0]) -> __pos_x_
//		else	WriteAsic1Font(MASTER,_pos_x+1-_t3_,_pos_y,0x00,_pg+_addr);	// _size(2: bit[7-0]) -> [7-4]:__pos_x_,[3-0]:__pos_x_+1
		WriteOSDFntX(_dvc,_pos_x+1-_t3_,_pos_y,0x00,_pg+_addr);	// _size(2: bit[7-0]) -> [7-4]:__pos_x_,[3-0]:__pos_x_+1
	}
	
	return	_rdat_;
}
//	*/
//==================================================================================
U8 DsplyOSDDatHexY(U8 _dvc, U8 _pos_x, U8 _pos_y, U8 _pg, U8 _addr)
{
	U8 _rdat_;
//	U8 _pg=0, _addr=0;
	U8 _t3_;
	
//	_pg = _addr>>16;
//	_addr = _addr&0xff;
	if(_pg == 0xff)	_rdat_ = _addr;
//	else if((_dvc == TW9901)||(_dvc == SAA7121))	_rdat_ = ReadI2CByte(_dvc,_addr);
//	else if(_dvc == TW9901)	_rdat_ = ReadI2CByte(_dvc,_addr);
	else	_rdat_ = ReadAsicByte(_dvc,_pg,_addr);

	for(_t3_=0;_t3_<2;_t3_++){
		_pg = _rdat_&(0x0f<<(_t3_<<2));
		_pg >>= _t3_<<2;
		if(_pg < 0x0a)	_addr = 0x10;//0x30;	
		else	_addr = 0x17;//0x37;

//		if(_size < 2)	WriteOSDFntX(MASTER,_pos_x,_pos_y,0x00,_pg+_addr);	// _size(1: bit[3-0]) -> __pos_x_
//		else	WriteAsic1Font(MASTER,_pos_x+1-_t3_,_pos_y,0x00,_pg+_addr);	// _size(2: bit[7-0]) -> [7-4]:__pos_x_,[3-0]:__pos_x_+1
		WriteOSDFntY(_dvc,_pos_x+1-_t3_,_pos_y,0x00,_pg+_addr);	// _size(2: bit[7-0]) -> [7-4]:__pos_x_,[3-0]:__pos_x_+1
	}
	
	return	_rdat_;
}
//==================================================================================
/*
U8 DsplyOSDDatBinX(U8 _dvc, U8 _pos_x, U8 _pos_y, U8 _pg, U8 _addr)
{
	U8 _rdat_;
//	U8 _pg,_addr=0;
	
//	_pg = _addr>>16;
//	_addr = _addr&0xff;
	if(_pg == 0xff)	_rdat_ = _addr;
//	else if((_dvc == TW9901)||(_dvc == SAA7121))	_rdat_ = ReadI2CByte(_dvc,_addr);
//	else if(_dvc == TW9901)	_rdat_ = ReadI2CByte(_dvc,_addr);
	else	_rdat_ = ReadAsicByte(_dvc,_pg,_addr);

	for(_pg=0;_pg<8;_pg++){
		if(BitSet(_rdat_,BIT7>>_pg))	_addr = 0x11;
		else	_addr = 0x10;
		WriteOSDFntX(_dvc,_pos_x+_pg,_pos_y,0x00,_addr);
	}
	
	return	_rdat_;
}
//==================================================================================
U8 DsplyOSDDatBinY(U8 _dvc, U8 _pos_x, U8 _pos_y, U8 _pg, U8 _addr)
{
	U8 _rdat_;
//	U8 _pg,_addr=0;
	
//	_pg = _addr>>16;
//	_addr = _addr&0xff;
	if(_pg == 0xff)	_rdat_ = _addr;
//	else if((_dvc == TW9901)||(_dvc == SAA7121))	_rdat_ = ReadI2CByte(_dvc,_addr);
//	else if(_dvc == TW9901)	_rdat_ = ReadI2CByte(_dvc,_addr);
	else	_rdat_ = ReadAsicByte(_dvc,_pg,_addr);

	for(_pg=0;_pg<8;_pg++){
		if(BitSet(_rdat_,BIT7>>_pg))	_addr = 0x11;
		else	_addr = 0x10;
		WriteOSDFntY(_dvc,_pos_x+_pg,_pos_y,0x00,_addr);
	}
	
	return	_rdat_;
}
//	*/
//==================================================================================
void	SetOSDCol(U8 _pth, U8 _col_num, U8 _y, U8 _cb, U8 _cr)
{
	WriteAsicByte(MASTER,DVC_PG2,0x0b,_y);						//... Y
	WriteAsicByte(MASTER,DVC_PG2,0x0c,_cb);						//... Cb
	WriteAsicByte(MASTER,DVC_PG2,0x0d,_cr);						//... Cr
	if(BitSet(_pth,PTH_X))
		WriteAsicByte(MASTER,DVC_PG2,0x0e,BIT7|_col_num);		//... address
	else
		WriteAsicByte(MASTER,DVC_PG2,0x0e,BIT7|BIT6|_col_num);		//... address
}
//==================================================================================
void	InitOSDCol(void)
{
	SetOSDCol(PTH_Y,OSD_COL_BLK,0x00,0x80,0x80);
	SetOSDCol(PTH_Y,OSD_COL_50WHT,0x7f,0x80,0x80);
	SetOSDCol(PTH_Y,OSD_COL_75WHT,0xc0,0x80,0x80);

	SetOSDCol(PTH_X,OSD_COL_BLK,0x00,0x80,0x80);
	SetOSDCol(PTH_X,OSD_COL_50WHT,0x7f,0x80,0x80);
	SetOSDCol(PTH_X,OSD_COL_75WHT,0xc0,0x80,0x80);
	SetOSDCol(PTH_X,OSD_COL_25WHT,0x3f,0x80,0x80);
	SetOSDCol(PTH_X,OSD_COL_100WHT,0xf0,0x80,0x80);
	SetOSDCol(PTH_X,OSD_COL_BLU,0x1d,0xff,0x6b);
	SetOSDCol(PTH_X,OSD_COL_RED,0x4c,0x54,0xff);
	SetOSDCol(PTH_X,OSD_COL_ORNG,0x95,0x4f,0xb5);
	SetOSDCol(PTH_X,OSD_COL_CYN,0xb2,0xaa,0x00);
	SetOSDCol(PTH_X,OSD_COL_MGN,0x69,0xd4,0xea);
	SetOSDCol(PTH_X,OSD_COL_GRN,0x4b,0x55,0x4a);
	SetOSDCol(PTH_X,OSD_COL_OCN,0x61,0xb5,0x3a);
	SetOSDCol(PTH_X,OSD_COL_YLW,0xe1,0x00,0x94);
}
//==================================================================================
void	SetOSDMn(void)
{
////	WriteAsicByte(MASTER,DVC_PG2,0x38,0x0f);	//... OSD overlay : inverse OSD path with OSD overlay function
//	WriteAsicByte(MASTER,DVC_PG2,0x38,0x0c);	//... overlay Y path OSD on X path		//... 060307:temporal

//	if(b_mse_stts_pth == MSE_PTH_X)
//		WriteAsicByte(MASTER,DVC_PG2,0x38,0x09);	//... overlay Y path OSD on X path with high priority than X path
//	else
//		WriteAsicByte(MASTER,DVC_PG2,0x38,0x06);	//... overlay X path OSD on Y path with low priority than Y path
	WriteOSDClrX(MASTER,0,0,45,31);						//... max line num is 310 line for OSD
#if	defined(__4CH__)
	if(wndw_ds_sc_fmt == SC_FMT_8CH)
		WriteOSDClrY(MASTER,WNDW_DS_SC_CNT_X,WNDW_DS_SC_CNT_Y,11,1);
#endif

	WriteAsicByte(MASTER,DVC_PG2,0x38,0x09);	//... overlay Y path OSD on X path with high priority than X path
}
//==================================================================================
void	SetOSDNoMn(void)
{
	if(wndw_ds_sc_fmt == SC_FMT_4CH){
//		WriteAsicByte(MASTER,DVC_PG2,0x38,0x00);	//... OSD overlay : default
		WriteAsicByte(MASTER,DVC_PG2,0x38,0x08);	//... overlay Y path OSD on X path with high priority than X path
		GetAsicFlgType(MASTER,DVC_PG1,0x7c,0x0f);	//... user must read 0x7c to release IRQ line.	***********************
	}
#if	defined(__4CH__)
	else if(wndw_ds_sc_fmt == SC_FMT_8CH){
		Run8ChOSDRto();
	}
#endif
}
//==================================================================================

⌨️ 快捷键说明

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