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

📄 gpiodlg.cpp

📁 此文件夹包含evc环境下编写GPIO应用程序的源代码。与我已上传的GPIOdriver配合使用
💻 CPP
字号:
// gpioDlg.cpp : implementation file
//

#include "stdafx.h"
#include "gpio.h"
#include "gpioDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


//xdj add   gpio zhu ce biao xin xi
WCHAR * szRegKey=L"Drivers\\BuiltIn\\PIO";
WCHAR * szPrefix=L"PIO";
WCHAR * szDLL=L"Gpio.dll";
WCHAR * szFriendlyName=L"Simple Driver";
DWORD DrvIndex=1;
DWORD DrvOrder=0;
// xdj add :write to string to zhu ce biao
#define WRITE_REG_SZ(Name,Value)RegSetValueEx(hDrvKey,Name,0,REG_SZ,(LPBYTE)Value,\
       (wcslen(Value)+1)*sizeof(WCHAR))
#define WRITE_REG_DWORD(Name,Value){DWORD dwValue=Value;RegSetValueEx(hDrvKey,Name,\
		   0,REG_DWORD,(LPBYTE)&dwValue,sizeof(DWORD));}




//#define  IOCTL_GPH_SET_PIN_OUT			0x0000017


/////////////////////////////////////////////////////////////////////////////
// CGpioDlg dialog

CGpioDlg::CGpioDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CGpioDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CGpioDlg)
	m_WriteByte = 0;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CGpioDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CGpioDlg)
	DDX_Text(pDX, IDC_WRITE_EDIT, m_WriteByte);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CGpioDlg, CDialog)
	//{{AFX_MSG_MAP(CGpioDlg)
	ON_BN_CLICKED(IDC_OPEN_PIO1, OnOpenPio1)
	ON_BN_CLICKED(IDC_CLOSE_PIO1, OnClosePio1)
	ON_BN_CLICKED(IDC_BEEP_ON, OnBeepOn)
	ON_BN_CLICKED(IDC_BEEP_CLOSE, OnBeepClose)
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_LOAD_DRIVER, OnLoadDriver)
	ON_BN_CLICKED(IDC_UNLOAD_DRIVER, OnUnloadDriver)
	ON_BN_CLICKED(IDC_BUTTON1, OnWrite)
	ON_BN_CLICKED(IDC_BUTTON2, OnRead)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGpioDlg message handlers

BOOL CGpioDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	CenterWindow(GetDesktopWindow());	// center to the hpc screen

	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}


//XDJ ADD
// 包含命令码头文件
#include "gpio_xdj.h"


HANDLE HandleDriver= INVALID_HANDLE_VALUE;
// 文件句柄
HANDLE hFile = INVALID_HANDLE_VALUE;
HKEY hDrvKey=NULL;  // 注册表操作句柄



void CGpioDlg::OnOpenPio1() //打开驱动
{
	// TODO: Add your control notification handler code here
BOOL ret;
//xdj del
//BYTE pinnum=10;

//xdj add
BYTE pinnum=4;

hFile=CreateFile(TEXT("PIO1:"),GENERIC_READ | GENERIC_WRITE,0,
            NULL,OPEN_EXISTING,0,0);
if(hFile==INVALID_HANDLE_VALUE)
{
  MessageBox(_T("can not open ABgpio!!"));
  return;
}
else
  MessageBox(_T("open ABgpio success!"));	//hFile=!INVALID_HANDLE_VALUE

//xdj del
//ret=::DeviceIoControl(hFile,IOCTL_GPH_SET_PIN_OUT,&pinnum,1,NULL,0,NULL,NULL);

//xdj add
ret=::DeviceIoControl(hFile,IOCTL_GPA_SET_PIN_OUT,&pinnum,1,NULL,0,NULL,NULL);
if (ret != TRUE)
	{
	//	OnClosePio1();
		MessageBox(_T("设置 GPE5引脚输出失败!"));
	//	return;
	}

	CButton *pOpenButton = (CButton*)GetDlgItem(IDC_OPEN_PIO1);		/* 取得控件指针 */
	CButton *pCloseButton = (CButton*)GetDlgItem(IDC_CLOSE_PIO1);  
	pOpenButton->EnableWindow(FALSE);								/* 禁止按键 */
	pCloseButton->EnableWindow(TRUE);								/* 使能按键 */
	
}

void CGpioDlg::OnClosePio1() //hFile=INVALID_HANDLE_VALUE
{

	if (hFile != INVALID_HANDLE_VALUE)
	{
		CloseHandle(hFile);
		hFile = INVALID_HANDLE_VALUE;
	}

	CButton *pOpenButton = (CButton*)GetDlgItem(IDC_OPEN_PIO1);		/* 取得控件指针 */
	CButton *pCloseButton = (CButton*)GetDlgItem(IDC_CLOSE_PIO1);  
	pOpenButton->EnableWindow(TRUE);								/* 使能按键 */
	pCloseButton->EnableWindow(FALSE);                               /* 禁止按*/	
}	//hFile=INVALID_HANDLE_VALUE
		


