Справочник программиста на персональном компьютере фирмы IBM. Таймеры и звук - Гудок динамика
ОГЛАВЛЕНИЕ
2.2.4 Гудок динамика.
Некоторым программам требуется набор предостерегающих гудков.
Их легко создавать на Бейсике, но операционная система не обеспе-
чивает функцию гудка, как таковую, и только косвенно позволяет
получать доступ к гудку, который Вы слышите при старте системы.
Для изменения тона вся процедура генерации звука должна быть
запрограммирована на низком уровне. Для того чтобы гудок соот-
ветствовал подаваемому им сигналу необходимо проявить воображе-
ние. Для предсказания близкой опасности создайте набор понижаю-
щихся тонов [2.2.7] или, если принтер включен, чередуйте гудки
динамика компьютера и принтера (вывод кода ASCII 7 на принтер).
Высокий уровень.
В Бейсике просто напишите BEEP. Вот кусочек кода, который
реагирует на вероятную ошибку гудком и запросом:
100 INPUT "Enter your age",AGE 'запрос возраста
110 IF AGE > 100 THEN BEEP:PRINT"Are you really over 100?"
Для гудков другой частоты и продолжительности используйте
оператор SOUND. Его форма: SOUND частота, длительность , где
частота дается в герцах (3000 - середина диапазона), а длитель-
ность дается в восемнадцатых долях секунды. SOUND 3000,18 дает
гудок длительностью около одной секунды. В нижеприведенном приме-
ре динамик быстро переходит от высокого тона к низкому и обратно,
распугивая все живое в ближайшей окрестности.
100 FOR N = 1 TO 200 'установка числа повторений
110 SOUND 500,1 'звук низкой частоты на 1 секунду
120 SOUND 5000,1 'звук высокой частоты на 1 секунду
130 NEXT 'повтор
Средний уровень.
Операционная система не предоставляет специальной функции для
генерации звука. Но Вы можете вызвать знакомый гудок просто пода-
вая код ASCII 7 на стандартное устройство вывода (т.е. терминал),
используя одну из функций DOS или BIOS. Код ASCII 7 интерпрети-
руется как управляющий символ "звонок" и он не рисуется на экра-
не. Проще всего использовать функцию 2 прерывания 21H:
MOV AH,2 ;функция вывода символа на экран
MOV DL,7 ;посылаем код ASCII 7
INT 21H ;динамик гудит
Низкий уровень.
Для простого гудка лучше всего подходит метод, основанный на
использовании микросхемы интерфейса с периферией 8255 [1.1.1].
Ниже приведен пример, который практически повторяет гудок, кото-
рый Вы слышите при старте системы.
;---гудок динамика
MOV DX,800 ;счетчик числа циклов
IN AL,61H ;читаем порт B 8255
AND AL,0FEH ;выключаем бит таймера 8253
NEXTCYCLE: OR AL,2 ;включаем бит динамика
OUT 61H,AL ;посылаем байт в порт B
MOV CX,150 ;длительность первой половины
CYCLEUP: LOOP CYCLEUP ;задержка пока сигнал высокий
AND AL,0FDH ;выключаем бит динамика
OUT 61H,AL ;посылаем байт в порт B
CYCLEDOWN: LOOP CYCLEDOWN ;задержка пока сигнал низкий
DEC DX ;уменьшаем счетчик циклов
JNZ NEXTCYCLE ;повторяем цикл пока DX не 0