3.6.3.Функции для работы с портами ввода. Микропроцессоры семейства 80/86 могут обращаться к 65536 портам ввода и вывода. При этом возможна передача байта как слова ( двух байтов ) данных.
В Сu функции ввода/вывода в порты имеют вид :
inportb-ввод байта из порта ;
outportb-вывод байта из порта ;
inport-ввод слова из порта ;
outport-вывод слова из порта .
Эти функции описаны в заголовки файла dos.h. Прототипы функций:
unsigned char inportb ( unsigned port ) ;
void outportb ( unsighed port ,unsigned char value ).
Примеры применения этих функций :
/* input.cpp. Иллюстрация функции ввода из порта */
# include <stdio.h>
# include <dos.h>
main( )
{
unsigned char result ;
unsigned port=0 ; // Адрес порта
result =inportb ( port ) ;
printf (“ Принятый байт из порта %d равен Ox%x\n”,port ,result);
return 0;
/*outport.cpp Иллюстрация функции вывода в порт */
# include <stdio.h>
# include <dos.h>
main( )
{
unsigned port=0; // Адрес порта
char value=’c’;
outport(port,value);
printf(“Значение %с послано в порт %Q\n “,value ,port);
return 0;
}
Функции работы с портами имеются и в заголовочном файле conio.h:
inp-ввод байта из порта;
outp-вывод байта из порта;
inpw-ввод слова (два байта) из порта;
outw-вывод слова в порт.
Рассмотрим применение функций работы с портами для программы управления звуком. В РС ХТ/AT стандартный канал управления звуком SPEAKER рассчитан на подключение высокоомного малогабаритного динамика. Функциональная схема приведена на рис. 1 Звук формируется из сигнала типа “меандр” на выходе счётчика СТ2 таймера 8253 (для ХТ) или 8254 (для АТ). Подачей лог. 1 или 0 на вход GATE2 можно управлять работой счётчика. Кроме того, открывать или закрывать вентиль “И” 1-м разрядом на выходе системного порта с адресом 61Н .
Счётчик СТ2 должен работать в режиме 3-генератора прямоугольных импульсов. Определим число N , которое необходимо загрузить в счётчик для генерации звука частоты 440 Гц (нота ЛЯ первой октавы):
N=1931800/440=4390,45 (1126H).
Управляющее слово для работы СТ2 в режиме 3, счёт двоичный , загружаются два байта (сначала младший, потом старший):
10110110В=36Н
Допустим, что необходимо генерировать звук частоты 440 Гц импульсами с частотой 0,5 Гц (импульс 1с и пауза 1с) .Генерация звука прекращается при нажатии любой клавиши. Необходимо учесть также, что изменять ряды D7-D2 порта 61Н нельзя (они выполняют системные функции).
/*speaker.cpp.Программа генерации звука*/
#include<stdio.w>
#include<dos.h> // Здесь протатип inportb( ), outport( ), delay( )
#include<conio.w> // Здесь протатип kbhit( )
#define CTRL_PT 0*43 // Регистр управляющего слова таймера
#define CTRL_WD 0*36 // Управляющее слово для СТ2
#define CT2 0*42 // Адрес счётчика СТ2
#define N_LOW 0*26 // Младший байт числа N
#define N_HIGH 0*11 // Старший байт числа N
#define SYS_PTR 0*61 // Адрес системного порта
main( )
{
unsigned char ch1,ch2;
outportb(CTRL_PT,CTRL_WD);
outportb(CT2,N_LOW);
outportb(CT2,N_HIGH);
ch1=inport(SYS_PTR); // Чтение состояния системного порта
ch2=ch1; // Создаём копию
ch2=ch1 | 0*3; // Устанавливаем единицу в разрядах D1 и D0
while( !kbhit( ) )
{
outportb(SYS_PRT,ch2); // Включите динамик
delay(1000); // Задержка на 1 с
ch2=ch&0*fd; // Обнуляем D1=0
outport(SYS_PRT,ch); // Выключить динамик
delay(1000);
ch2=ch2 / 0*2; // Установить D1=1
}
outport(SYS_PRT,ch1);
return 0;
}
Задание. Наберите текст программы speaker.cpp и исследуйте её
Таймер
f=1,9318 MГц
Адрес РУС=43Н
|
|||||||
Системные функции
Системный порт 61Н
Рис.1 Функциональная схема канала управления звуком в РТ ХТ/AT
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.