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

📄 dlgbeep.cpp

📁 周立功WinCE光盘资料
💻 CPP
字号:
// DlgBeep.cpp : implementation file
//

#include "stdafx.h"
#include "Magic2410.h"
#include "DlgBeep.h"
#include "gpio.h"

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

/////////////////////////////////////////////////////////////////////////////
// DlgBeep dialog
// 定义步进电机各相使用的 GPIO 编号
#define   MOTOA  5
#define   MOTOB  6
#define   MOTOC  7
#define   MOTOD  0

#define	  LED1	 11
#define   LED2   12
#define   LED3   4
#define   LED4   6

#define   WATER  1
#define   HOURSE 2

#define	  DC_MOTORA	0
#define   DC_MOTORB	9

extern HANDLE m_hFileGpio;

DlgBeep::DlgBeep(CWnd* pParent /*=NULL*/)
	: CDialog(DlgBeep::IDD, pParent)
{
	//{{AFX_DATA_INIT(DlgBeep)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	
}


void DlgBeep::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(DlgBeep)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(DlgBeep, CDialog)
	//{{AFX_MSG_MAP(DlgBeep)
	ON_BN_CLICKED(IDC_BEEP_ON, OnBeepOn)
	ON_BN_CLICKED(IDC_BEEP_OFF, OnBeepOff)
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_StepRun, OnStepRun)
	ON_BN_CLICKED(IDC_BUTTON_NOT_RUN, OnButtonNotRun)
	ON_BN_CLICKED(IDC_BUTTON_LED1, OnButtonLed1)
	ON_BN_CLICKED(IDC_BUTTON_LED2, OnButtonLed2)
	ON_BN_CLICKED(IDC_BTN_STOP_LED, OnBtnStopLed)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// DlgBeep message handlers

// "蜂鸣器蜂鸣" 按键单击事件代码
void DlgBeep::OnBeepOn() 
{
	// TODO: Add your control notification handler code here
	BOOL ret;
	BYTE pinnum = 10;	

	// 置 GPH10 为低电平, 蜂鸣器蜂鸣
	ret = ::DeviceIoControl(hFile, IOCTL_GPH_CLR_PIN, &pinnum, 1, NULL, 0, NULL, NULL);
	if (ret != TRUE)
		MessageBox(_T("Set GPH Pin Out Error!"));
}

// "禁止蜂鸣器蜂鸣" 按键单击事件代码
void DlgBeep::OnBeepOff() 
{
	// TODO: Add your control notification handler code here
	BOOL ret;
	BYTE pinnum = 10;	

	// 置 GPH10 为高电平, 禁止蜂鸣器蜂鸣
	ret = ::DeviceIoControl(hFile, IOCTL_GPH_SET_PIN, &pinnum, 1, NULL, 0, NULL, NULL);
	if (ret != TRUE)
		MessageBox(_T("Set GPH Pin Out Error!"));
}

void DlgBeep::OnDestroy() 
{
	CDialog::OnDestroy();
	
	// TODO: Add your message handler code here
	// "关闭GPIO驱动" 按键单击事件代码
	DWORD lpExitCode;
	if (hFile != NULL)
		CloseHandle(hFile);
	if(GetExitCodeThread(hThreadLed,&lpExitCode))
		ExitThread(lpExitCode);
	CDialog::OnClose();
}

// "步进电机转动" 按键单击事件代码 
void DlgBeep::OnStepRun() 
{
	// TODO: Add your control notification handler code here
	DWORD i;
	if (hFile == INVALID_HANDLE_VALUE)
		return;
	
	// 步进电机运转
	for (i = 0; i < 30; i++)
	{
		MotoMode1(5); 
	}
}

/********************************************************************
函数名称: MotoMode2()
功能描述: 步进电机双四拍程序
		  控制时序为: AB-DA-CD-CD-BC
输入参数: DWORD dly: 每一步的延时控制, 值越大,延时越久
返 回 值: 无
*********************************************************************/
void DlgBeep::MotoMode2(DWORD dly)
{
	// AB 相有效
	SetPinStatus(MOTOA, 1);
	SetPinStatus(MOTOB, 1);
	Sleep(dly);
	SetPinStatus(MOTOA, 0);
	SetPinStatus(MOTOB, 0);

	// DA 相有效
	SetPinStatus(MOTOD, 1);
	SetPinStatus(MOTOA, 1);
	Sleep(dly);
	SetPinStatus(MOTOD, 0);
	SetPinStatus(MOTOA, 0);

	// CD 相有效
	SetPinStatus(MOTOC, 1);
	SetPinStatus(MOTOD, 1);
	Sleep(dly);
	SetPinStatus(MOTOC, 0);
	SetPinStatus(MOTOD, 0);

		// BC 相有效
	SetPinStatus(MOTOB, 1);
	SetPinStatus(MOTOC, 1);
	Sleep(dly);
	SetPinStatus(MOTOB, 0);
	SetPinStatus(MOTOC, 0);
}

