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

📄 82c55.cpp

📁 其于ARM的USB操作,控制芯片为CH375实现操作.以及其他功能.包括AC,串口操作.
💻 CPP
字号:
#include "82c55.h"
extern OS_EVENT *UART0_SEM ;		//UART 0信号量

#include "..\..\src\armdigitinconfig.h"
#include "..\..\src\armdigitoutconfig.h"

/********************************************************
//功能描述:82C55构造函数
//函数入口:无
//函数出口:无
//操    作:设置打开状态
//版	本:V1.0
//作	者:周登勇
//时	间:2004.10.22
*********************************************************/

C82c55::C82c55()
{
	bOpen = FALSE;
	bRun = FALSE;
	bCharged = TRUE;
}

/********************************************************
//功能描述:82C55析构函数
//函数入口:无
//函数出口:无
//操    作:无
//版	本:V1.0
//作	者:周登勇
//时	间:2004.10.22
*********************************************************/

C82c55::~C82c55()
{
	bOpen=FALSE;
}

/********************************************************
//功能描述:82c55初始化
//函数入口:model=工作模式
//函数出口:操作成功返回TRUE,操作失败返回FALSE
//操    作:初始化并行口
//注	意:调用此函数前必须初始化82C55首地址
//版	本:V1.00
//作	者:周登勇
//时	间:2004.10.22
//
//	d7	d6	d5	d4	d3	d2	d1	d0	  |B组
//	|	|	|	|	|	|	|	|_____|C下端口:1=输入,0=输出
//	|	|___|	|	|	|	|_________|B端口:1=输入,0\输出
//	|	  |		|	|	|_____________|方式:0=方式0,1=方式1
//	|	  |		|	|
//	|	  |		|	|				  |A组
//	|	  |		|	|_________________|C上端口:1=输入,0=输出
//	|	  |		|_____________________|A端口:1=输入,0\输出
//	|	  |___________________________|方式:00=方式0,01=方式1,1X=方式2
//	|_________________________________|置方式标志1有效,0操作C口位
//
*********************************************************/

BOOL C82c55::InitPort( )
{

	switch( Model )
	{
	//IO输入
	case MODEL_ALL_IN:
		*PortCtrl = 0x9b; // 1001 1011;
		break;
	case MODEL_ALL_OUT:
		*PortCtrl = 0x80; // 1000 0000
		break;
	case MODEL_A_IN_BC_OUT:
		*PortCtrl = 0x90; // 1001 0000
		break;
	case MODEL_AB_IN_C_OUT:
		*PortCtrl = 0x92; // 1001 0010
		break;
	case MODEL_AC_IN_B_OUT:
		*PortCtrl = 0x99; // 1001 1001
		break;
	case MODEL_B_IN_AC_OUT:
		*PortCtrl = 0x82; // 1000 0010
		break;
	case MODEL_BC_IN_A_OUT:
		*PortCtrl = 0x8b; // 1000 1011
		break;
	case MODEL_C_IN_AB_OUT:
		*PortCtrl = 0x89; // 1000 1001
		break;
	case MODEL_AB_OUT_CIO:
		*PortCtrl = 0x81; // 1000 0001
		break;
	case MODEL_AB_OUT_COI:
		*PortCtrl = 0x88; // 1000 1000
		break;
	case MODEL_A_O_B_I_CIO:
		*PortCtrl = 0x83; // 1000 0011
		break;
	case MODEL_A_O_B_I_COI:
		*PortCtrl = 0x8a; // 1000 1010
		break;
	case MODEL_A_I_B_O_CIO:
		*PortCtrl = 0x91; // 1001 0001
		break;
	case MODEL_A_I_B_O_COI:
		*PortCtrl = 0x98; // 1001 1000
		break;
	case MODEL_AB_IN_CIO:
		*PortCtrl = 0x93;// 1001 0011
		break;
	case MODEL_AB_IN_COI:
		*PortCtrl = 0x9a; // 1001 1010
		break;
		//选通
	case MODEL_ACS_I_B_O:
		*PortCtrl = 0xb0;// 1011 0000
		break;
	case MODEL_ACS_I_B_I:
		*PortCtrl = 0xb2;// 1011 0010
		break;
	case MODEL_ACS_O_B_O:
		*PortCtrl = 0xa0;// 1010 0000
		break;
	case MODEL_ACS_O_B_I:
		*PortCtrl = 0xa2;// 1010 0010
		break;

	case MODEL_BCS_I_A_O:
		*PortCtrl = 0x86;// 1000 0110
		break;
	case MODEL_BCS_I_A_I:
		*PortCtrl = 0x96;// 1001 01I0
		break;
	case MODEL_BCS_O_A_O:
		*PortCtrl = 0x84;// 1000 0100
		break;
	case MODEL_BCS_O_A_I:
		*PortCtrl = 0x94;// 1001 0100
		break;

	case MODEL_CS_A_IN_B_OUT:
		*PortCtrl = 0xb4;// 1011 0100
		break;
	case MODEL_CS_AB_IN:
		*PortCtrl = 0xb6;// 1011 0110
		break;
	case MODEL_CS_B_IN_A_OUT:
		*PortCtrl = 0xa6;// 1010 0110
		break;
	case MODEL_CS_AB_OUT:
		*PortCtrl = 0xa4;// 1010 0100
		break;
		//总线
	case MODEL_A_BUS_B_O:
		*PortCtrl = 0xe0;// 1110 0000
		break;
	case MODEL_A_BUS_B_I:
		*PortCtrl = 0xe2;// 1110 0010
		break;
	case MODEL_A_BUS_B_CS_O:
		*PortCtrl = 0xe4;// 1110 0100
		break;
	case MODEL_A_BUS_B_CS_I:
		*PortCtrl = 0xe6;// 1110 0110
		break;

	default:
		return FALSE;
		break;
	}
	return TRUE;
}

