ParallelPortControlDlg.cpp
上传用户:dxkj_777
上传日期:2021-04-03
资源大小:1874k
文件大小:11k
源码类别:

并口编程

开发平台:

Visual C++

  1. // ParallelPortControlDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ParallelPortControl.h"
  5. #include "ParallelPortControlDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CAboutDlg dialog used for App About
  13. class CAboutDlg : public CDialog
  14. {
  15. public:
  16. CAboutDlg();
  17. // Dialog Data
  18. //{{AFX_DATA(CAboutDlg)
  19. enum { IDD = IDD_ABOUTBOX };
  20. //}}AFX_DATA
  21. // ClassWizard generated virtual function overrides
  22. //{{AFX_VIRTUAL(CAboutDlg)
  23. protected:
  24. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  25. //}}AFX_VIRTUAL
  26. // Implementation
  27. protected:
  28. //{{AFX_MSG(CAboutDlg)
  29. //}}AFX_MSG
  30. DECLARE_MESSAGE_MAP()
  31. };
  32. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  33. {
  34. //{{AFX_DATA_INIT(CAboutDlg)
  35. //}}AFX_DATA_INIT
  36. }
  37. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  38. {
  39. CDialog::DoDataExchange(pDX);
  40. //{{AFX_DATA_MAP(CAboutDlg)
  41. //}}AFX_DATA_MAP
  42. }
  43. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  44. //{{AFX_MSG_MAP(CAboutDlg)
  45. // No message handlers
  46. //}}AFX_MSG_MAP
  47. END_MESSAGE_MAP()
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CParallelPortControlDlg dialog
  50. CParallelPortControlDlg::CParallelPortControlDlg(CWnd* pParent /*=NULL*/)
  51. : CDialog(CParallelPortControlDlg::IDD, pParent)
  52. {
  53. //{{AFX_DATA_INIT(CParallelPortControlDlg)
  54. // NOTE: the ClassWizard will add member initialization here
  55. //}}AFX_DATA_INIT
  56. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  57. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  58. }
  59. void CParallelPortControlDlg::DoDataExchange(CDataExchange* pDX)
  60. {
  61. CDialog::DoDataExchange(pDX);
  62. //{{AFX_DATA_MAP(CParallelPortControlDlg)
  63. // NOTE: the ClassWizard will add DDX and DDV calls here
  64. //}}AFX_DATA_MAP
  65. }
  66. BEGIN_MESSAGE_MAP(CParallelPortControlDlg, CDialog)
  67. //{{AFX_MSG_MAP(CParallelPortControlDlg)
  68. ON_WM_SYSCOMMAND()
  69. ON_WM_PAINT()
  70. ON_WM_QUERYDRAGICON()
  71. ON_BN_CLICKED(IDC_BUTTON_WRITEDATAPORT, OnButtonWritedataport)
  72. ON_BN_CLICKED(IDC_BUTTON_WRITECONTORLPORT, OnButtonWritecontorlport)
  73. ON_BN_CLICKED(IDC_BUTTON_READSTATEPORT, OnButtonReadstateport)
  74. ON_BN_CLICKED(IDC_BUTTON_READCONTROLPORT, OnButtonReadcontrolport)
  75. ON_BN_CLICKED(IDC_BUTTON_WRITEDATA, OnButtonWritedata)
  76. ON_BN_CLICKED(IDC_BUTTON_READDATA, OnButtonReaddata)
  77. ON_BN_CLICKED(IDC_BUTTON_ABOUT, OnButtonAbout)
  78. //}}AFX_MSG_MAP
  79. END_MESSAGE_MAP()
  80. /////////////////////////////////////////////////////////////////////////////
  81. // CParallelPortControlDlg message handlers
  82. BOOL CParallelPortControlDlg::OnInitDialog()
  83. {
  84. CDialog::OnInitDialog();
  85. // Add "About..." menu item to system menu.
  86. // IDM_ABOUTBOX must be in the system command range.
  87. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  88. ASSERT(IDM_ABOUTBOX < 0xF000);
  89. CMenu* pSysMenu = GetSystemMenu(FALSE);
  90. if (pSysMenu != NULL)
  91. {
  92. CString strAboutMenu;
  93. strAboutMenu.LoadString(IDS_ABOUTBOX);
  94. if (!strAboutMenu.IsEmpty())
  95. {
  96. pSysMenu->AppendMenu(MF_SEPARATOR);
  97. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  98. }
  99. }
  100. // Set the icon for this dialog.  The framework does this automatically
  101. //  when the application's main window is not a dialog
  102. SetIcon(m_hIcon, TRUE); // Set big icon
  103. SetIcon(m_hIcon, FALSE); // Set small icon
  104. // 初始化I/O并口
  105. if(!InitializeWinIo())
  106. {
  107. MessageBox("Init fail!");
  108. }
  109. //设置I/O口address
  110. SetDlgItemText(IDC_EDIT1,"378");
  111. SetDlgItemText(IDC_EDIT3,"37A");
  112. SetDlgItemText(IDC_EDIT5,"379");
  113. SetDlgItemText(IDC_EDIT7,"37A");
  114. SetDlgItemText(IDC_EDIT9,"378");
  115. SetDlgItemText(IDC_EDIT10,"37A");
  116. SetDlgItemText(IDC_EDIT12,"379");
  117. SetDlgItemText(IDC_EDIT13,"37A");
  118. return TRUE;  // return TRUE  unless you set the focus to a control
  119. }
  120. void CParallelPortControlDlg::OnSysCommand(UINT nID, LPARAM lParam)
  121. {
  122. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  123. {
  124. CAboutDlg dlgAbout;
  125. dlgAbout.DoModal();
  126. }
  127. else
  128. {
  129. CDialog::OnSysCommand(nID, lParam);
  130. }
  131. }
  132. // If you add a minimize button to your dialog, you will need the code below
  133. //  to draw the icon.  For MFC applications using the document/view model,
  134. //  this is automatically done for you by the framework.
  135. void CParallelPortControlDlg::OnPaint() 
  136. {
  137. if (IsIconic())
  138. {
  139. CPaintDC dc(this); // device context for painting
  140. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  141. // Center icon in client rectangle
  142. int cxIcon = GetSystemMetrics(SM_CXICON);
  143. int cyIcon = GetSystemMetrics(SM_CYICON);
  144. CRect rect;
  145. GetClientRect(&rect);
  146. int x = (rect.Width() - cxIcon + 1) / 2;
  147. int y = (rect.Height() - cyIcon + 1) / 2;
  148. // Draw the icon
  149. dc.DrawIcon(x, y, m_hIcon);
  150. }
  151. else
  152. {
  153. CDialog::OnPaint();
  154. }
  155. }
  156. // The system calls this to obtain the cursor to display while the user drags
  157. //  the minimized window.
  158. HCURSOR CParallelPortControlDlg::OnQueryDragIcon()
  159. {
  160. return (HCURSOR) m_hIcon;
  161. }
  162. BOOL CParallelPortControlDlg::DestroyWindow() 
  163. {
  164. ShutdownWinIo();
  165. return CDialog::DestroyWindow();
  166. }
  167. void CParallelPortControlDlg::OnButtonWritedataport() 
  168. {
  169. char s[10];
  170.     unsigned int  WriValue=0;
  171.     GetDlgItem(IDC_EDIT1)->GetWindowText(s, 10);
  172.     sscanf(s, "%x", &WriValue);
  173.     WORD  m_nport=(WORD)WriValue;
  174. GetDlgItem(IDC_EDIT2)->GetWindowText(s, 10);
  175.     sscanf(s, "%d", &WriValue);
  176. DWORD   m_nValue=(DWORD)WriValue;
  177. SetPortVal(m_nport, m_nValue, 1);//write a BYTE value to an I/O port
  178. }
  179. void CParallelPortControlDlg::OnButtonWritecontorlport() 
  180. {
  181. char s[10];
  182.     unsigned int  WriValue=0;
  183.     GetDlgItem(IDC_EDIT3)->GetWindowText(s, 10);
  184.     sscanf(s, "%x", &WriValue);
  185.     WORD   m_nport=(WORD)WriValue;  //获取端口地址
  186. DWORD  temp_dwPortVal;
  187. unsigned int    temp_aa;
  188. GetPortVal(m_nport, &temp_dwPortVal, 1);  //reads a BYTE value from an I/O port
  189. temp_aa=(unsigned int)temp_dwPortVal;
  190. temp_aa=temp_aa&0x0F0;  //取低8位值,将低4位置为0;高4位不变;
  191. temp_aa=temp_aa^0x0B;   //将低4位中C0、C1、C3置为1,C2置为0;高4位不变;
  192. GetDlgItem(IDC_EDIT4)->GetWindowText(s, 10);
  193.     sscanf(s, "%d", &WriValue);//获取要写入端口的值
  194. WriValue=WriValue&0x0F; //取低4位;
  195. temp_aa=temp_aa^WriValue; //将写入值的低4位中的C0、C1、C3取反,C2位不变,高4位保持端口值不变
  196. SetPortVal(m_nport, (DWORD)temp_aa, 1); //写出的值中,高4位保持端口原来的值不变,
  197.                                         //低4位是写入什么电平,连接器上既是什么电平
  198. }
  199. void CParallelPortControlDlg::OnButtonReadstateport() 
  200. {
  201. char ss[10];
  202. DWORD            dwPortVal;
  203.     unsigned int     ValueGet=0;
  204.     GetDlgItem(IDC_EDIT5)->GetWindowText(ss, 10);
  205.     sscanf(ss, "%x", &ValueGet);
  206.     WORD   m_nport=(WORD)ValueGet;
  207. GetPortVal(m_nport, &dwPortVal, 1);
  208. ValueGet=dwPortVal;
  209. ValueGet=ValueGet^0x80; //保持得到的State值与连接器处的值一直;
  210. ValueGet=ValueGet&0xF8; //去掉S0 ~S2位;
  211. ValueGet=ValueGet>>3;   //右移3位,将S7~S3变为低5位
  212. SetDlgItemInt(IDC_EDIT6,ValueGet,true);
  213. }
  214. void CParallelPortControlDlg::OnButtonReadcontrolport() 
  215. {
  216. char ss[10];
  217.     unsigned int  ValueGet=0;
  218.     GetDlgItem(IDC_EDIT7)->GetWindowText(ss, 10);
  219.     sscanf(ss, "%x", &ValueGet);
  220.     WORD   m_nport=(WORD)ValueGet;
  221. //========== 将C0~C3位置1,即使连接器上是高电平 ,使控制端口为输入端口=====
  222. DWORD           temp_dwPortVal;
  223. unsigned int    temp_aa;
  224. GetPortVal(m_nport, &temp_dwPortVal, 1);  //获取端口的当前值
  225. temp_aa=(unsigned int)temp_dwPortVal;
  226. temp_aa=temp_aa&0x0F0;  //取低8位值,将低4位置为0;高4位不变;
  227. temp_aa=temp_aa^0x4;   //将低4位中C0、C1、C3置为0,C2置为1;高4位不变;
  228. SetPortVal(m_nport, (DWORD)temp_aa, 1); //写出的值中,高4位保持端口原来的值不变,
  229.                                         //低4位是写高电平,即使连接器上是高电平
  230. //=============================================================
  231. DWORD     dwPortVal;
  232. GetPortVal(m_nport, &dwPortVal, 1);
  233. ValueGet=dwPortVal;
  234. ValueGet=ValueGet^0x0B; //保持C0,C1,C3位的值与连接器处的值一至;
  235. ValueGet=ValueGet&0x0F; //去掉高4位值
  236. SetDlgItemInt(IDC_EDIT8,ValueGet,true);
  237. }
  238. void CParallelPortControlDlg::OnButtonWritedata() 
  239. {
  240. char s[10];
  241.     unsigned int  WriValue=0;
  242.     GetDlgItem(IDC_EDIT9)->GetWindowText(s, 10);
  243.     sscanf(s, "%x", &WriValue);
  244.     WORD  m_nportData=(WORD)WriValue;
  245. GetDlgItem(IDC_EDIT10)->GetWindowText(s, 10);
  246.     sscanf(s, "%x", &WriValue);
  247.     WORD  m_nportControl=(WORD)WriValue;
  248. GetDlgItem(IDC_EDIT11)->GetWindowText(s, 10);
  249.     sscanf(s, "%d", &WriValue);
  250. DWORD   m_nValue=(DWORD)(WriValue&0x0FF);//取低8位值
  251. SetPortVal(m_nportData, m_nValue, 1);//write a BYTE value to Data port
  252. DWORD  temp_dwPortVal;
  253. unsigned int    temp_aa;
  254. GetPortVal(m_nportControl, &temp_dwPortVal, 1);  //reads a BYTE value from an I/O port
  255. temp_aa=(unsigned int)temp_dwPortVal;
  256. temp_aa=temp_aa&0x0F0;  //取低8位值,将低4位置为0;高4位不变;
  257. temp_aa=temp_aa^0x0B;   //将低4位中C0、C1、C3置为1,C2置为0;高4位不变;
  258. WriValue=WriValue&0x0F00;
  259. WriValue=WriValue>>8;
  260. temp_aa=temp_aa^WriValue; //将写入值的低4位中的C0、C1、C3取反,C2位不变,高4位保持端口值不变
  261. SetPortVal(m_nportControl, (DWORD)temp_aa, 1); //写出的值中,高4位保持端口原来的值不变,
  262.                                                //低4位是写入什么电平,连接器上既是什么电平
  263. }
  264. void CParallelPortControlDlg::OnButtonReaddata() 
  265. {
  266. char ss[10];
  267.     unsigned int     ValueGet=0;
  268.     GetDlgItem(IDC_EDIT12)->GetWindowText(ss, 10);
  269.     sscanf(ss, "%x", &ValueGet);
  270.     WORD   m_nportState=(WORD)ValueGet;
  271. GetDlgItem(IDC_EDIT13)->GetWindowText(ss, 10);
  272.     sscanf(ss, "%x", &ValueGet);
  273.     WORD   m_nportControl=(WORD)ValueGet;
  274. //Read State Port
  275. DWORD            dwPortVal;
  276. unsigned int     ValueState=0;
  277. GetPortVal(m_nportState, &dwPortVal, 1);
  278. ValueState=dwPortVal;
  279. ValueState=ValueState^0x80; //保持得到的State值与连接器处的值一直;
  280. ValueState=ValueState&0xF8; //去掉S0 ~S2位;
  281. ValueState=ValueState<<1;   //左移1位,将S7~S3变为高5位
  282. //Read control Port
  283. //========== 将C0~C3位置1,即使连接器上是高电平 ,使控制端口为输入端口=====
  284. GetPortVal(m_nportControl, &dwPortVal, 1);  //获取端口的当前值
  285. ValueGet=(unsigned int)dwPortVal;
  286. ValueGet=ValueGet&0x0F0;  //取低8位值,将低4位置为0;高4位不变;
  287. ValueGet=ValueGet^0x4;   //将低4位中C0、C1、C3置为0,C2置为1;高4位不变;
  288. SetPortVal(m_nportControl, (DWORD)ValueGet, 1); //写出的值中,高4位保持端口原来的值不变,
  289.                                         //低4位是写高电平,即使连接器上是高电平
  290. //=============================================================
  291. unsigned int     ValueControl=0;
  292. GetPortVal(m_nportControl, &dwPortVal, 1);
  293. ValueControl=(unsigned int)dwPortVal;
  294. ValueControl=ValueControl^0x0B; //保持C0,C1,C3位的值与连接器处的值一至;
  295. ValueControl=ValueControl&0x0F; //去掉高4位值
  296. //get 9bit value
  297. ValueGet=ValueState^ValueControl;
  298. SetDlgItemInt(IDC_EDIT14,ValueGet,true);
  299. }
  300. void CParallelPortControlDlg::OnButtonAbout() 
  301. {
  302. CAboutDlg  dlg;
  303. dlg.DoModal();
  304. }
  305. void CParallelPortControlDlg::OnOK() 
  306. {
  307. }