mse.c

来自「TECHWELL 之tw2835 四画面合一之驱动代码,CCIR656输出,KE」· C语言 代码 · 共 624 行 · 第 1/2 页

C
624
字号
#include "hdr.h"

//==================================================================================
//						Mouse definition & variable description
//==================================================================================

U8 bdata	mse_flg = 0x0c;
sbit b_mse_btn_l = mse_flg^0;				//... don't change bit position because it should be same as LEFT_BTN
sbit b_mse_btn_r = mse_flg^1;				//... don't change bit position because it should be same as RIGHT_BTN
sbit b_mse_rlse_lb = mse_flg^2;
sbit b_mse_rlse_rb = mse_flg^3;
sbit b_mse_pshd_lb = mse_flg^4;
sbit b_mse_pshd_rb = mse_flg^5;
sbit b_mse_pshng_lb = mse_flg^6;
sbit b_mse_pshng_rb = mse_flg^7;

U8 bdata	mse_flg_app = 0x00;
sbit b_mse_btn_dwn_lb = mse_flg_app^0;
sbit b_mse_btn_dwn_rb = mse_flg_app^1;
sbit b_mse_clk_lb = mse_flg_app^2;
sbit b_mse_clk_rb = mse_flg_app^3;
sbit b_mse_pshng_clk_lb = mse_flg_app^4;
sbit b_mse_pshng_clk_rb = mse_flg_app^5;
sbit b_mse_no_btn = mse_flg_app^6;
sbit b_mse_no_mvng = mse_flg_app^7;

U8 bdata	mse_flg_init = 0x00;
sbit b_mse_rd_done = mse_flg_init^0;
sbit b_mse_scl_bnd_only = mse_flg_init^1;
sbit b_mse_init_scrl = mse_flg_init^2;
sbit b_mse_init_zm = mse_flg_init^3;
sbit b_mse_init_scl = mse_flg_init^4;
sbit b_mse_init_drg = mse_flg_init^5;

U8 bdata	mse_flg_stts = 0x00;
sbit b_mse_stts_pth = mse_flg_stts^0;
sbit b_mse_stts_pth_pop = mse_flg_stts^1;
sbit b_mse_stts_pth_mn = mse_flg_stts^2;
sbit b_mse_stts_free = mse_flg_stts^3;
sbit b_mse_stts_crsr = mse_flg_stts^4;
sbit b_mse_tmp_l = mse_flg_stts^5;
sbit b_mse_tmp_r = mse_flg_stts^6;


U16	mse_flg_on_osd = 0x00;

U8	mse_rdata[4];// = 0;
//... mse_rdata[3]->[31:24],mse_rdata[2]->[23:16],mse_rdata[1]->[15:8],mse_rdata[0]->[7:0]
U8	mse_cnt_clk;

U8	mse_ch;

U8	mse_osd_x=45;//50;//
U8	mse_osd_y=56;//28;//30;//
U8	mse_osd_x_sub=45;//50;//
U8	mse_osd_y_sub=56;//30;//

U8	mse_btn_pshng_cnt = 0;


