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 + -
显示快捷键?