Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Hardware Interface Programming in VC++ - Part I (Port Access)

0.00/5 (No votes)
9 Jun 2002 1  
A simple port access tutorial for the hardware interface developer

Sample Image

For the students of electronics...

As a student of electronics I find that students in colleges don't have much time to learn the windows programming because they just manage to test their devices with small DOS based programs coded in C or C++ and concentrates on the electronics of their hardware. [Other reasons are also there ;) ] But after completing the hardware part they want to give it professional look by programming window based software for their hardware.

Students developing hardware can not get much help on programming side by their teacher (they both are just expert in electronics). The electronics magazines publishing such hardware projects also uses C and C++.

So, this article is for the hardware developer who have knowledge of C and C++ and who want to switch over to window based application for their device.

In this first part...

In this first part of HIPIVC++ we will see how to check the port continuously using timers. We will build a simple (and sample) dialog based application to check whether the Pin No. 10, 11, 12, 13, and 15 of LPT1 is high or low. I think it is a good starting point.

Start with Application Wizard

To Skip this section:
Just generate dialog based application with all default option if you are familiar with AppWizard or follow the procedure
  • Click on File | New; than chose MFC AppWizard(exe) and give Project name; click OK or press Enter you will see MFC AppWizard-Step 1
  • In MFC AppWizard-Step 1 chose Dialog based application type and click Next.
  • Click next for the Step 2 and 3 and click Finish in last (fourth) Step.
  • Click OK in New Project Information dialog. AppWizard will create simple dialog based application for you.
  • Press F7 to build EXE of your project.
  • Press Ctrl+F5 to execute it.
  • You will see dialog box with OK and Cancel buttons and text "TODO: Place dialog controls here."
  • 40% Done. These and next instructions are to make life easy in MFC for the new MFC programmer.

Modifying the resources

At this stage you will see dialog resource is opened in the window (AppWizard will do this as default). Now we will modify the dialog box resource as per our requirement.
  • Select and Delete "TODO:Place..." text, and Cancel button.
  • Change caption of OK button to Close (right click on button | Property > Caption)
  • From Control tool bar create five check box and caption them as Pin 10, Pin 11, Pin 12, Pin 13 and Pin 15. Also change IDs to IDC_PIN10, IDC_PIN11, IDC_PIN12, IDC_PIN13, IDC_PIN15 (note that we haven't use Pin 14 that is not for status port)
  • Size the dialog box if you need! You may also insert static text like "LPT 1" or "Status Port: 0x379" or your name.
  • Don't forget to save your work. The final dialog box should be as the screen shot given at top.

Add member variables

Now we will add member variables to check boxes which then changes their value according to high or low value of status pins of parallel port.

  • right click on any check box and click on ClassWizard... the class wizard dialog box will appear.
  • Select Member Variables tab if not. Project should be YourAppName and Class name should be CYourAppNameDlg
  • You will see IDC_PIN10 to IDC_PIN15 and IDOK.
  • Select IDC_PIN10 and click Add Variable... than Add Member Variable dialog box will appear.
  • Give Member variable name as m_Pin10
  • Do same for IDC_PIN11 to IDC_PIN15 (please forget pin 14)
Now your list of Member Variables should look like this...
Control IDs:        Type        Member
IDC_PIN10            CButton        m_Pin10
IDC_PIN11            CButton        m_Pin11
IDC_PIN12            CButton        m_Pin12
IDC_PIN13            CButton        m_Pin13
IDC_PIN15            CButton        m_Pin15
80% Done. Save your work.

Final Coding

Here you will insert your code to input form the port and update the check box view according to the status of parallel port pins.
  • Click Class View tab on Workspace window, you will see YourAppName classes.
  • Right click on CYourAppNameDlg chose Add Member Variable...
  • Enter Variable Type as int and Variable Name as in379 it would assign value of port 0x379. Keep Access type as it is.(Public)
  • Same way add more five int variable for each pin and name them as nPin10, nPin11, nPin12, nPin13, nPin15
  • Now right click on CYourAppNameDlg class and chose Add Windows Message Handler... then from New windows messages/events list select WM_TIMER and click Add Handler button. The WM_TIMER will be inserted in Existing message/event handlers, select it there if not and click Edit Existing button.
  • Paste the code given below the bold part is generated automatically by Wizard but they can help you to find the proper place for pasting the code.

void CPpscDlg::OnTimer(UINT nIDEvent) 
{
    // TODO: Add your message handler code here and/or call default

    
    in379=_inp(0x379);
    nPin10=in379 & 64;
    nPin11=in379 & 128;
    nPin12=in379 & 32;
    nPin13=in379 & 16;
    nPin15=in379 & 8;

    if(nPin10==0)
        m_Pin10.SetCheck(0);
    else if(nPin10==64)
        m_Pin10.SetCheck(1);

    if(nPin11==0)
        m_Pin11.SetCheck(0);
    else if(nPin11==128)
        m_Pin11.SetCheck(1);

    if(nPin12==0)
        m_Pin12.SetCheck(0);
    else if(nPin12==32)
        m_Pin12.SetCheck(1);

    if(nPin13==0)
        m_Pin13.SetCheck(0);
    else if(nPin13==16)
        m_Pin13.SetCheck(1);

    if(nPin15==0)
        m_Pin15.SetCheck(0);
    else if(nPin15==8)
        m_Pin15.SetCheck(1);

    CDialog::OnTimer(nIDEvent);
}
  • Now scroll upward in same file (YourAppNameDlg.cpp) and paste following single line code in BOOL CPpscDlg::OnInitDialog() function.

    // TODO: Add extra initialization here


    SetTimer(1,2,NULL);
    
    return TRUE;  // return TRUE  unless you set the focus to a control

}
  • If you try to build your project at this point you will get error C2065: '_inp' : undeclared identifier
  • So include conio.h in YourAppNameDlg.cpp file as follows...

// YourAppNameDlg.cpp : implementation file

//


#include "stdafx.h"

#include "YourAppName.h"

#include "YourAppNameDlg.h"


#include "conio.h"


#ifdef _DEBUG
  • Complete. Now you may build and run the Parallel Port Status Check Version 1.0 (I am using the name PPSC for short)

How it works

This is very simple program which just inputs from the port. The _inp(unsigned short) function returns the value at the port whose number is passed to it. The SetTimer() is used to generate a timer event at every 2 millisecond. The OnTimer() catches the timer event and updates the check box. Initially (when the printer is not connected or DB-25 is open) the parallel port status pins should be at high logic except Pin 11 which is hardware inverted. So initially all check boxes except for Pin 11 should be checked.

You can see that in my screenshot image of PPSC, the Pin 10 is also at logic low it is because I have damaged this pin during developing some parallel port device. By the way I have found the fault and the solution for preventing other pins, but discussion of such problem is out of scope of this site. It is just for the hobbies who have chance to damage their parallel port. ;)

I will continue if you want...

It is all upon your feedback...

In next part I want to cover parallel port fully, and than I want to write for the serial port and USB. But again it is all upon your feedback...

See you in next part, Take care.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here