/********************************************************
//功能描述:打开并行口
//函数入口:model=并行口工作方式
//函数出口:操作成功返回TRUE,操作失败返回FALSE
//操    作:初始化并行口,并设置并行口打开标志
//版	本:V1.00
//作	者:周登勇
//时	间:2004.10.22
*********************************************************/

BOOL C82c55::OpenPort( )
{
	//Address = add;
	PortA = ( U8* )(Address+0);
	PortB = ( U8* )(Address+1);
	PortC = ( U8* )(Address+2);
	PortCtrl = ( U8* )(Address+3);
	
	if( bOpen )
	{
		return FALSE;
	}
	bOpen = TRUE;
	InitPort( );
	//初始化中断
	switch( pTcb->IntSel )
	{
	case 0:
		break;
	case 1:
		break;
	case 2:
		break;
	default:
		break;
	}
	SetPortDat( PORT_B, 0X84 );
	return TRUE;
}

/********************************************************
//功能描述:打开并行口
//函数入口:model=并行口工作方式
//函数出口:操作成功返回TRUE,操作失败返回FALSE
//操    作:初始化并行口,并设置并行口打开标志
//版	本:V1.00
//作	者:周登勇
//时	间:2004.10.22
*********************************************************/

BOOL C82c55::ClosePort( )
{
	Model = MODEL_ALL_IN;
	InitPort( );
	if( bOpen )
	{
		bOpen = FALSE;
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

/********************************************************
//功能描述:设置端口数据
//函数入口:dat=要设置的数据,port=端口
//函数出口:操作成功返回TRUE,操作失败返回FALSE
//操    作:向指定端口输出数据
//版	本:V1.00
//作	者:周登勇
//时	间:2004.10.22
*********************************************************/

BOOL C82c55::SetPortDat( U32 port , U8 dat )
{
	if( !bOpen )
	{
		return FALSE;
	}
	switch(port)
	{
	case PORT_A:
		*PortA=dat;
		Data1=dat;
		break;
	case PORT_B:
		*PortB=dat;
		Data2=dat;
		break;
	case PORT_C:
		*PortC=dat;
		Data3=dat;
		break;
	default:
		return FALSE;
		break;
	}
	return TRUE;
}

/********************************************************
//功能描述:读取端口数据
//函数入口:dat=读出的数据,port=端口
//函数出口:操作成功返回TRUE,操作失败返回FALSE
//操    作:从指定端口输入数据
//版	本:V1.00
//作	者:周登勇
//时	间:2004.10.22
*********************************************************/

BOOL C82c55::GetPortDat( U32 port , U8 &dat)
{
	if( !bOpen )
	{
		return FALSE;
	}
	switch(port)
	{
	case PORT_A:
		dat=~(*PortA);
		break;
	case PORT_B:
		dat=~(*PortB);
		break;
	case PORT_C:
		dat=~(*PortC);
		break;
	default:
		return FALSE;
		break;
	}
	return TRUE;
}

/********************************************************
//功能描述:设置端口位为高
//函数入口:numb=端口位数,port=端口
//函数出口:操作成功返回TRUE,操作失败返回FALSE
//操    作:从指定端口输入数据
//版	本:V1.00
//作	者:周登勇
//时	间:2004.10.23
*********************************************************/

BOOL C82c55::SetPortBitH( U32 port , U32 numb )
{
	if( !bOpen )
	{
		return FALSE;
	}
	
	if( numb >= 8 )
	{
		return FALSE;
	}
	
	switch( port )
	{
	case PORT_A:
		Data1 |= ( 1<<numb );
		*PortA = Data1;
		break;
	case PORT_B:
		Data2 |= ( 1 << numb );
		*PortB = Data2;
		break;
	case PORT_C:
		Data3 |= ( 1 << numb );
		*PortC = Data3;
		break;
	default:
		return FALSE;
		break;
	}
	
	return TRUE;
}

/********************************************************
//功能描述:设置端口位为高
//函数入口:numb=端口位数,port=端口
//函数出口:操作成功返回TRUE,操作失败返回FALSE
//操    作:从指定端口输入数据
//版	本:V1.00
//作	者:周登勇
//时	间:2004.10.23
*********************************************************/

BOOL C82c55::SetPortBitL( U32 port , U32 numb )
{
	if( !bOpen )
	{
		return FALSE;
	}
	
	if( numb >= 8 )
	{
		return FALSE;
	}
	
	switch( port )
	{
	case PORT_A:
		Data1 &= ~( 1 << numb );
		*PortA = Data1;
		break;
	case PORT_B:
		Data2 &= ~( 1 << numb );
		*PortB = Data2;
		break;
	case PORT_C:
		Data3 &= ~( 1 << numb );
		*PortC = Data3;
		break;
	default:
		return FALSE;
		break;
	}
	
	return TRUE;
}

/********************************************************
//功能描述:得到指定端口指定位的状态
//函数入口:numb=端口位数,port=端口,bit为返回状态
//函数出口:操作成功返回TRUE,操作失败返回FALSE
//操    作:读取端口状态
//版	本:V1.00
//作	者:周登勇
//时	间:2004.10.23
*********************************************************/
BOOL C82c55::GetPortBit( U32 port , U32 numb ,BOOL& bit )
{
	if( !bOpen )
	{
		return FALSE;
	}
	
	if( numb >= 8 )
	{
		return FALSE;
	}
	
	volatile U8 temp;
	
	switch( port )
	{
	case PORT_A:
		temp = *PortA;
		Data1 &= ~( 1 << numb);
		Data1 |= temp & ( 1 << numb );
		if( temp & ( 1 << numb ))
		{
			bit = TRUE;
		}
		else
		{
			bit = FALSE;
		}
		break;
	case PORT_B:
		temp = *PortB;
		Data2 &= ~( 1 << numb);
		Data2 |= temp & ( 1 << numb );
		if( temp & ( 1 << numb ))
		{
			bit = TRUE;
		}
		else
		{
			bit = FALSE;
		}
		break;
	case PORT_C:
		temp = *PortC;
		Data3 &= ~( 1 << numb);
		Data3 |= temp & ( 1 << numb );
		if( temp & ( 1 << numb ))
		{
			bit = TRUE;
		}
		else
		{
			bit = FALSE;
		}
		break;
	default:
		return FALSE;
		break;
	}
	
	return TRUE;
}

void C82c55::Run( void* Id )
{
	Id=Id;
}

void C82c55::Init( CArmTree* tree )
{
	CArmCtrl* p;
	p = tree->GetCtrl();
	if( p != NULL )
	{
		if( p->GetType() == CTRL_HARD_PANL_IN )
		{
			CArmDigitInConfig* pconfig;
			pconfig = (CArmDigitInConfig*)p->GetHead();
			pTcb = pconfig->GetTcb();
			pIn = pconfig->GetData();
			Address = pTcb->iAddress;
			Model = MODEL_AC_IN_B_OUT;
		}
		else
		{
			CArmDigitOutConfig* pconfig;
			pconfig = (CArmDigitOutConfig*)p->GetHead();
			pTcb = pconfig->GetTcb();
			Address = pTcb->iAddress;
			Model = MODEL_B_IN_AC_OUT;
		}
	}
}

void C82c55::SetTree( CArmTree* tree )
{
	CArmTree* p;
	p = tree->Find( NODE_STATE );
	if( p != NULL )
	{
		CArmCtrl* pCtrl;
		pCtrl = p->GetCtrl();
		if( pCtrl != NULL )
		{
			if( (pCtrl->GetCount() != 0)&&(pCtrl->GetType() == CTRL_STATE) )
			{
				pStateList = ( CArmStateList* )pCtrl->GetHead();
			}
		}
	}
}

void C82c55::Server()
{
	U8 temp;
	GetPortDat( PORT_A, temp );
	if( temp ^ Data1 )
	{
		Data1 = temp;
		bCharged = TRUE;
	}
	GetPortDat( PORT_C, temp );
	if( temp ^ Data3 )
	{
		Data3 = temp;
		bCharged = TRUE;
	}
}

void C82c55::FillData()
{
	U32 i;
	U8 temp;
	temp = 1;
	pStateList->Enter();
	for( i=0; i<8; i++ )
	{
		if( Data1 & temp )
		{
			(*pStateList)[(*pIn)[i]]->SetData( TRUE );
		}
		else
		{
			(*pStateList)[(*pIn)[i]]->SetData( FALSE );
		}
		temp <<= 1;
	}
	temp = 1;
	for( i=0; i<8; i++ )
	{
		if( Data3 & temp )
		{
			(*pStateList)[(*pIn)[i+8]]->SetData( TRUE );
		}
		else
		{
			(*pStateList)[(*pIn)[i+8]]->SetData( FALSE );
		}
		temp <<= 1;
	}
	pStateList->Leave();
}

/********************************************************
//功能描述:返回中断号
//函数入口:无
//函数出口:中断号
//操    作:返回中断号
//版	本:V1.00
//作	者:周登勇
//时	间:2005.03.01 08:01
*********************************************************/
U32 C82c55::GetIntNumb()
{
	return pTcb->IntSel;
}

/********************************************************
//功能描述:复位检测CPU
//函数入口:无
//函数出口:无
//操    作:复位检测CPU
//版	本:V1.00
//作	者:周登勇
//时	间:2005.03.02 09:35
*********************************************************/
void C82c55::ResetCpu( BOOL flag )
{
	if( flag )
	{
		SetPortBitH( PORT_B, IN_CPU_RESET_BIT );
	}
	else
	{
		SetPortBitL( PORT_B, IN_CPU_RESET_BIT );
	}
}

/********************************************************
//功能描述:设置运行指示状态
//函数入口:无
//函数出口:无
//操    作:设置运行指示状态
//版	本:V1.00
//作	者:周登勇
//时	间:2005.03.02 09:40
*********************************************************/
void C82c55::SetRun()
{
	if( bRun )
	{
		bRun = FALSE;
		SetPortBitH( PORT_B, IN_RUN_BIT );
	}
	else
	{
		bRun = TRUE;
		SetPortBitL( PORT_B, IN_RUN_BIT );
	}
}

⌨️ 快捷键说明

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