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

📄 debug365.c

📁 南京沁恒电子有限公司USB通用设备接口芯片资料
💻 C
📖 第 1 页 / 共 2 页
字号:
// 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 + -