parportmodedlg.cpp

来自「可以用于各种并口方式(SPP,EPP,ECP)的读写测试。」· C++ 代码 · 共 973 行 · 第 1/2 页

CPP
973
字号
{
	short x;
	CString    str;

	// Retrieve Data from EPP Adress(0x00) at External Device
	EppAddrWriteByteToPort(0);

	Sleep(5);
    
	if (!CheckStatusBusyBit()) {
		AfxMessageBox(" Busy Bit.....On !!!");
	    return;
	}

    x = (inp32)(EPP_ADDR);
	TRACE("Epp_Read ........   %x  \n",  x);

    if(!CheckStatusTimeOutBit()) {
		AfxMessageBox(" TimeOutBit.....On !!!");	
        return;
	}

	str.Format("%02X", x); 			
    m_Static_EppRead.SetWindowText(str);   

}

///////////////////////////////////////
//
//    ECP Mode 
//
//////////////////////////////////////

void CParPortModeDlg::OnRadioEcp() 
{
	short x;

	 //  Change ECR Content to PS2 Mode    
	 x=0x20;  
     (oup32)(ECR_ADDR, x);

	 //  Initialize Control Port for ECP
	 //  nSelect_In,  Init,  nAutoFeed,  nStrobe
	 x=0x04;              
     (oup32)(CTRL_ADDR, x);

	 //  ECP Mode  
	 x=0x60; 
     (oup32)(ECR_ADDR, x);

	 EnableModeReadWriteBttn(NOT_SELECT);
	 EnableModeReadWriteBttn(ECP_MODE);
}


void CParPortModeDlg::OnButtonEcpRead() 
{
	short  x;
    CString  str;

	 //  PS2 Mode  
	 x=0x20;  
     (oup32)(ECR_ADDR,x);

     ///////////////////////
	 // C1   1->0
	 x=0x02;         // 00 0010    //  nSelect_In,  Init,  HostAck,  HostClk
     (oup32)(CTRL_ADDR,x);
     	 
	 //  ECP Mode    
	 x=0x60;  
     (oup32)(ECR_ADDR, x);

	 Sleep(5);

	 if (!CheckEcpMode_PeriphClkBit()) {
		 AfxMessageBox(" PeriphBit.....On !!!");
	    return;
	 }

	 //  PS2 Mode    
	 x=0x20;  
     (oup32)(ECR_ADDR, x);

	 x=0x24;         // 10 0100 
     (oup32)(CTRL_ADDR,x);

	 //  ECP Mode  
	 x=0x60;  
     (oup32)(ECR_ADDR,x);

	 x = (inp32)(ECP_DATA);
	 TRACE( "CTRL_ADDR 1........%x    \n", x);
	 str.Format("%02X", x); 			
     m_Static_EcpRead.SetWindowText(str);   

     //  PS2 Mode 
	 x=0x20;  
     (oup32)(ECR_ADDR,x);

     ///////////////////////
	 x=0x04;                 //  nSelect_In,  Init,  nAutoFeed,  nStrobe
     (oup32)(CTRL_ADDR, x);

	 //  ECP Mode  
	 x=0x60; 
     (oup32)(ECR_ADDR, x);

	 TRACE("Init_LptControlPort() .......Ecp  Called  \n");

}

//////////////////

void CParPortModeDlg::EnableBttn(BOOL status) 
{
	GetDlgItem(IDC_RADIO_SPP)->EnableWindow(status);
	GetDlgItem(IDC_RADIO_EPP)->EnableWindow(status);
	GetDlgItem(IDC_RADIO_ECP)->EnableWindow(status);
    GetDlgItem(IDC_BUTTON_CTRLPORT)->EnableWindow(status);
	GetDlgItem(IDC_BUTTON_STATUSPORT)->EnableWindow(status);
			
	if (status) {
	   GetDlgItem(IDC_BUTTON_OPEN_LIB)->EnableWindow(FALSE);
	   GetDlgItem(IDC_BUTTON_CLOSE_LIB)->EnableWindow(status);
       GetDlgItem(IDOK)->EnableWindow(FALSE);	   
	}
	else {
       GetDlgItem(IDC_BUTTON_OPEN_LIB)->EnableWindow(TRUE);
	   GetDlgItem(IDC_BUTTON_CLOSE_LIB)->EnableWindow(status);
	   GetDlgItem(IDOK)->EnableWindow(TRUE);
	}	
}

