从零开始学习C++6.0之并口控制
第二课 P2端口控制
一、组建工程Portcon1
1、 连接好并口线,或接口板(如果有的话),准备万用表或LED指示灯用来试针脚的输出
2、 打开VC,新建工程MFC(exe类型),名称:Portcon1,选择基本对话框,在窗口添加两个按钮,做成如下图示:“确定”和“取消”两个按钮是默认的。并将“P2针高电平”的按钮ID改成IDC_P2_1,“P2针低电平”的按钮ID改成IDC_P2_0,目的就是为了达到输出P2针脚高电平“1”和低平电“0”
3、 按第一课的方法对这个Portcon1工程进行WinIo配置
4、 配置完WinIo库后,分别双击按钮输入以下两行代码:
5、 按F7进行编译后,直接按F5就可以运行了。用万用表量P2针脚的电压值,当按下“P2针高电平”的按钮时,电压值约为1.6V-2V之间;当按下“P2针低电平”的按钮时,电压值为零。如果测试的是LED灯(正极端接P2针,负极端接并口的GND),就会在输出高电平时LED亮。
二、关于WinIo库函数的知识介绍
上面的高低电平测试程序只用到两行代码,其中
WORD m_nport=(WORD)0x378;
SetPortVal(m_nport, 0, 1);
其中WORD用来获得端口地址,0x378是数据端口地址,0x37A是控制端口地址,0x379是状态端口的地址(这些地址可以在电脑的BIOS中查询到,学过单片机的朋友容易理解)。
第二行的SetPortVal就是写端口函数,下面做些函数说明。
1、读写I/O口函数说明:
A.读端口值函数
bool _stdcall GetPortVal(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize);
GetPortVal函数从指定端口读取一个BYTE/WORD/DWORD类型的值;
wPortAddr是指定一个端口地址值;
pdwPortVal为指向一双字节型变量的指针,该变量存储从wPortAddr端口读取的值;
bSize指定读取字节数,值可以为1,2或4。
B.写端口值函数
bool _stdcall SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize);
SetPortVal函数向指定端口写入一个BYTE/WORD/DWORD类型的值;
除dwPortVal为输入参数,表示待写入外,其余个变量含义与GetPortVal相似。
2、具体在使用中,如本节的两行代码:
WORD m_nport=(WORD)0x378;
SetPortVal(m_nport, 0, 1);
实际上定义了变量m_nport,这个变量也是随意定的,主要是为了传递给读/写函数用,将地址值传给它;
SetPortVal函数第二个变量,就是我们想要的值,为16进制,0-255的范围。具体操作的时候把二进制0000 0000的8位列出来对应P2-P9针端口,最低位是P2,比如想输出P4端口高电平,先列0000 0100,换算成数值4(也可写成0x04),这样代码为:
SetPortVal(m_nport, 4, 1);或SetPortVal(m_nport, 0x04, 1);
当然也可以定义unsigned int类型变量来传递需要的端口值。
以下是8位数据端口的输出高低电平换算示例表:(其他组合值推算即可)
数据端口0x378 |
转换值 |
||||||||
P9 |
P8 |
P7 |
P6 |
P5 |
P4 |
P3 |
P2 |
16进制值 |
10进制 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0x01 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0x02 |
2 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0x04 |
4 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0x08 |
8 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0x10 |
16 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0x20 |
32 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0x40 |
64 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0x80 |
128 |
SetPortVal函数第三个传递值用来指定读取或写入的字节数,因为我们控制的数据端口、控制端口或状态端口都是8位一字节,所以默认为1就可以了。用2或4会出现什么情况我也没试过。
本节的学习中我们只用到了一个输出函数,知识点不多,不用急,慢慢和我一起深入学习。