(1)GIVEIO是WINDOWS平台上的一个并口驱动,可以用来直接驱动并口寄存器进行控制和操作。取得GIVEIO库之后按照里面的文档安装GIVEIO.SYS即可。一般步骤如下:
1.首先将GIVEIO目录下的GIVEIO.SYS文件复制到C:/WINDOWS/system32/drivers目录下面;
2.然后打开控制面板里的添加硬件,选择“是,我已经连接了此硬件”;
3.下一步,选择添加新的硬件设备;
4.下一步,选择“安装我手动从列表选择的硬件”;
5.下一步,选择“端口(COM和LPT)”;
6.下一步,选择从磁盘安装,在路径中选择 GIVEIO目录下的giveio.inf文件,然后一直下去就OK了;
最后打开设备管理器,在设备管理器的端口里能看到GIVEIO端口(通常是个COM口),就表示安装正常了。
(2)使用GIVEIO库
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <math.h>
#include <conio.h>
typedef struct {
short int pitch;
short int duration;
} NOTE;
NOTE notes[] = {{14, 500}, {16, 500}, {12, 500}, {0, 500}, {7, 1000}};
void setfreq(int hz)
{
hz = 1193180 / hz; // clocked at 1.19MHz
_outp(0x43, 0xb6); // timer 2, square wave
_outp(0x42, hz);
_outp(0x42, hz >> 8);
}
void playnote(NOTE note)
{
_outp(0x61, _inp(0x61) | 0x03); // start speaker going
setfreq((int)(400 * pow(2, note.pitch / 12.0)));
Sleep(note.duration);
_outp(0x61, _inp(0x61) & ~0x03); // stop that racket!
}
int main(int argc, char* argv[])
{
int i;
HANDLE h;
h = CreateFile("////.//giveio", GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(h == INVALID_HANDLE_VALUE)
{
printf("Couldn't access giveio device/n");
return -1;
}
for(i=0; i < sizeof(notes)/sizeof(int); ++i)
playnote(notes[i]);
CloseHandle(h);
return 0;
}
有几点需要注意:
1,////.//giveio是打开的设备,由于是用//转义表示/,所以上述其实是表示// . /
2,这种底层的编程很少。以上_outp访问的是底层寄存器,功能如注释。
3,这种操作都需要<conio.h>这个头文件。