📄 debug365.c
字号:
// 2003.03.12, 2005.04
//****************************************
//** Copyright (C) W.ch 1999-2005 **
//** Web: http://www.winchiphead.com **
//****************************************
//** EXE for PCI interface chip CH365 **
//** C, VC5.0 **
//****************************************
//
// PCI总线接口芯片CH365的应用层演示程序 V1.2
// 南京沁恒电子有限公司 作者: W.ch 2005.04
// 运行环境: Windows 98/ME, Windows 2000/XP
//
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <iostream.h>
#include <string.h>
#include "CH365DLL.H"
#include "DEBUG365.H"
HINSTANCE mSaveInstance; // 实例
HWND mSaveDialogMain; // 主对话框
CHAR mCaptionInform[] = " 信息提示 ";
UINT mIndex;
mPCH365_IO_REG mBaseAddr;
mPCH365_MEM_REG mMemAddr;
USHORT Off;
typedef struct _VAR_TYPE{
union{
UCHAR cVar;
UINT iVar;
USHORT sVar;
ULONG lVar;
};
} mVAR_TYPE, *mpVAR_TYPE;
typedef UCHAR pOut[8];
LRESULT CALLBACK mDialogMain( HWND, UINT, WPARAM, LPARAM );
UCHAR mCharToBcd( UCHAR iChar); //ASCII字符转换为一位BCD码
mVAR_TYPE mCharToVar( UCHAR *, UINT, UINT ); //字符串转换成数值
void mSetI2C(HWND hDialog,int iIndex); //I2C读写
void AddrRefresh( HWND, int ); //重新取基址
void mMemReadWrite( HWND ); //存储器读写
void mIOReadWrite( HWND ); //I/O端口读写
void mConReadWrite( HWND ); //配置空间读写
void mSetA15( HWND ); //设置A15_A8
int GetDevIndex( HWND ); //取设备号
BOOL mCheckWord(PVOID,int); //控制字和双字地址输入
void mInitCheckBox( HWND ); //初始化默认选中单选框
void mShowDllVer( HWND ); //显示DLL版本号
void mShowDevVer( HWND ); //显示驱动版本号
//程序入口
int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd )
{
mSaveInstance = hInstance;
return( DialogBox( hInstance, "IDD_MAIN", NULL, mDialogMain ) ); //调用主对话框
}
//主对话框事件
LRESULT CALLBACK mDialogMain( HWND hDialog, UINT uMessage, WPARAM wParam, LPARAM lParam )
{
switch( uMessage )
{
case WM_INITDIALOG: //初始化
{
mSaveDialogMain = hDialog;
mIndex = 0;
SetDlgItemText(hDialog,IDC_EDTINDEX,"0");
mInitCheckBox( hDialog );
// 需要使用DLL则需要先加载
if ( LoadLibrary( "CH365DLL.DLL" ) == NULL ) // 加载DLL失败,可能未安装到系统中
{
MessageBox( hDialog, "无法加载CH365的DLL", mCaptionInform, MB_ICONSTOP | MB_OK );
EndDialog( hDialog, 0x81 ); // 关闭对话框
return( TRUE );
}
if ( CH365mOpenDevice( mIndex,TRUE,TRUE ) == INVALID_HANDLE_VALUE ) // 使用之前必须打开设备
{
MessageBox( hDialog, "无法打开CH365设备", mCaptionInform, MB_ICONSTOP | MB_OK );
EndDialog( hDialog, 0x81 ); // 关闭对话框
return( TRUE );
}
mShowDllVer(hDialog); //显示DLL版本号 1
mShowDevVer(hDialog); //显示驱动版本号
}
return (TRUE);
break;
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case IDC_BTNIO: //从I/O端口读写一个字节
{
mIOReadWrite(hDialog);
}
return (TRUE);
break;
case IDC_BTNCONBYTE: //配置空间的读写
{
mConReadWrite( hDialog );
}
return (TRUE);
break;
case IDC_BTNMEM: //存储器的读写操作
{
mMemReadWrite(hDialog);
}
return (TRUE);
break;
case IDC_BTNI2C: //对I2C接口操作
{
mIndex = GetDevIndex(hDialog);
mSetI2C( hDialog,mIndex );
}
return (TRUE);
break;
case IDC_BTNA15:
{
mSetA15( hDialog ); //设置A15_A8
}
return (TRUE);
break;
case IDC_REFRESH:
{
mIndex = GetDevIndex(hDialog);
AddrRefresh(hDialog, mIndex);
}
return (TRUE);
break;
case IDC_CLOSE: //关闭设备
{
mIndex = GetDevIndex(hDialog);
CH365mCloseDevice(mIndex);
}
return (TRUE);
break;
case IDC_OPEN: //打开设备
{
mIndex = GetDevIndex(hDialog);
if ( CH365mOpenDevice(mIndex, TRUE, TRUE ) == INVALID_HANDLE_VALUE )
{
MessageBox( hDialog, "无法打开CH365设备", mCaptionInform, MB_ICONSTOP | MB_OK );
return( TRUE );
}
}
return (TRUE);
break;
case IDC_RADI2CA15:
{
CheckDlgButton(hDialog,IDC_RADI2CA15,BST_CHECKED);
CheckDlgButton(hDialog,IDC_RADI2CSYS,BST_UNCHECKED);
}
return (TRUE);
break;
case IDC_RADI2CSYS:
{
CheckDlgButton(hDialog,IDC_RADI2CSYS,BST_CHECKED);
CheckDlgButton(hDialog,IDC_RADI2CA15,BST_UNCHECKED);
}
return (TRUE);
break;
case IDC_EXIT:
case WM_DESTROY: //退出
EndDialog(hDialog,1);
return (TRUE);
break;
}
}
return (TRUE);
break;
}
return (FALSE);
}
// 将ASCII字符转换为一位BCD码,有效字符是0-9,A-F,a-f,无效字符返回0FFH
UCHAR mCharToBcd(UCHAR iChar ) // 输入的ASCII字符
{
UCHAR mBCD;
if ( iChar >= '0' && iChar <= '9' ) mBCD = iChar -'0';
else if ( iChar >= 'A' && iChar <= 'Z' ) mBCD = iChar - 'A' + 0x0a;
else if ( iChar >= 'a' && iChar <= 'z' ) mBCD = iChar - 'a' + 0x0a;
else mBCD = 0xff;
return( mBCD );
}
// 将字符串转换成数值返回
mVAR_TYPE mCharToVar(UCHAR * sChar,UINT sLen,UINT sFlag)
{
UINT i;
mVAR_TYPE mVarType;
if(sLen != 0)
{
if(sLen > 1) //字符串长度大于1
{
if(sFlag == 1) //sFlag为1 表示返回ULONG型
{
ULONG lReturn = 0;
for(i=0;i<sLen;i++)
{
lReturn <<= 4;
lReturn |= mCharToBcd(sChar[i]);
}
mVarType.lVar = lReturn;
}
else if(sFlag == 0) //sFlag为0 表示返回USHORT型
{
USHORT sReturn = 0;
for(i=0;i<sLen;i++)
{
sReturn <<= 4;
sReturn |= mCharToBcd(sChar[i]);
}
mVarType.sVar = sReturn;
}
else if(sFlag == 2) //sFlag为2 表示返回UINT型
{
UINT iReturn = 0;
for(i=0;i<sLen;i++)
{
iReturn <<= 4;
iReturn |= mCharToBcd(sChar[i]);
}
mVarType.iVar = iReturn;
}
else if(sFlag == 3)
{
UCHAR cReturn = 0;
cReturn = (mCharToBcd(sChar[0])<<4) | mCharToBcd(sChar[1]);
mVarType.cVar = cReturn;
}
}
else //字符串长度等于1
{
mVarType.lVar = mCharToBcd(sChar[0]);
mVarType.sVar = mCharToBcd(sChar[0]);
mVarType.iVar = mCharToBcd(sChar[0]);
mVarType.cVar = mCharToBcd(sChar[0]);
}
}
else
{
mVarType.iVar = 0;
mVarType.lVar = 0;
mVarType.sVar = 0;
mVarType.cVar = 0;
}
return mVarType;
}
void mIOReadWrite(HWND hDialog)
{
mVAR_TYPE mVarType;
UCHAR iAddr[8];
UINT iAddrLen = 0;
USHORT mAddr=0;
iAddrLen = GetDlgItemText(hDialog,IDC_EDTIOADDR,iAddr,5);
mVarType = mCharToVar(iAddr,iAddrLen,0); //取地址值
mAddr = mVarType.sVar;
mIndex = GetDevIndex(hDialog);
/*********I/O端口字节读写操作********/
if(IsDlgButtonChecked(hDialog,IDC_RADIOBYTE) == BST_CHECKED)
{
UCHAR oByte[8];
UCHAR cByte;
//读字节
if (IsDlgButtonChecked(hDialog,IDC_RADIOREAD) == BST_CHECKED)
{
if(iAddrLen)
{
if(IsDlgButtonChecked(hDialog,IDC_RADOFF) == BST_CHECKED) //偏移地址
{ //从I/O端口读数据
if(CH365mReadIoByte( mIndex, &mBaseAddr->mCh365IoPort[mAddr], &cByte ))
{
UCHAR sByte[8];
sprintf( sByte,"%02X\x0", cByte);
SetDlgItemText(hDialog,IDC_EDTIODATA,sByte);
}
else
MessageBox(hDialog,"读数据失败!","提示",MB_OK|MB_ICONSTOP);
}
else if(IsDlgButtonChecked(hDialog,IDC_RADIME) == BST_CHECKED) //直接地址
{
if(CH365mReadIoByte( mIndex, (PVOID)mAddr, &cByte ))
{
UCHAR sByte[8];
sprintf( sByte,"%02X\x0", cByte);
SetDlgItemText(hDialog,IDC_EDTIODATA,sByte);
}
else
MessageBox(hDialog,"读数据失败!","提示",MB_OK|MB_ICONSTOP);
}
}
else
MessageBox(hDialog,"请输入地址!","提示",MB_OK);
}
//写字节
else if(IsDlgButtonChecked(hDialog,IDC_RADIOWRITE) == BST_CHECKED)
{
UINT oByteLen;
mVAR_TYPE mVarByte;
oByteLen = GetDlgItemText(hDialog,IDC_EDTIODATA,oByte,5); //取数据
mVarByte = mCharToVar(oByte,oByteLen,3); //转换输入数据为相应的值
cByte = mVarByte.cVar;
if( iAddrLen && oByteLen ) //写入地址和空数据不为空
{
if(IsDlgButtonChecked(hDialog,IDC_RADOFF) == BST_CHECKED) //偏移地址
{
//向I/O端口写数据
if(CH365mWriteIoByte(mIndex, &mBaseAddr->mCh365IoPort[mAddr], cByte))
MessageBox(hDialog,"写数据成功!","提示",MB_OK);
else
MessageBox(hDialog,"写数据失败!","提示",MB_OK|MB_ICONSTOP);
}
else if(IsDlgButtonChecked(hDialog,IDC_RADIME) == BST_CHECKED) //直接地址
{
//向I/O端口写数据
if(CH365mWriteIoByte(mIndex, (PVOID)mAddr, cByte))
MessageBox(hDialog,"写数据成功!","提示",MB_OK);
else
MessageBox(hDialog,"写数据失败!","提示",MB_OK|MB_ICONSTOP);
}
}
else
MessageBox(hDialog,"请输入地址和数据!","提示",MB_OK);
}
}
/************I/O端口字操作****************/
else if(IsDlgButtonChecked(hDialog,IDC_RADIOWORD) == BST_CHECKED)
{
UCHAR cWord[8]; //数据
USHORT num;
USHORT oWord = 0;
//检测是否是字地址开头
if(!mCheckWord((PVOID)mAddr,4))
{
MessageBox(hDialog,"请输入能存储字的起始地址","提示",MB_OK|MB_ICONSTOP);
return;
}
if (IsDlgButtonChecked(hDialog,IDC_RADIOREAD) == BST_CHECKED) //选中读操作
{
if( iAddrLen )
{
if(IsDlgButtonChecked(hDialog,IDC_RADOFF) == BST_CHECKED) //偏移地址
{
if(CH365mReadIoWord( mIndex, &mBaseAddr->mCh365IoPort[mAddr], &oWord )) //从I/O端口读一个字
{
UCHAR sByte[8];
sprintf( sByte,"%02X%02X\x0", oWord & 0xFF, (oWord>>8) & 0xFF );
SetDlgItemText(hDialog,IDC_EDTIODATA,sByte); //输出数据
}
else
MessageBox(hDialog,"读数据失败!","提示",MB_OK|MB_ICONSTOP);
}
else if(IsDlgButtonChecked(hDialog,IDC_RADIME) == BST_CHECKED) //直接地址
{
if(CH365mReadIoWord( mIndex, (PVOID)mAddr, &oWord )) //从I/O端口读一个字
{
UCHAR sByte[8];
sprintf( sByte,"%02X%02X\x0", oWord & 0xFF, (oWord>>8) & 0xFF );
SetDlgItemText(hDialog,IDC_EDTIODATA,sByte); //输出数据
}
else
MessageBox(hDialog,"读数据失败!","提示",MB_OK|MB_ICONSTOP);
}
}
else
MessageBox(hDialog,"请输入端口地址!","提示",MB_OK);
}
else if(IsDlgButtonChecked(hDialog,IDC_RADIOWRITE) == BST_CHECKED) //选中写操作
{
num = GetDlgItemText(hDialog,IDC_EDTIODATA,cWord,5); //取数据
if( iAddrLen && num ) //取地址
{
mVAR_TYPE mVarWord;
mVarWord = mCharToVar(cWord,num,0); //转换输入数据为相应的值
oWord = mVarWord.sVar;
if(IsDlgButtonChecked(hDialog,IDC_RADOFF) == BST_CHECKED) //偏移地址
{
if(CH365mWriteIoWord(mIndex, &mBaseAddr->mCh365IoPort[mAddr], oWord)) //向I/O端口写入一个字
MessageBox(hDialog,"写数据成功!","提示",MB_OK);
else
MessageBox(hDialog,"写数据失败!","提示",MB_OK|MB_ICONSTOP);
}
else if(IsDlgButtonChecked(hDialog,IDC_RADIME) == BST_CHECKED) //直接地址
{
if(CH365mWriteIoWord(mIndex, (PVOID)mAddr, oWord)) //向I/O端口写入一个字
MessageBox(hDialog,"写数据成功!","提示",MB_OK);
else
MessageBox(hDialog,"写数据失败!","提示",MB_OK|MB_ICONSTOP);
}
}
else
MessageBox(hDialog,"请输入地址和数据!","提示",MB_OK);
}
}
/**********I/O端口双字操作*************/
else if(IsDlgButtonChecked(hDialog,IDC_RADIODWORD) == BST_CHECKED)
{
ULONG oDword = 0;
UCHAR cDword[12]; //数据
ULONG num;
//检测是否是双字地址开头
if(!mCheckWord((PVOID)mAddr,8))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -