📄 82c55.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 + -