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