void CGpioDlg::OnBeepOn() //WRITE TO GPIOA
{
	// TODO: Add your control notification handler code here
	BOOL ret;
	BYTE pinnum = 4;	

	// 置 GPE5 为低电平, 蜂鸣器蜂鸣
	ret = ::DeviceIoControl(hFile, IOCTL_GPA_CLR_PIN, &pinnum, 1, NULL, 0, NULL, NULL);
	if (ret != TRUE)
		MessageBox(_T("设置 GPE5 低电平失败!"));
	

}

void CGpioDlg::OnBeepClose() //READ FROM GPIOA
{
	// TODO: Add your control notification handler code here
		BOOL ret;
	BYTE pinnum = 4;	

	// 置 GPH10 为高电平, 禁止蜂鸣器蜂鸣
	ret = ::DeviceIoControl(hFile, IOCTL_GPA_SET_PIN, &pinnum, 1, NULL, 0, NULL, NULL);
	if (ret != TRUE)
		MessageBox(_T("设置 GPE5 高电平失败!"));
	
}

void CGpioDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	// TODO: Add your message handler code here
		OnClosePio1();						/* 关闭 GPIO 驱动 */
}

void CGpioDlg::OnLoadDriver() 
{
	// TODO: Add your control notification handler code here
	 LONG nErr;
  DWORD dwDisp;
  //创建注册表键
  nErr=RegCreateKeyEx(HKEY_LOCAL_MACHINE,szRegKey,0,L"",0,
	    0,NULL,&hDrvKey,&dwDisp);
  if(nErr!=ERROR_SUCCESS)
  {
	  {
		  MessageBox(_T("failed!!"));
		  return;
	  }
}
  else
  {
	  WRITE_REG_SZ( L"Prefix",szPrefix);
      WRITE_REG_SZ( L"Dll",szDLL);
	  WRITE_REG_SZ( L"FriendlyName",szFriendlyName);
	  WRITE_REG_DWORD( L"Order",DrvOrder);
	  WRITE_REG_DWORD( L"Index",DrvIndex);
  }

  HandleDriver=ActivateDeviceEx(szRegKey,NULL,0,NULL);
  if(HandleDriver==INVALID_HANDLE_VALUE)
  {
	  MessageBox(_T("load failed!!"));
  }
  else
  {
	  MessageBox(_T("load success!!"));  //HandleDriver!=INVALID_HANDLE_VALUE
  }
	
}

void CGpioDlg::OnUnloadDriver() 
{
	// TODO: Add your control notification handler code here
 if(HandleDriver!=INVALID_HANDLE_VALUE)
  {
	  OnClosePio1();
      BOOL ret=DeactivateDevice(HandleDriver);
     if(ret==TRUE)
	 {
      RegCloseKey(hDrvKey);
      RegDeleteKey(HKEY_LOCAL_MACHINE,szRegKey);
      HandleDriver= INVALID_HANDLE_VALUE;
      MessageBox(_T("unload success!!"));
	 }
     else
	 {
	  MessageBox(_T("load failed!!"));  //(HandleDriver!=INVALID_HANDLE_VALUE)
	 }	
 }	
}

void CGpioDlg::OnWrite() 
{
	// TODO: Add your control notification handler code here

	BOOL ret;

   uint i,j;

  DWORD tmp,actlen;
//  tmp=0x55;
  uint writebyte;
  if(hFile==INVALID_HANDLE_VALUE)
  {
	  MessageBox(_T("驱动没打开"));
	  return;
  }
  UpdateData(TRUE);

//BYTE writebyte=(BYTE)tmp;

writebyte=0x55;
ret=true;
for(j=0;j<128;j++)
{
 for(i=0;i<16;i++)
////BOOL ret=WriteFile(hFile,&m_WriteByte,1,&actlen,NULL);
WriteFile(hFile,&m_WriteByte,1,&actlen,NULL);

}
//BOOL ret=WriteFile(hFile,writebyte,1,&actlen,NULL);
if((ret==FALSE)||(actlen!=1))
	  MessageBox(_T("写入数据失败"));
else
	  MessageBox(_T("写入数据成功"));
}

void CGpioDlg::OnRead() 
{
	// TODO: Add your control notification handler code here

 DWORD recbuff,actlen;

  if(hFile==INVALID_HANDLE_VALUE)
  {
	  MessageBox(_T("驱动没打开"));
	  return;
  }


BOOL ret=ReadFile(hFile,&recbuff,1,&actlen,NULL);
if((ret==FALSE)||(actlen!=1))
	  MessageBox(_T("读出数据失败"));
else
	  MessageBox(_T("读出数据成功"));

 CString strTmp;
 strTmp.Format(_T(" %x"),recbuff);
 CEdit * pDispEdit = (CEdit * )GetDlgItem(IDC_READ_DISP);
 pDispEdit->SetWindowText(strTmp);	

}

⌨️ 快捷键说明

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