Страница 14 из 19
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
|