/********************************************************************
函数名称: SetPinStatus()
功能描述: 设置 GPIO 引脚为高电平或高电平
输入参数: DWORD pinnum : 引脚编号, 取值为: MOTOA ~ MOTOD
		  BYTE status  : 引脚状态, 1 -- 输出高电平, 0 -- 输出低电平
返 回 值: TRUE: 操作成功    FALSE: 操作失败  
*********************************************************************/
BOOL DlgBeep::SetPinStatus(DWORD pinnum, BYTE status)
{
	BOOL ret;

	if (status != 0)
		ret = ::DeviceIoControl(hFile, IOCTL_GPC_SET_PIN, &pinnum, 1, NULL, 0, NULL, NULL);
	else
		ret = ::DeviceIoControl(hFile, IOCTL_GPC_CLR_PIN, &pinnum, 1, NULL, 0, NULL, NULL);

	return ret;
}

/********************************************************************
函数名称: MotoMode()
功能描述: 步进电机双四拍程序
		  控制时序为: AB-BC-CD-DA-AB
输入参数: DWORD dly: 每一步的延时控制, 值越大,延时越久
返 回 值: 无
*********************************************************************/
void DlgBeep::MotoMode1(DWORD dly)
{
	// DA 相有效
	SetPinStatus(MOTOD, 1);
	SetPinStatus(MOTOA, 1);
	Sleep(dly);
	SetPinStatus(MOTOD, 0);
	SetPinStatus(MOTOA, 0);

	// AB 相有效
	SetPinStatus(MOTOA, 1);
	SetPinStatus(MOTOB, 1);
	Sleep(dly);
	SetPinStatus(MOTOA, 0);
	SetPinStatus(MOTOB, 0);

	// BC 相有效
	SetPinStatus(MOTOB, 1);
	SetPinStatus(MOTOC, 1);
	Sleep(dly);
	SetPinStatus(MOTOB, 0);
	SetPinStatus(MOTOC, 0);

	// CD 相有效
	SetPinStatus(MOTOC, 1);
	SetPinStatus(MOTOD, 1);
	Sleep(dly);
	SetPinStatus(MOTOC, 0);
	SetPinStatus(MOTOD, 0);

}

void DlgBeep::OnButtonNotRun() 
{
	// TODO: Add your control notification handler code here
	DWORD i;
	if (hFile == INVALID_HANDLE_VALUE)
		return;
	
	// 步进电机运转
	for (i = 0; i < 30; i++)
	{
		MotoMode2(5); 
	}
}

void DlgBeep::OnButtonLed1() 
{
	// TODO: Add your control notification handler code here
	DWORD dwThreadID;
	LedStaly=WATER;
	if(hThreadLed==NULL)
	{
		ledThread=TRUE;
		hThreadLed=CreateThread(NULL,NULL,LedThread,this,NULL,&dwThreadID);
		if(hThreadLed==NULL)
			MessageBox(_T("LED Thread Create Faile"));
	}

}

BOOL DlgBeep::SetLed(BYTE pinnum, BOOL status,HANDLE hfileled)
{
	BOOL ret;
	switch(pinnum)
	{
	case LED1:
	case LED2:
		if(status)
		ret = ::DeviceIoControl(hfileled, IOCTL_GPE_SET_PIN, &pinnum, 1, NULL, 0, NULL, NULL);
	else
		ret = ::DeviceIoControl(hfileled, IOCTL_GPE_CLR_PIN, &pinnum, 1, NULL, 0, NULL, NULL);
		break;
	case LED3:
	case LED4:
		if(status)
		ret = ::DeviceIoControl(hfileled, IOCTL_GPH_SET_PIN, &pinnum, 1, NULL, 0, NULL, NULL);
	else
		ret = ::DeviceIoControl(hfileled, IOCTL_GPH_CLR_PIN, &pinnum, 1, NULL, 0, NULL, NULL);
		break;
	default:
		ret = FALSE;
		break;
	}
	return ret;
}

DWORD DlgBeep::LedThread(PVOID arg)
{
	DlgBeep *pDlgBeep=(DlgBeep *)arg;
	int dly=100;
	while(pDlgBeep->ledThread)
	{
		if(pDlgBeep->LedStaly==WATER)
		{
			dly=100;
			SetLed(LED1,TRUE,pDlgBeep->hFile );
			Sleep(dly);
			SetLed(LED1,FALSE,pDlgBeep->hFile );
			SetLed(LED2,TRUE,pDlgBeep->hFile );
			Sleep(dly);
			SetLed(LED2,FALSE,pDlgBeep->hFile );
			SetLed(LED3,TRUE,pDlgBeep->hFile );
			Sleep(dly);
			SetLed(LED3,FALSE,pDlgBeep->hFile );
			SetLed(LED4,TRUE,pDlgBeep->hFile );
			Sleep(dly);
			SetLed(LED4,FALSE,pDlgBeep->hFile );
		}
		else if(pDlgBeep->LedStaly == HOURSE)
		{
			dly=200;
			SetLed(LED2,FALSE,pDlgBeep->hFile );
			SetLed(LED4,FALSE,pDlgBeep->hFile );
			SetLed(LED1,TRUE,pDlgBeep->hFile );
			SetLed(LED3,TRUE,pDlgBeep->hFile );
			Sleep(dly);
			SetLed(LED1,FALSE,pDlgBeep->hFile );
			SetLed(LED3,FALSE,pDlgBeep->hFile );
			SetLed(LED2,TRUE,pDlgBeep->hFile );
			SetLed(LED4,TRUE,pDlgBeep->hFile );
			Sleep(dly);
		}
		else
			Sleep(1000);
	}
	return (DWORD)0;
}

