1
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);
}

In_8/Out_8从指定端口读取/写入 8 位数据(实现细节省略)。

它是如何使 PC 发出哔哔声的?

更新

为什么&0xF在这里使用?不应该0xFF吗?

4

1 回答 1

5

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

于 2011-05-13T06:00:46.220 回答