void CParPortModeDlg::EnableModeReadWriteBttn(int iMode) 
{
	switch (iMode) {
	case SPP_MODE:
        GetDlgItem(IDC_BUTTON_SPPWRITE)->EnableWindow(TRUE);
	    GetDlgItem(IDC_BUTTON_NIBBLEREAD)->EnableWindow(TRUE);
	    GetDlgItem(IDC_BUTTON_BYTEREAD)->EnableWindow(TRUE);
		break;
    case EPP_MODE:
        GetDlgItem(IDC_BUTTON_EPPWRITE)->EnableWindow(TRUE);
	    GetDlgItem(IDC_BUTTON_EPPREAD)->EnableWindow(TRUE);
		break;
	case ECP_MODE:
        GetDlgItem(IDC_BUTTON_ECPWRITE)->EnableWindow(TRUE);
	    GetDlgItem(IDC_BUTTON_ECPREAD)->EnableWindow(TRUE);
		break;
	case NOT_SELECT:
		GetDlgItem(IDC_BUTTON_SPPWRITE)->EnableWindow(FALSE);
	    GetDlgItem(IDC_BUTTON_NIBBLEREAD)->EnableWindow(FALSE);
	    GetDlgItem(IDC_BUTTON_BYTEREAD)->EnableWindow(FALSE);
        GetDlgItem(IDC_BUTTON_EPPWRITE)->EnableWindow(FALSE);
	    GetDlgItem(IDC_BUTTON_EPPREAD)->EnableWindow(FALSE);
        GetDlgItem(IDC_BUTTON_ECPWRITE)->EnableWindow(FALSE);
	    GetDlgItem(IDC_BUTTON_ECPREAD)->EnableWindow(FALSE);
		break;
	}		
}

void CParPortModeDlg::OnButtonCtrlport() 
{
	CString  str;
	short  bi;
    int  i;
    BYTE      bCtrl, bData;

    bi = (inp32)(CTRL_ADDR);

	//////////////////
    bCtrl = (BYTE)bi;

	for (i=0; i < 6; i++) {	   
	   bData = bCtrl & 0x01;
	   str.Format("%01X",  bData);

	   switch (i) {
	   case 0: m_Static_Ctrl0.SetWindowText(str); break;
       case 1: m_Static_Ctrl1.SetWindowText(str); break;
	   case 2: m_Static_Ctrl2.SetWindowText(str); break;
	   case 3: m_Static_Ctrl3.SetWindowText(str); break;
	   case 4: m_Static_Ctrl4.SetWindowText(str); break;
	   case 5: m_Static_Ctrl5.SetWindowText(str); break;
	   }

	   bCtrl = bCtrl >> 1;
	}	
}

void CParPortModeDlg::OnButtonStatusport() 
{
	CString  str;
	short  bi;
    int  i;
    BYTE      bCtrl, bData;

    bi = (inp32)(Status_ADDR);

    bCtrl = (BYTE)bi;

	for (i=0; i < 8; i++) {
	   
	   bData = bCtrl & 0x01;
	   str.Format("%01X",  bData);

	   switch (i) {
	   case 0: m_Static_Status0.SetWindowText(str); break;
       case 1: m_Static_Status1.SetWindowText(str); break;
	   case 2: m_Static_Status2.SetWindowText(str); break;
	   case 3: m_Static_Status3.SetWindowText(str); break;
	   case 4: m_Static_Status4.SetWindowText(str); break;
	   case 5: m_Static_Status5.SetWindowText(str); break;
	   case 6: m_Static_Status6.SetWindowText(str); break;
	   case 7: m_Static_Status7.SetWindowText(str); break;
	   }

	   bCtrl = bCtrl >> 1;
	}	
}


BOOL CParPortModeDlg::CheckStatusBusyBit() 
{
	BOOL status = TRUE;
	short  bi, bj, bk;
    int iCount;
  
    bi = (inp32)(Status_ADDR);
    bj = bi & 0x80;

	// S7 : 1 ..... Ready ( Busy:Inverted at connector ) 
	// S7 : 0 ..... Busy
	if ( bj == 0x00) {      
		iCount = 0;
		while (1) {
            bi = (inp32)(Status_ADDR);
            bk = bi & 0x80;
			if (bj == 0x80) 
				break;
			
			if (iCount >=10) {
				status = FALSE;
				break;
			}

			Sleep(10);
			iCount ++;
		}
	}

    return status;
}

long  CParPortModeDlg::String_To_Hexa(char * buffer)
{
	long value;
	BYTE c;

	value = 0;
	while(*buffer) {
		c = * buffer++;
		if(c >= '0' && c <= '9')
			value = (value * 16) + (c - '0');
		else if(c >= 'a' && c <= 'f')
			value = (value * 16) + (c - 'a' + 10);
		else if(c >= 'A' && c <= 'F')
			value = (value * 16) + (c - 'A' + 10);
		else {
			value = -1;
			break;
		}
	}
	return value;
}

void CParPortModeDlg::Set_SppCompatibleWriteMode() 
{
	short x;

	 //  Change ECR Content to Spp Mode
	 x=0x00;  
     (oup32)(ECR_ADDR, x);

	 //////////////////////
     x=0x08;         //  00 1000 
     (oup32)(CTRL_ADDR,x);
}

void CParPortModeDlg::Set_SppNibbleReadMode() 
{
	short x;

	 //  Change ECR Content to Spp Mode
	 x=0x00;  
     (oup32)(ECR_ADDR, x);
     
	 //  Initialize Control Port for NibbleMode
	 //  nSelect_In,  Init,  nAutoFeed,  nStrobe
     x=0x28;         //  10 1000 
     (oup32)(CTRL_ADDR,x);
}