//==================================================================================
//						Mouse function description
//==================================================================================
void WriteMse(U8 _wdat)
{	//... User have to change data line during clock is low.
	U16 _dly_;

	EX0 = 0;
//---------------------------------	
	//... Mouse start condition
//	DLY_FOR(10);							//... w78e516 at 40MHz
	DLY_FOR(100);							//... w77e516 at 40MHz
	MSE_CLK = 0;
//	DLY_FOR(100);							//... w78e516 at 40MHz
	DLY_FOR(1000);							//... w77e516 at 40MHz
	MSE_DAT = 0;
//	DLY_FOR(50);							//... w78e516 at 40MHz
	DLY_FOR(500);							//... w77e516 at 40MHz
	MSE_CLK = 1;
////	DLY_FOR(10);							//... w78e516 at 40MHz
//	DLY_FOR(100);							//... w77e516 at 40MHz		//... 林籍 混府搁 漂沥 付快胶(SWW-23) 悼累 救窃.
//... start condition 捞饶 mouse肺何磐 坷绰 霉 clock edge鳖瘤狼 timing捞 付快胶付促 促弗淀 窃.
//---------------------------------

	mse_cnt_clk = 0;
	mse_rdata[0] = _wdat;
	mse_rdata[1] = 0x00;
	mse_rdata[2] = 0x00;
	mse_rdata[3] = 0x00;
	
	EX0 = 1;
}
//==================================================================================
/*
U8 ReadMse(U8 packet_num)
{	//... Data is changed during clock is high, so data must be latched on clock falling edge.
	U8	i, parity=0, rdata=0;

	for(i=0;i<11;i++)
	{
		while(MOUSE_CLK == 0);
		if((packet_num != 3)||(i != 10))
			while(MOUSE_CLK == 1);
			
		if((i>0)&&(i<9))
		{		
			if(MOUSE_DATA == 1)
			{
				rdata |= BIT7;		// LSB first
				parity++;
			}
			if(i < 8)	
				rdata >>= 1;
		}
	}

	return rdata;
}
//	*/
//==================================================================================
/*
void ReadMseMove(void)
{
	U8 i;
	
	for(i=0;i<4;i++)
	{
		mse_a4_rdata[i] = ReadMse(i);
		if(mse_a4_rdata[0] != 0xfa)
			break;
	}
}
//	*/
//==================================================================================
void InitMse(void)
{
//	U8 buff;
	
	WriteMse(0xff);			//... Mouse reset
	/*
	WriteMse(0xe8);			//... set resolution	
	buff = ReadMse(0);
	if(buff == 0xfa)
		WriteMse(0x00);		//... resolution -> 0
		//	*/
}
//==================================================================================
void SetMseCrsr(U8 _tgl_crsr)
{
	U8 _t1_=ReadAsicByte(MASTER,DVC_PG2,0x10);

	if(_tgl_crsr == CRSR_BIG)	SetBit(_t1_,BIT5);
	else	ClearBit(_t1_,BIT5);
	WriteAsicByte(MASTER,DVC_PG2,0x10,_t1_);
}
//==================================================================================
void SetMseLyr(U8 _tgl_lyr)
{
	U8 _t1_=ReadAsicByte(MASTER,DVC_PG2,0x10);

	if(_tgl_lyr == ON)	SetBit(_t1_,BIT4);
	else	ClearBit(_t1_,BIT4);
	WriteAsicByte(MASTER,DVC_PG2,0x10,_t1_);
}
//==================================================================================
void SetMsePtrX(U16 _pos_x)
{
	U8 _t1_=ReadAsicByte(MASTER,DVC_PG2,0x10);

	IfBitSet(_pos_x, BIT0)	SetBit(_t1_,BIT1);
	else	ClearBit(_t1_,BIT1);
	WriteAsicByte(MASTER,DVC_PG2,0x10,_t1_);
	WriteAsicByte(MASTER,DVC_PG2,0x11,(U8)(_pos_x>>1));
}
//==================================================================================
void SetMsePtrY(U16 _pos_y)
{
	U8 _t1_=ReadAsicByte(MASTER,DVC_PG2,0x10);

	IfBitSet(_pos_y, BIT0)	SetBit(_t1_,BIT0);
	else	ClearBit(_t1_,BIT0);
	WriteAsicByte(MASTER,DVC_PG2,0x10,_t1_);
	WriteAsicByte(MASTER,DVC_PG2,0x12,(U8)(_pos_y>>1));
}
//==================================================================================
void SetMsePtr(U16 _pos_x, U16 _pos_y)			//... set mouse pointer
{
	SetMsePtrX(_pos_x);
	SetMsePtrY(_pos_y);
}
//==================================================================================
/*
void DsplyMsePtr(U8 _pth)							//... display mouse pointer
{
	U8 _t1_=ReadAsicByte(MASTER,DVC_PG2,0x10);

	_t1_ &= 0x3f;
	IfBitSet(_pth,PTH_X)	_t1_ |= BIT7;
	IfBitSet(_pth,PTH_Y)	_t1_ |= BIT6;
	WriteAsicByte(MASTER,DVC_PG2,0x10,_t1_);
}
//	*/
//==================================================================================
//*
U8	GetMseCh(U8 _pos_x, U8 _pos_y)
{
	U8	_pop_en_ch_flg_=0, _pnt_on_ch_flg_=0, _ch_fltr_;

	U8 _pic_sz_[4];
	U8 _ch_, _bnd_=0;
//	U8 t_dvc, t_ch;
	U8 _t1_, _t2_;

	for(_ch_=0;_ch_<cmn_max_ch;_ch_++){		// point啊 困俊 乐绰 ch苞 popup捞 汲沥等 ch阑 scanning.
//		SetCrntDvcCh(_ch_,&t_dvc,&t_ch);
//		_t1_ = ReadAsicByte(t_dvc,DVC_PG1,0x10+(t_ch<<3));
		if(_ch_ < 4){

			_t1_ = ReadAsicByte(MASTER,DVC_PG1,0x10+(_ch_<<3));
			if(BitSet(_t1_,BIT6))	SetBit(_pop_en_ch_flg_,BIT0<<_ch_);
	
//			for(_t1_=0;_t1_<4;_t1_++)	_pic_sz_[_t1_] = ReadAsicByte(t_dvc,DVC_PG1,REG_PICHL+(t_ch<<2)+_t1_);
			for(_t1_=0;_t1_<4;_t1_++)	_pic_sz_[_t1_] = ReadAsicByte(MASTER,DVC_PG1,0x30+(_ch_<<2)+_t1_);
		}
		else{
			_t2_ = _ch_&0x03;
			_t1_ = ReadAsicByte(MASTER,DVC_PG1,0x13+(_t2_<<3));
			if(BitSet(_t1_,BIT6))	SetBit(_pop_en_ch_flg_,BIT0<<_ch_);
	
//			for(_t1_=0;_t1_<4;_t1_++)	_pic_sz_[_t1_] = ReadAsicByte(t_dvc,DVC_PG1,REG_PICHL+(t_ch<<2)+_t1_);
			for(_t1_=0;_t1_<4;_t1_++)	_pic_sz_[_t1_] = ReadAsicByte(MASTER,DVC_PG1,0x40+(_t2_<<2)+_t1_);
		}
		
		if((_pos_x>=_pic_sz_[0])&&(_pos_x<=_pic_sz_[1])&&(_pos_y>=_pic_sz_[2])&&(_pos_y<=_pic_sz_[3]))
			SetBit(_pnt_on_ch_flg_,BIT0<<_ch_);
	}
	
	if(_pnt_on_ch_flg_ == 0)	_ch_ = 0xff;//return 0x0f;
	else{
		_ch_fltr_ = _pnt_on_ch_flg_ & _pop_en_ch_flg_;
		if(_ch_fltr_ == 0){	// point 啊 困俊 乐绰 _ch_ 吝 popup捞 汲沥等 ch捞 绝绰 版快.
			for(_ch_=0;_ch_<cmn_max_ch;_ch_++){
				if(BitSet(_pnt_on_ch_flg_,BIT0<<_ch_))	break;//return _ch_;
			}
		}
		else{
			for(_ch_=0;_ch_<cmn_max_ch;_ch_++){	// _ch_fltr_ != 0 牢 版快, priority啊 臭篮 ch阑 惶酒晨.
				if(BitSet(_ch_fltr_,BIT0<<_ch_))	break;//return _ch_;
			}
		}
	}

//	if(b_mode_ch == _4CH){			//... for drag & scale
		if(b_mse_rlse_lb == 1){
//		if(BitSet(mse_flg,MSE_RLSE_LB)){//b_mse_release_lb == 1){
			if(_ch_ != (mse_ch&0x0f))	ClearBit(_bnd_,0xf0);
			else	_bnd_ = mse_ch&0xf0;
			if(_ch_ != 0xff){
//				SetCrntDvcCh(_ch_,&t_dvc,&t_ch);
//				for(_t1_=0;_t1_<4;_t1_++)	_pic_sz_[_t1_] = ReadAsicByte(t_dvc,DVC_PG1,REG_PICHL+(t_ch<<2)+_t1_);
				if(_ch_ < 4){
					for(_t1_=0;_t1_<4;_t1_++)
						_pic_sz_[_t1_] = ReadAsicByte(MASTER,DVC_PG1,0x30+(_ch_<<2)+_t1_);
				}
				else{
					_t2_ = _ch_&0x03;
					for(_t1_=0;_t1_<4;_t1_++)
						_pic_sz_[_t1_] = ReadAsicByte(MASTER,DVC_PG1,0x40+(_t2_<<2)+_t1_);
				}

				if(((_pos_x >= _pic_sz_[0])&&(_pos_x <= (_pic_sz_[0]+1)))||
					((_pos_x >= (_pic_sz_[1]-1))&&(_pos_x <= _pic_sz_[1]))||
					((_pos_y >= _pic_sz_[2])&&(_pos_y <= (_pic_sz_[2]+1)))||
					((_pos_y >= (_pic_sz_[3]-1))&&(_pos_y <= _pic_sz_[3]))){
						if(b_mse_stts_crsr == CRSR_BIG){
							b_mse_stts_crsr = CRSR_SML;
							SetMseCrsr(CRSR_SML);		// small mouse pointer
						}
//						if(BitSet(mse_flg,MSE_STTS_CRSR)){//b_mse_status_cur == BIG){
//							ClearBit(mse_flg,MSE_STTS_CRSR);
//							SetMseCrsr(CRSR_SML);		// small mouse pointer
//						}

					if((_pos_x == _pic_sz_[0])||(_pos_x == (_pic_sz_[0]+1)))
						SetBit(_bnd_,BIT7);
					else	ClearBit(_bnd_,BIT7);		//... Left		x
					if((_pos_x >= (_pic_sz_[1]-1))&&(_pos_x <= (_pic_sz_[1]+1)))
						SetBit(_bnd_,BIT6);
					else	ClearBit(_bnd_,BIT6);		//... Right		o
					if((_pos_y == _pic_sz_[2]) || (_pos_y == (_pic_sz_[2]+1)))
						SetBit(_bnd_,BIT5);
					else	ClearBit(_bnd_,BIT5);		//... Top		x
					if((_pos_y >= (_pic_sz_[3]-1))&&(_pos_y <= (_pic_sz_[3]+1)))
						SetBit(_bnd_,BIT4);
					else	ClearBit(_bnd_,BIT4);		//... Bottom	o

					if((_bnd_==0x50)||(_bnd_==0x60)||(_bnd_==0x90)||	(_bnd_==0xa0))
						SetMseLyr(OFF);
					else
						SetMseLyr(ON);
				}
				else{
					if(b_mse_stts_crsr == CRSR_SML){
						b_mse_stts_crsr = CRSR_BIG;
//					if(BitClear(mse_flg,MSE_STTS_CRSR)){//b_mse_status_cur == BIG){
//						SetBit(mse_flg,MSE_STTS_CRSR);

						SetMseCrsr(CRSR_BIG);		// small mouse pointer
						SetMseLyr(ON);
						ClearBit(_bnd_,0xf0);
					}
				}

⌨️ 快捷键说明

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