并口控制与类的使用Word格式文档下载.docx
- 文档编号:6903281
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:15
- 大小:476.02KB
并口控制与类的使用Word格式文档下载.docx
《并口控制与类的使用Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《并口控制与类的使用Word格式文档下载.docx(15页珍藏版)》请在冰点文库上搜索。
图02
02.JPG)
然后加入并口操作类的头文件.一般来说,网上可以下载到的源码都是以类的形式给出的,VC的好处也在于可以把一个操作封装成类,以便在不同的工程中调用.如图,双击类管理器中的Ceg04Dlg在弹出的文件中加入#include
"
ParallelPort.h"
//添加并口类头文件
图03
03.JPG)
同时,还要定义一个类变量,用于并口类的操作.
在刚打开的类定义文件中找到CEg04Dlg类,并加入一个类变量m_Port,完成后如下图所示
图04
04.JPG)
为了操行方便,把并口操作类也加入到工程中,点击[FileView]标签,标签位置在类管理类下面,见上图中的[FileVi…]然后在[Source
Files]中加入ParallelPort.cpp在[Header
Files]中加入ParallelPort.h这样,就可以在类管理中看到我们所用到的并口操作类了,同时也可以方便的查阅类函及成员变量.
下面在界面中加入六个按钮和两个文本编辑框,方法前面已经介绍多次.完成后如下图
图05
05.JPG)
其中,各控件ID如下
上面的编辑框
IDC_EDIT_READ
用于显示收到的数据
下面的编辑框
IDC_EDIT_WRITE
用于填写要发送的数据
读数据口
IDC_BTN_DREAD
用于读取并口数据总线
写数据口
IDC_BTN_DWRITE
用于写并口数据口数据
读控制口
IDC_BTN_CREAD
用于读取并口控制总线
写控制口
IDC_BTN_CWRITE
用于写并口控制口数据
读状态口
IDC_BTN_SREAD
用于读并口状态总线
并口流水灯
IDC_BTN_LED
用于在数据线上输出流水灯效果
先要介绍一下并口,以便理解接下来的操作是什么意思.以下一些关于并口的介绍,摘自互联网.
并口SPP模式寄存器定义
数据寄存器(基地址)
位
引脚:
D-sub
信号名
信号源
是否在连接器处倒相
Centronics
0
2
数据位0
PC
否
2
1
3
数据位1
3
4
数据位2
4
5
数据位3
5
6
数据位4
6
7
数据位5
7
8
数据位6
8
9
数据位7
9
注:
控制寄存器的第5位控制数据位是否能够输出。
状态寄存器(基地址+1)
15
nError
外设
32
13
Select
13
12
Paper
Out
12
10
nAck
10
11
Busy
是
11
1,2位未定义。
控制寄存器(基地址+2)
nStrobe
1
14
nAutoLF
14
16
nInit
31
17
nSelectIn
36
连接器中没有提供的附加位:
4:
中断启用,此位为1时,IRQ从nAck送往系统的中断控制器;
为0时,IRQ不送往中断控制器。
5:
双向控制端口的方向控制位,此位为0时,输出启动;
为1时,不能输出;
控制端口可以读取外部逻辑电平。
6、7:
未定义。
学过单片机或相关知识的应该可以看懂表格中的意思了,上面罗列的是除去电源及地线后可用到的IO口,数据口8位,由状态寄存器第五位决定能否输出,状态口共5位,控制口共4位.一般我们只用到数据口来传输数据.一般来说,并口基地址是0x378,也就是数据寄存器的地址,在并口类中默认.明白了这些以后,就可以对并口进行相应的操作了.
接下来要在程序初始化时初始化并口,在前面的操作中,定义了一个类变量m_Port,这个类变量在后面我们将多次用到.首先展开类管理器中的CEg04Dlg双击OnInitDialog()在窗口初始化中加入以下代码.
//在这里初始化并口
if(m_Port.InitPort()==TRUE)
{
SetDlgItemText(IDC_EDIT_READ,"
并口初始化成功,并口地址:
0x378"
);
}
else
并口初始化失败!
完成后如下图所示
图06
06.JPG)
m_Port.InitPort()是并口操作类中的并口初始化函数,传入参数是并口地址,由于类定义时默认了0x378为并口地址,这里可以不用传参数了.如果初始化成功,传回布尔变量TRUE,运行一下,应该可以看到并口初始化成功的信息.
接下来为读数据口添加代码.
双击[读数据口]按钮,在弹出的代码中加入程序如下
void
CEg04Dlg:
:
OnBtnDread()
//
TODO:
Add
your
control
notification
handler
code
here
BYTE
nPortData=m_Port.ReadData();
//从并口读到数据
CString
a,b;
GetDlgItemText(IDC_EDIT_READ,b);
//获取编辑框中原有的文本
a.Format("
\r\n读到数据口数据:
%2.2X"
nPortData);
b+=a;
SetDlgItemText(IDC_EDIT_READ,b);
//写入文本到编辑框
//以下用于将滑块自动移到最后一行
unsigned
char
nLine=((CEdit*)GetDlgItem(IDC_EDIT_READ))->
GetLineCount();
((CEdit*)GetDlgItem(IDC_EDIT_READ))->
LineScroll(nLine);
完成后如图所示(图8)
图08
08.JPG)
这样就可以从并口读到数据了.同样的,可以添加控制口,状态口的按钮响应代码,用于读到控制口及状态口,方法相同,这里就不再详叙了.不同的是读控制口时,用到的函数是m_Port.ReadCtrl();
读状态口用到的函数是m_Port.ReadState();
再有一个问题要说一下,编辑框默认状态下是单行的,也就是说,我们的换行操作是没有用的.可以鼠标右击编辑框,在弹出的菜单中选[属性],并修改其属性如下图所示(图7)
图07
07.JPG)
下面来添加写数据操作.在写数据操作中,我们要换一种方法来读写文本编辑框了.
首先鼠标右击下面的写操作编辑框,在弹出的菜单中选择[建立类向导],英文版的VC请根据翻译.
图09
09.JPG)
然后会弹出一个类向导对话框,
选择[MemberVariables]标签卡后显示如下.
图10
10.JPG)
在ID列表中,我们可以看到窗口中为控件添加的ID号,双击[IDC_EDIT_WRITE]会弹出另一个对话框,将各框中的内容修改如下图
图11
11.JPG)
第一个框中的m_WriteEdit是我们为IDC_EDIT_WRITE这个编辑器定义的一个类变量名,这个类变量会自动与编辑框IDC_EDIT_WRITE关联,在以后的操作中用到.
确定后双击[写数据口]按钮,为写数据口按钮添加代码,完成后如下
OnBtnDwrite()
a;
b=0;
m_WriteEdit.GetWindowText(a);
//获取编辑框中文本
a.MakeUpper();
//全部转换为大写
if(a=="
)
MessageBox("
发送内容不能为空!
return;
for(unsigned
i=0;
i<
a.GetLength();
i+=3)
if(i+2>
a.GetLength())
数据格式填写不正确!
if(a.GetAt(i)>
='
A'
&
a.GetAt(i)<
Z'
)
b=(a.GetAt(i)-55)*16;
//判断填入的是字母还是数字,并把字符转换成十六进制数
else
0'
9'
b=(a.GetAt(i)-0x30)*16;
if(a.GetAt(i+1)>
a.GetAt(i+1)<
b+=(a.GetAt(i+1)-55);
b+=(a.GetAt(i+1)-0x30);
m_Port.WriteData(b);
这里可能有点长,其实与第三章的发送是一样的,增加了一点容错处理而已.在这里,我们用m_WriteEdit.GetWindowText(a);
来获取编辑框中文本,
m_WriteEdit是开始时候在类向导中定义的变量,GetWindowText是一个窗口函数,因为文本编辑框也认为是窗口,所以窗口操作函数是通用的,由于m_WriteEdit与文本框IDC_EDIT_WRITE关联,获取的是文本框中的内容.同样,由于m_WriteEdit是CEdit变量,于是就可以有所有CEdit的所有属性,这与结构变量有点相似,大家可以慢慢体会.其余口的操作类似,不再重复说了.
这个并口类还有很多功能函数,这里也清一下.
#define
PIN_STROBE
PIN_AUTO
PIN_D0
PIN_D1
PIN_D2
PIN_D3
PIN_D4
PIN_D5
PIN_D6
PIN_D7
PIN_ERROR
15
PIN_INIT
16
PIN_SELIN
17
PIN_ACK
PIN_BUSY
PIN_PE
PIN_SLCT
这些是对IO口的定义,用于单个IO口的操作,操作函数有以下几个
BOOL
SetPinLogic(int
nPin,BOOL
bLogic);
//设置指定引脚,bLogic=1高电平,bLogic=0低电平
GetPinLogic(int
nPin);
//得到指定引脚的电平
SetPinL(int
//设置指定引脚为低电平
SetPinH(int
//设置指定引脚为高电平
以上些都是这个并口类的函数了,有了这些,我想大家也就可以随便做点东西了,记得曾有过用并口直接驱动LCD的例子,建议也试一下.
最后一个按钮是流水灯,其实这个对于大家来说并不难,我们也提供一个例子.双击[并口流水灯]添加流水灯代码.IO口低电平有效.
OnBtnLed()
nDataIO=0x01;
nCData=m_Port.ReadCtrl();
//读控制寄存器数据
nCData&
=0xDF;
//保证第五位为低,使能IO输出
m_Port.WriteCtrl(nCData);
//写控制口数据
for(char
8;
i++)
m_Port.WriteData(0xff-nDataIO);
\r\n流水灯数据[%d]:
i+1,0xff-nDataIO);
nDataIO<
<
=1;
Sleep(200);
//延时200ms
接上硬件可以看到,按一下出现一次流水灯效果,由于不方便按硬件,就没有试过了.
这一章就先到这里了.建议大家自己想个作品来试一下,同时也希望大家分享一下自己的学习及实验感想,把作品也发上来庆祝一下.
以下是整个工程及教程内容的下载
ourdev_500674.rar(文件大小:
1.07M)
(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 并口 控制 使用