void CParPortModeDlg::Set_SppByteReadMode() 
{
	short x;

	 //  Change ECR Content to PS2 Mode
	 x=0x20;  
     (oup32)(ECR_ADDR, x);

	 //  Initialize Control Port for ByteMode
	 //  nSelect_In,  Init,  nAutoFeed,  nStrobe
     x=0x28;         //  10 1000 
     (oup32)(CTRL_ADDR,x);
}

BOOL CParPortModeDlg::CheckByteMode_PtrClkBit() 
{
	BOOL status = TRUE;
	short  bi, bj, bk;
    int iCount;
  
    bi = (inp32)(Status_ADDR);
    bj = bi & 0x40;

	// S6 : 1 ..... Not Signaled
	// S6 : 0 ..... Signaled

	if ( bj == 0x10) {      
		iCount = 0;
		while (1) {
            bi = (inp32)(Status_ADDR);
            bk = bi & 0x40;
			if (bj == 0x00) 
				break;
			
			if (iCount >=10) {
				status = FALSE;
				break;
			}

			Sleep(10);
			iCount ++;
		}
	}

    return status;
}

BOOL CParPortModeDlg::CheckStatusTimeOutBit() 
{
	BOOL status = TRUE;
	short  bi, bj;
	int  count = 0;

    bi = (inp32)(Status_ADDR);
    bj = bi & 0x01;
	
	if ( bj == 0x01) {
      TRACE( "TimeOut Bit On............%x  %x   \n", bj, bi);
      (oup32)(Status_ADDR, 0x01);      
      bi = (inp32)(Status_ADDR);
	  TRACE( "TimeOut Bit On : Result........%x    \n", bi);
      status = FALSE;
	}

    bj = bi & 0x01;
	if ( bj == 0x01) {
      TRACE( "TimeOut Bit On............%x  %x   \n", bj, bi);
      (oup32)(Status_ADDR, 0x01);      
      bi = (inp32)(Status_ADDR);
	  TRACE( "TimeOut Bit On : Result........%x    \n", bi);
	  status = FALSE;
	}

	return status;
}

BOOL CParPortModeDlg::EppAddrWriteByteToPort(BYTE bData) 
{
    BOOL status = TRUE;

	if (!CheckStatusBusyBit()) {
		AfxMessageBox(" Busy Bit.....On !!!");
	    return FALSE;
	}

    (oup32)(EPP_ADDR, bData);      // 0x01

	if(!CheckStatusTimeOutBit())
		status = FALSE;

	return status;
}

BOOL CParPortModeDlg::EppDataWriteByteToPort(BYTE bData) 
{
    BOOL status = TRUE;

	if (!CheckStatusBusyBit()) {
		AfxMessageBox(" Busy Bit.....On !!!");
	    return FALSE;
	}

    (oup32)(EPP_DATA, bData);      // 0x01
	
	if(!CheckStatusTimeOutBit())
		status = FALSE;

	return status;
}

void CParPortModeDlg::OnButtonEcpWrite() 
{
	short i, x;
    BYTE bData;
    char Buffer[40];
	CString    str;

     //  ECP Mode
	i=0x278 + 0x402;     
	x=0x60;  
    (oup32)(i,x);
			
    m_Edit_EcpWrite.GetWindowText(str);   
	wsprintf(Buffer, "%s", str);
    bData = (byte)String_To_Hexa(Buffer);

	if ((bData < 0) || (bData > 255)) {
        AfxMessageBox(" Please input value as a range of 0 ~ 0xFF.");
		return;
	}	
	TRACE( "bData........%x    \n", bData);

    (oup32)(ECP_DATA, bData);  

     ///////////////////////
	 // C0   1->0
	 x=0x25;         // 1011    //  nSelect_In,  Init,  HostAck,  HostClk
     (oup32)(CTRL_ADDR,x);

	 Sleep(5);
	 
	 x=0x24;         // 10 0100 
     (oup32)(CTRL_ADDR,x);
}

BOOL CParPortModeDlg::CheckEcpMode_PeriphClkBit() 
{
	BOOL status = TRUE;
	short  bi, bj;

    int iCount;
  
    bi = (inp32)(Status_ADDR);
    bj = bi & 0x70;         // x001 

	// S6:1  S5:1  S4:1 ..... Not Signaled
	// S6:0  S5:0  S4:1 ..... Signaled

	TRACE( "CheckEcpMode_PeriphClkBit() .... bi:%x  bj:%x \n", bi, bj);

	iCount = 0;

	if ( bj != 0x10) {      		
		while (1) {
            bi = (inp32)(Status_ADDR);
            bj = bi & 0x70;
			if (bj == 0x10) 
				break;
			
			if (iCount >=50) {
				status = FALSE;
				break;
			}

			Sleep(2);
			iCount ++;
		}
	}
    
	TRACE( "CheckEcpMode_PeriphClkBit() ....iCount:%d  bi:%x  bj:%x \n", iCount, bi, bj);
    return status;
}

⌨️ 快捷键说明

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