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

📄 led_intdlg.cpp

📁 通过evc编程实现wince下led灯中断控制
💻 CPP
字号:
// LED_INTDlg.cpp : implementation file
//

#include "stdafx.h"
#include "LED_INT.h"
#include "LED_INTDlg.h"
#include "pm.h"

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

/////////////////////////////////////////////////////////////////////////////
// CLED_INTDlg dialog

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

void CLED_INTDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CLED_INTDlg)
	DDX_Text(pDX, IDC_DISP, m_DispBuf);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CLED_INTDlg, CDialog)
	//{{AFX_MSG_MAP(CLED_INTDlg)
	ON_BN_CLICKED(IDC_OPEN, OnOpen)
	ON_BN_CLICKED(IDC_CLOSE, OnClose)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_SYSTEM_SLEEP, OnSystemSleep)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLED_INTDlg message handlers

BOOL CLED_INTDlg::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
	hMouse=NULL;
	BOOL	RetValue = TRUE;

	/* IO Register Allocation */

	v_pIOPregs = (volatile IOPreg *)VirtualAlloc(0, sizeof(IOPreg), MEM_RESERVE, PAGE_NOACCESS);
	if (v_pIOPregs == NULL) 
	{
		AfxMessageBox(TEXT("For IOPregs : VirtualAlloc failed!"));
		RetValue = FALSE;
	}
	else 
	{
		if (!VirtualCopy((PVOID)v_pIOPregs, (PVOID)(IOP_BASE), sizeof(IOPreg), PAGE_READWRITE | PAGE_NOCACHE)) 
		{
			AfxMessageBox(TEXT("For IOPregs: VirtualCopy failed!"));
			RetValue = FALSE;
		}
	}
	
	if (!RetValue) 
	{
		if (v_pIOPregs) 
		{
			VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE);
		}

		v_pIOPregs = NULL;
	}
	  
	else RETAILMSG (1, (TEXT(":::InitializeAddresses - Success\r\n") ));
	s2410LCD = (volatile LCDreg *)VirtualAlloc(0, sizeof(LCDreg), MEM_RESERVE, PAGE_NOACCESS);
	if (v_pIOPregs == NULL) 
	{
		ERRORMSG(1,(TEXT("For IOPregs : VirtualAlloc failed!\r\n")));
		RetValue = FALSE;
	}
	else 
	{
		if (!VirtualCopy((PVOID)s2410LCD, (PVOID)(LCD_BASE), sizeof(s2410LCD), PAGE_READWRITE | PAGE_NOCACHE)) 
		{
			ERRORMSG(1,(TEXT("For s2410LCD: VirtualCopy failed!\r\n")));
			RetValue = FALSE;
		}
	}
	
	if (!RetValue) 
	{
//		RETAILMSG (1, (TEXT(":::InitializeAddresses - Fail!!\r\n") ));

		if (s2410LCD) 
		{
			VirtualFree((PVOID) s2410LCD, 0, MEM_RELEASE);
		}

		s2410LCD = NULL;
	}
	else RETAILMSG (1, (TEXT(":::InitializeAddresses - Success\r\n") ));
	v_pIOPregs->rGPFCON  &= ~(0x3 << 6);		/* Set EINT2(GPF3) as EINT3							*/
	v_pIOPregs->rGPFCON  |=  (0x2 << 6);

    v_pIOPregs->rEXTINT0 &= ~(0x7 << 12);		/* Configure EINT3 as Falling Edge Mode				*/
    v_pIOPregs->rEXTINT0 |=  (0x2 << 12);

	v_pIOPregs->rGPDCON  &= ~(0xFFFF << 0);								
	v_pIOPregs->rGPDCON  |=  (0x5555 << 0);//配置GPD0~GPD7为输出状态

	//v_pIOPregs->rGPFUP
	IntrEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
	if (!(InterruptInitialize(SYSINTR_PDD, IntrEvent, 0, 0))) 
	{
		RETAILMSG(1, (TEXT("::: SYSINTR_EINT3 Init Fail\r\n")));
	}

	LoopNum = 0;

	HANDLE hReadThread;
	DWORD dwThreadID;
	// 创建一个读端口线程.
	if (hReadThread = CreateThread (NULL,0,(LPTHREAD_START_ROUTINE)PortReadThread, this, 0, &dwThreadID))
	{
		CloseHandle (hReadThread);
	}
	else
	{
		::MessageBox (NULL, _T("不能创建一个读端口线程"), _T("Error"), MB_OK);
	}
	CeSetThreadPriority(hReadThread, 152); 

	CString Str;

	Str.Format(_T("按键按下次数:%d次"),LoopNum);
	m_DispBuf = Str;
	UpdateData(FALSE);

	LED_Flag = TRUE;

	SetTimer(1,40,NULL);


	
	return TRUE;  // return TRUE  unless you set the focus to a control
}



void CLED_INTDlg::OnOpen() 
{
	v_pIOPregs->rGPBDAT &= ~(0x1 << 7);
	v_pIOPregs->rGPBDAT &= ~(0x1 << 8);
	v_pIOPregs->rGPBDAT &= ~(0x1 << 9);
	v_pIOPregs->rGPBDAT &= ~(0x1 << 10);
}

void CLED_INTDlg::OnClose() 
{
	v_pIOPregs->rGPBDAT |= (0x1 << 7);
	v_pIOPregs->rGPBDAT |= (0x1 << 8);
	v_pIOPregs->rGPBDAT |= (0x1 << 9);
	v_pIOPregs->rGPBDAT |= (0x1 << 10);
}

void CLED_INTDlg::OnTimer(UINT nIDEvent) 
{
	if(LED_Flag)
	{
		LED_Flag = FALSE;
		v_pIOPregs->rGPDDAT |= (0xFF << 0);
	}
	else{
		LED_Flag = TRUE;
		v_pIOPregs->rGPDDAT &= ~(0xFF << 0);
	}
/*	if(WaitForSingleObject(IntrEvent, INFINITE)== WAIT_OBJECT_0)
	{
		InterruptDone(SYSINTR_EINT2);
		m_DispBuf = _T("按键按下");
		UpdateData(FALSE);
	}

	KillTimer(1);
	
	m_DispBuf = _T("等待按下");
	UpdateData(FALSE);
	SetTimer(1,2000,NULL);
	*/	
	CDialog::OnTimer(nIDEvent);
}

void PortReadThread(CLED_INTDlg *dlg)
{
	while(1)
	{
		if(WaitForSingleObject(dlg->IntrEvent, INFINITE)== WAIT_OBJECT_0)
		{
			InterruptDone(SYSINTR_PDD);
			dlg->SendMessage(0x407,0,0);
		}
	}
}

LRESULT CLED_INTDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	CString Str;
	if (message==0x407){
		LoopNum ++;
		Str.Format(_T("按键按下次数:%d次"),LoopNum);
		m_DispBuf = Str;
		UpdateData(FALSE);
	}
	return CDialog::WindowProc(message, wParam, lParam);
}

void CLED_INTDlg::OnSystemSleep() 
{
	SetSystemPowerState(NULL,POWER_STATE_SUSPEND,POWER_FORCE);	
}

⌨️ 快捷键说明

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