void DlgBeep::OnButtonLed2() 
{
	// TODO: Add your control notification handler code here

	DWORD dwThreadID;
	LedStaly=HOURSE;
	if(hThreadLed==NULL)
	{
		ledThread=TRUE;
		hThreadLed=CreateThread(NULL,NULL,LedThread,this,NULL,&dwThreadID);
		if(hThreadLed==NULL)
			MessageBox(_T("LED Thread Create Faile"));
	}
}

void DlgBeep::OnBtnStopLed() 
{
	// TODO: Add your control notification handler code here
	ledThread=FALSE;
	Sleep(100);
	if(hThreadLed)
	{
		CloseHandle(hThreadLed);
		hThreadLed=NULL;
	}
}


void DlgBeep::StopBeepDlgled() 
{
	// TODO: Add your control notification handler code here
	ledThread = FALSE;
	Sleep(100);
	if(hThreadLed)
	{
		CloseHandle(hThreadLed);
		hThreadLed=NULL;
	}
}


DlgBeep *pDlgGPIO;

BOOL DlgBeep::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	BOOL ret;
	BYTE pinnum = 10;
	BYTE DC_motora=DC_MOTORA;
	BYTE DC_motorb=DC_MOTORB;

	// A,B,C,D 各相对就 GPIO 掩码
	DWORD pinmask = (1 << MOTOA) + (1 << MOTOB) + (1 << MOTOC) + (1 << MOTOD); 

	// 打开 GPIO 驱动
	hFile = CreateFile(TEXT("PIO1:"), GENERIC_READ | GENERIC_WRITE, 0, 
					   NULL, OPEN_EXISTING, 0, 0);
	
	if (hFile == INVALID_HANDLE_VALUE)
	{
		MessageBox(_T("Cannot Open PIO1!"));
		return FALSE; 
	}
	m_hFileGpio=hFile;

	// 设置 GPH10 为输出口
	ret = ::DeviceIoControl(hFile, IOCTL_GPH_SET_PIN_OUT, &pinnum, 1, NULL, 0, NULL, NULL);
	if (ret != TRUE)
		MessageBox(_T("Set GPH Pin Out Error!"));

	// 设置 GPC0, GPC5, GPC6, GPC7 为输出口
	ret = ::DeviceIoControl(hFile, IOCTL_GPC_SET_MULTI_PIN_OUT, &pinmask, 1, NULL, 0, NULL, NULL);
	if (ret != TRUE)
		MessageBox(_T("Set GPIO Pin Out failed!"));

	// 设置 GPB0 为输出口
	ret = ::DeviceIoControl(hFile, IOCTL_GPB_SET_PIN_OUT, &DC_motora, 1, NULL, 0, NULL, NULL);
	if (ret != TRUE)
		MessageBox(_T("Set GPB Pin Out Error!"));

	// 设置 GPH9 为输出口
	ret = ::DeviceIoControl(hFile, IOCTL_GPH_SET_PIN_OUT, &DC_motorb, 1, NULL, 0, NULL, NULL);
	if (ret != TRUE)
		MessageBox(_T("Set GPH Pin Out Error!"));

	// 设置 GPE11 为输出口
	pinnum=LED1;
	ret = ::DeviceIoControl(hFile, IOCTL_GPE_SET_PIN_OUT, &pinnum, 1, NULL, 0, NULL, NULL);
	if (ret != TRUE)
		MessageBox(_T("Set GPE Pin Out Error!"));

	// 设置 GPE12 为输出口
	pinnum=LED2;
	ret = ::DeviceIoControl(hFile, IOCTL_GPE_SET_PIN_OUT, &pinnum, 1, NULL, 0, NULL, NULL);
	if (ret != TRUE)
		MessageBox(_T("Set GPE12 Pin Out Error!"));

	// 设置 GPH4 为输出口
	pinnum=LED3;
	ret = ::DeviceIoControl(hFile, IOCTL_GPH_SET_PIN_OUT, &pinnum, 1, NULL, 0, NULL, NULL);
	if (ret != TRUE)
		MessageBox(_T("Set GPH4 Pin Out Error!"));

	// 设置 GPH6 为输出口
	pinnum=LED4;
	ret = ::DeviceIoControl(hFile, IOCTL_GPH_SET_PIN_OUT, &pinnum, 1, NULL, 0, NULL, NULL);
	if (ret != TRUE)
		MessageBox(_T("Set GPH6 Pin Out Error!"));

	// 置 GPH9 为低电平
	ret = ::DeviceIoControl(hFile, IOCTL_GPH_CLR_PIN, &DC_motorb, 1, 
							NULL, NULL, NULL, NULL);

	pDlgGPIO = this;


	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

⌨️ 快捷键说明

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