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_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
- You will see
- 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_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.
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
- 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
nPin10=in379 & 64;
nPin11=in379 & 128;
nPin12=in379 & 32;
nPin13=in379 & 16;
nPin15=in379 & 8;
- Now scroll upward in same file (YourAppNameDlg.cpp) and paste following single line code in
BOOL CPpscDlg::OnInitDialog() function.
// TODO: Add extra initialization here
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
- 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.