void Sound(int f)
{
USHORT B=1193180/f;
UCHAR temp = In_8(0x61);
temp = temp | 3;
Out_8(0x61,temp);
Out_8(0x43,0xB6);
Out_8(0x42,B&0xF);
Out_8(0x42,(B>>8)&0xF);
}
Run Code Online (Sandbox Code Playgroud)
In_8/ Out_8从指定端口读取/写入8位(省略实现细节).
怎么让PC发出哔哔声?
UPDATE
为什么&0xF在这里使用?不应该0xFF吗?
PC有一个8255定时器芯片,使用端口0x61,0x43和0x42进行控制.
当端口0x61位0设置为1时,这意味着"打开连接到扬声器的定时器".当端口0x61位1设置为1时,这意味着"打开扬声器".
这是在代码的第一段中完成的.
第二部分将"魔术值"0xB6置于端口0x43上,这意味着到达端口0x42的后续两个字节将被解释为定时器频率的除数.该分区的结果频率(1193180 /除数)将被发送到扬声器.
http://gd.tuwien.ac.at/languages/c/programming-bbrown/advcw3.htm#sound