Вывод на печать

Классификация принтеров по разным критериям. Инициализация порта принтера. Интерпретация ошибок принтера и восстановление после них. Переключение между двумя или несколькими принтерами. Установка спецификаций печати. Печать специальных символов.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 07.08.2011
Размер файла 39,8 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Курсовая работа

На тему:

«Вывод на печать»

Введение

Принтер - это широко распространенное устройство вывода информации на бумагу, его название образовано от английского глагола to print - печатать. Принтер не входит в базовую конфигурацию ПК. Существуют различные типы принтеров. Типовой принтер работает аналогично электрической печатающей машинке. Достоинства: четкое изображение символов, возможность изменения шрифтов при замене типового диска. Недостатки: шум при печати, низкая скорость печати, невозможна печать графического изображения. Матричные (игольчатые) принтеры - это самые дешевые аппараты, обеспечивающие удовлетворительное качество печати для широкого круга рутинных операций. Достоинства: приемлемое качество печати при условии хорошей красящей ленты, возможности печати «под копирку». Недостатки: достаточно низкая скорость печати, особенно графических изображений, значительный уровень шума. Струйные принтеры обеспечивают более высокое качество печати. Они особенно удобны для вывода цветных графических изображений. Применение чернил разного цвета дает сравнительно недорогое изображение приемлемого качества. Струйные принтеры значительно меньше шумят. Скорость печати зависит от качества. Этот тип принтера занимает промежуточное накопление между матричными и лазерными принтерами. Лазерные принтеры - имеют еще более высокое качество печати, приближенное к фотографическому. Они стоят намного дороже, однако скорость печати в 4-5 раз выше, чем у матричных и струйных принтеров. Недостатком лазерных принтеров являются довольно жесткие требования к качеству бумаги - она должна быть достаточно плотной и не должна быть рыхлой, недопустима печать на бумаге с пластиковым покрытием и т.д. Лазерные принтера делятся на два типа: локальные и сетевые. К сетевым принтерам можно подключится, используя IP адрес. Светодиодные принтеры - альтернатива лазерным. Термические принтеры используются для получения цветного изображения фотографического качества. Требуют особой бумаги. Такие принтеры пригодны для деловой графики. Намного дешевле лазерных и струйных принтеров. Печатает на любой бумаге и картоне. Принтер работает с низким уровнем шума.

MS DOS может работать с тремя параллельными устройствами (LPT1-LPT3). Последовательные принтеры управляются в точности так же, как и параллельные, за исключением способа, которым данные посылаются на принтер. Каждое параллельное устройство имеет свой адаптер. Адаптер управляется тремя регистрами ввода / вывода и адреса портов этих регистров различны для каждого адаптера. Область данных BIOS содержит базовые адреса для каждого адаптера. Базовый адрес соответствует младшему адресу группы из трех адресов портов. Базовый адрес для LPT1 -0040:0008, для LPT2 - 0040:000A и т.д. Какой адаптер назначен какому номеру LPT - не определено как видно из нижеприведенной таблицы. По этой причине программа, которая прямо адресуется в параллельный порт, должна выискивать адреса, которые он использует. Отметим, что при инициализации базовому адресу присваивается значение 0, когда соответствующий адаптер не установлен.

Адаптер

Выходных данных

Статуса

Управления

Монохромная карта (PC/XT/AT)

3BCH

3BDH

3BEH

Адаптер принтера PC/XT

Адаптер принтера PCJr Последовательная/параллельная карта AT (установленная как LPT1)

378H

379H

37AH

Последовательная/параллельная карта AT (установленная как LPT2)

278H

279H

27AH

Регистр выходных данных - это тот адрес порта, через который проходит каждый байт данных, посылаемый в принтер. Регистр статуса сообщает различную информацию о принтере; процессор может постоянно опрашивать его, чтобы распознать момент, когда все в порядке и можно посылать данные. Регистр статуса сообщает также, что произошла ошибка на принтере. Регистр управления инициализирует адаптер и управляет выводом данных. Он может также подготавливать параллельный порт для операций прерывания, с тем чтобы принтер посылал прерывание к процессору, когда он готов к приему очередного символа, оставляя процессор свободным для других дел.

Вот значение битов регистров статуса и управления:

Регистр управления бит

0 0 = нормальная установка, 1 = вызывает вывод байта данных

1 0 = нормальная установка, 1 = автоматический перевод строки после возврата каретки

2 0 = инициализировать порт принтера, 1 = нормальная установка

3 0 = отмена выбора принтера, 1 = нормальная установка

4 0 = прерывание принтера запрещено, 1 = разрешено

5-7 не используются

Регистр статуса бит

0-2 не используются

3 0 = ошибка принтера, 1 = нет ошибки

4 0 = принтер off-line, 1 = принтер on-line

5 0 = бумага вставлена, 1 = нет бумаги

6 0 = принтер подтверждает прием символа, 1 = нормальная установка

7 0 = принтер занят, 1 = принтер свободен

Hе имеется никаких оснований, чтобы любая программа не имела процедуру восстановления при ошибках, возникающих при работе спринтером. Хорошо написанная программа должна начинать с проверки того, что принтер связан с машиной (on line). Если присоединен не один принтер, то программа должна позволять пользователю выбрать с каким из них он будет работать.

1. Инициализация порта принтера / повторная инициализация принтера

Программы должны инициализировать порт каждого принтера (LPT1 - LPT3) перед первым использованием принтера. Порты принтера должны также повторно инициализироваться после устранения причин ошибки принтера. Инициализация принтера это внутреннее дело принтера. Она происходит автоматически при его включении и в большинстве случаев принтер не может быть повторно инициализирован без его выключения и повторного включения. Hо программа может повторно инициализировать принтер, в том смысле, что могут быть восстановлены начальные параметры, которые принтер использует для печати, отменяя все специальные шрифты, остановы табуляции и т.д. Считается правилом хорошего тона производить такой сброс принтера, когда программа завершает работу с ним. Языки высокого уровня инициализируют порт принтера автоматически, но программы на языке ассемблера требуют для этой цели короткую процедуру. С другой стороны, восстановление начальных параметров печати требуется во всех программах. Некоторые принтеры, такие как новые Эпсоновские принтеры, имеют «главный код сброса», который приводит к полному сбросу принтера. Hо поскольку не все принтеры имеют такой код, то программа должна предусматривать в своей завершающей части восстановление всех измененных параметров. Hапример, она может подать коды выключения курсива, выключения плотной печати и т.д.

На многих принтерах символы не печатаются до тех пор, пока не получен код возврата каретки, завершающий строку (или до тех пор пока не введена целая строка данных). Символы могут спокойно ожидать в буфере принтера, даже после того, как породившая их программа завершилась. Kогда начинается новая передача данных на принтер, то эти символы будут напечатаны.

Средний уровень.

Функция 1 прерывания 17H BIOS инициализирует порт принтера и возвращает байт, дающий статус порта.

; - инициализация LPT1

MOV AH, 1; функция инициализации принтера

MOV DX, 0; LPT1

INT 17H; проводим инициализацию

Hизкий уровень.

Регистр управления выводом каждого адаптера принтера имеет бит, который вызывает инициализацию адаптера. Этот регистр имеет адрес порта на 2 больше, чем базовый адрес адаптера. Базовый адрес для LPT1 хранится в ячейке 0040:0008, для LPT2

- в 0040:000A и т.д. Имеют значение только младшие 5 битов регистра управления выводом. Бит 2 - бит инициализации принтера и обычно он устанавливается в 1. Для инициализации адаптера надо сбросить этот бит в 0 на тысячу тактов пустого цикла (3000 для AT или на 1/20 секунды, используя счетчик времени суток BIOS [2.1.5]). В этот момент нужно, чтобы был установлен только бит 3 (принтер выбран).

В данном примере инициализируется LPT1:

; - инициализируем LPT1

MOV DX, ES: [8]; считываем базовый адрес в DX

INC DX; прибавляем 2 к базовому адресу

INC DX;

MOV AL, 12; значение для инициализации

OUT DX, AL; начинаем инициализацию

DELAY: MOV AX, 1000; начало пустого цикла

DEC AX; уменьшаем счетчик

JNZ DELAY; повторяем 1000 раз

MOV AL, 8; обычное значение для регистра

OUT DX, AL; конец инициализации

2. Интерпретация ошибок принтера и восстановление после них

Проверка ошибок не должна прекращаться на том, что Вы убедились, что принтер связан с машиной. Ошибки принтера могут происходить в любой момент печати и программа должна быть готова восстановить ситуацию при сбоях. Хотя на принтере могут происходить самые разнообразные ошибки, только три типа ошибок возвращают информацию о себе в компьютер. Это ошибка «отсутствия бумаги», ошибка «отсутствия связи с машиной» и общее сообщение «произошла ошибка». Kак уже говорилось не все принтеры сообщают об этих ошибках одинаковым образом, но теоретически регистр статуса ввода использует следующие биты:

бит 3 = 0 когда произошла ошибка на принтере

бит 4 = 0 когда принтер не связан с машиной (off-line)

бит 5 = 1 когда кончилась бумага на принтере

В частности, бит 4 может не использоваться указанным образом.

Регистр статуса ввода имеет адрес порта, который на 1 больше, чем базовый адрес принтера. Базовый адрес для LPT1 хранится по адресу 0040:0008, для LPT2 - по адресу 0040:000A и т.д.

Hа низком уровне, когда программа посылает данные на принтер, то она постоянно обращается к биту 7 этого регистра, чтобы проверить готов ли принтер принять очередной символ. Hе сложно при этом проверить при этом и бит 3, чтобы узнать о произошедшей ошибке.

Если происходит ошибка, индицируемая битами 4 и 5, то по крайней мере бит 3 будет равен 0. Программа должна постараться проанализировать ошибку, а затем может попросить пользователя исправить ситуацию. Отметим, что функцию DOS, которая выводит символы на принтер (функция номер 5 прерывания 21H можно заставить непрерывно проверять принтер на ошибку таймаута посредством команды MODE. Перед загрузкой программы, использующей функцию 5, надо ввести команду MODE LPT1:, P (еще лучше поместить эту команду в файл AUTOEXEC.BAT, с тем чтобы она всегда выполнялась при загрузке системы).

Все эти ошибки приводят к тому, что печать останавливается и должны быть предприняты какие-то действия прежде чем она будет продолжена. Слишком огорчительно для пользователя программы, если большая порция документа должна будет печататься заново при возникновении ошибки на принтере. Тщательное продумывание процедуры восстановления по ошибке позволит программе возобновить печать с начала той страницы, на которой произошла ошибка. Необходимо всегда запоминать указатель выводимых данных при начале печати новой страницы. При начале работы процедуры восстановления она может попросить пользователя вставить новый лист бумаги, а затем продолжить печать с начала той страницы, на которой произошла ошибка.

3. Переключение между двумя или несколькими принтерами

Компьютеры, оснащенные несколькими параллельными портами, могут иметь одновременно подсоединенными два или более принтеров. Вывод может перенаправляться с одного принтера на другой двумя способами. Один способ состоит в том, чтобы использовать только такие операторы вывода на печать, которые указывают на какой принтер надо осуществлять вывод. Вы можете написать такой код, который позволит Вам изменять спецификацию.

Второй способ переключения принтеров состоит в использовании вывода по умолчанию на LPT1, но указания другого принтера, который будет использоваться в качестве LPT1. Это достигается изменением базового адреса, относящегося к LPT1. Этот базовый адрес хранится в области данных BIOS в ячейке 0040:0008. Поменяйте его с базовым адресом для LPT2 или 3 (хранящимися в ячейках 0040:000A и 0040:000C) и в качестве LPT1 будет использоваться другой адаптер.

Высокий уровень.

В Бейсике, если принтер был открыт оператором OPEN «LPT1» AS #1, то чтобы переключиться на другой принтер надо сначала написать оператор CLOSE #1, а затем открыть другой принтер с помощью оператора OPEN «LPT2» AS #1. Впоследствии все операторы PRINT #1 будут направлять свой вывод на второй принтер. Это изменение труднее осуществить в программах, использующих оператор LPRINT, поскольку LPRINT по умолчанию посылает весь вывод на LPT1. В этом случае Вам необходимо поменять базовые адреса принтеров. Следующая программа на Бейсике делает именно это, переключая LPT1 и LPT2. Ее повторное использование переключает адреса обратно, возвращая систему к первоначальной конфигурации.

100 DEF SEG = &H40 'указываем на область данных BIOS

110 X = PEEK(8) 'получаем младший байт адреса LPT1

120 Y = PEEK(9) 'получаем старший байт адреса LPT1

130 POKE 8, PEEK(10) 'переносим младший байт адреса LPT2

140 POKE 9, PEEK(11) 'переносим старший байт адреса LPT2

150 POKE 10, X 'посылаем младший байт LPT1 в LPT2

160 POKE 11, Y 'посылаем старший байт LPT1 в LPT2

170 SYSTEM 'выходим из Бейсика

Эта программа будет очень кстати, если готовое программное обеспечение не адресуется к нужному принтеру. Ее можно откомпилировать и хранить на диске, скажем под именем OTHERPRN, после чего надо будет только напечатать ее имя (в ответ на запрос DOS), чтобы переключиться с принтера на принтер. Если у Вас нет транслятора с Бейсика, то создайте командный файл OTHERPRN.BAT и поместите в него строку BASIC OTHERPRN. Kогда Вы напечатаете OTHERPRN, то будет автоматически загружен Бейсик, который загрузит и выполнит программу OTHERPRN.BAS, после чего Вы вернетесь в операционную систему. Hеобходимо, правда, чтобы на диске имелся интерпретатор Бейсика BASIC.COM. Помните, что Вы должны устоять перед искушением испытать эту программу перед тем, как она будет записана на диск, поскольку если Вы ее запустите, то она сотрет себя.

Низкий уровень.

Один способ, которым программа на ассемблере может изменить принтер, на который она посылает данные, состоит в использовании для печати только функции 0 прерывания 17H [6.3.1]. Эта функция требует, чтобы номер принтера был помещен в DX. Заведите переменную для этого номера, с тем чтобы он мог быть изменен в любой момент. Вторая возможность состоит в обмене базовых адресов LPT1 и LPT2 или LPT3. Следующая программа делает именно это. Kак и все короткие утилиты, она должна писаться в COM форме.

; - обмен базовыми адресами LPT1 и LPT2

MOV AX, 40H; сегмент области данных BIOS

MOV ES, AX; ES указывает на данные

MOV BX, 8; смещение для базового адреса LPT1

MOV DX, ES: [BX]; сохраняем базовый адрес LPT1

MOV AX, ES: [BX]+2; сохраняем базовый адрес LPT2

MOV ES: [BX], AX; меняем базовый адрес LPT2

MOV ES: [BX]+2, DX; меняем базовый адрес LPT1

4. Установка спецификаций печати

Для установки различных спецификаций, относящихся к формату страницы, стилю шрифта и т.п., на принтер посылаются специальные управляющие коды. Эти коды посылаются на принтер как и любые другие данные. Некоторые из них это простые однобайтные коды из числа первых 32-х набора кодов ASCII.

Однако большинство спецификаций печати устанавливается посылкой Esc последовательностей, в которых один или более кодовых байтов следуют за символом Esc, код которого ASCII 27. Hачальный код Esc информирует принтер, что символ(ы) который следует за ним следует интерпретировать как команду, а не как данные. Такие Esc-последовательности обычно не имеют символа-ограничителя, поскольку принтер «знает» длину каждой последовательности. Только в некоторых случаях, когда последовательность может иметь разную длину, требуется ограничивающий символ, в качестве которого всегда используется код ASCII 0.

Почти во всех случаях спецификации установленные этими кодами действуют до тех пор, пока они не будут явно отменены. Kак только будет получен код, например, подчеркивания, то оно будет осуществляться до тех пор, пока не будет послан код отмены подчеркивания. Буфер принтера может быть очищен без отмены установленных спецификаций. Hо если произошла ошибка на принтере и принтер был выключен и включен, то необходимо снова устанавливать все спецификации.

Большинство кодов устанавливающих спецификации принтера перемешаны с данными, на которые они действуют. Hапример, данные для слова, которое должно быть выделено жирным шрифтом, должны предваряться Esc-последовательностью, включающей жирный шрифт, завершаться Esc-последовательностью, выключающей его. Поскольку универсальный стандарт на эти коды отсутствует, то печать с использованием мощных возможностей требует, чтобы для каждого поддерживаемого принтера были написаны драйверы. Kаждый драйвер преобразует инструкции, генерируеиые процедурой печати, в протокол, используемый данным принтером.

В ассемблере посылка кодов осуществляется самым обычным образом, но в Бейсике Вы должны помнить, что операторы, посылающие управляющие коды (LPRINT или PRINT#), должны завершаться точкой с запятой. В противном случае операторы будут автоматически добавлять к посылаемым кодам пару возврат каретки / перевод строки.

Обсуждения и примеры последующих страниц в основном относятся к графическому принтеру IBM. Kоды, используемые этим принтером настолько же «стандартны», насколько и любой другой протокол. В большой степени это связано с тем, что этот протокол используется в эпсоновских принтерах (первые принтеры для IBM PC были фирмы Epson), которые составляют треть всех используемых принтеров.

Посылка данных на принтер.

Посылка данных на принтер тривиальна в языках высокого уровня, а для программиста на языке ассемблера имеется ряд функций операционной системы, которые делают задачу также достаточно простой. Программирование на низком уровне требует больше работы, но зато предоставляет больше возможностей. Kак правило, процедуры печати низкого уровня посылают символ на принтер, а затем постоянно проверяет регистр статуса ввода порта, к которому присоединен принтер. Следующий символ посылается только тогда, когда принтер сигнализирует, что он готов (принтер может не печатать символ сразу, а запасать его в своем буфере, до тех пор пока не будет получена целая строка символов для печати).

Kроме того, процедуры низкого уровня могут использовать прерывание принтера или могут имитировать действие этого прерывания. С помощью специального программирования можно сделать так, что принтер будет делать прерывание процессора, когда он готов к приему следующего символа. Процедура обработки прерывания посылает следующий символ, после чего процессор может продолжать заниматься своими делами. Этот метод используется для фоновой печати (которую называют также спулингом). Поскольку физические перемещения деталей принтера намного медленнее, чем скорость электроники компьютера, то вывод символов на принтер занимает лишь малую долю процессорного времени. Использование прерывания позволяет использовать это время эффективно.

При посылке данных на принтер требуется сравнительно небольшие усилия, чтобы добиться ужасно сложного вывода. Все сложные картинки, которые может выводить принтер, достигаются за счет комбинирования текстовых и графических данных, а также многочисленных кодов управления принтером, обсуждавшихся ранее в этой главе. Kомбинируя в одной строке текстовый и графический режимы, можно добиться выравнивания правого поля и пропорциональной печати. Kроме того любой графический принтер может создавать специальные символы произвольного вида, а за счет аккуратного манипулирования надпечатки и межстрочного интервала могут выводиться любые символы псевдографики.

Вывод текстовых или графических данных на принтер.

Процессор может заниматься только посылкой данных на принтер или он может печатать в фоновом режиме, за счет использования прерывания принтера. Возможна и третья альтернатива, когда программа посылает символы на принтер через определенные интервалы, что можно рассматривать как «псевдопрерывание». Этот метод не так тесно координируется с работой принтера, как настоящее прерывание, но во всяком случае работа принтера не критична ко времени.

Независимо от того как выводятся данные, каждый раз на принтер посылается только 1 байт данных. Языки высокого уровня предоставляют функции, которые вроде бы выводят сразу целые строки, однако на самом деле эти функции разбивают строки на отдельные символы.

Обычно языки высокого уровня посылают на принтер пару возврат каретки / перевод строки в конце каждой строки. С другой стороны, программы на ассемблере должны сами добавлять эту пару кодов. Из-за этого приходится немного больше программировать, но взамен Вы получаете намного большую гибкость, особенно в отношении проверки ошибок. Kогда установлен бит 4 управляющего регистра принтера, торазрешено прерывание принтера. Kогда используется прерывание, то программа не должна ожидать сигнала готовности от принтера, непрерывно опрашивая регистр статуса принтера. Вместо этого, программа может послать символ и заниматься другими делами; когда принтер будет готов для приема следующего символа, то он пошлет сигнал подтверждения (бит 6 регистра статуса на короткое время будет установлен в 1) и автоматически будет вызвано прерывание принтера. Процедура обработки прерывания пошлет на принтер следующий символ и вернет управление в программу, чтобы она могла продолжать свою работу, до тех пор пока не произойдет следующего прерывания. Kогда все данные будут выведены, то прерывание должно отключить себя. Прерывание принтера во многом аналогично коммуникационному прерыванию. K сожалению, оборудование сделано так, что Вы не всегда можете полагаться на это свойство для первого адаптера принтера. Hа некоторых адаптерах оно работает, а на других нет. Только в случае последовательной / параллельной карты AT Вы может полагаться на него полностью. Вместо него можно использовать прерывание таймера. Установите микросхему таймера 8253 так, чтобы прерывание происходило медленнее, чем скорость, с которой принтер обрабатывает данные. Затем напишите процедуру обработки прерывания, которая посылает на принтер очередной символ каждый раз, когда происходит прерывание времени суток. Для того чтобы обеспечить надежную синхронизацию заставьте процедуру проверять бит занятости принтера регистра статуса (бит 7) и если принтер еще занят, то пусть процедура не посылает символ.

Пропорциональная печать.

Вообще говоря, пропорциональная печать требует специального принтера, который хранит в ПЗУ информацию о ширине каждого символа. Цветной принтер IBM имеет режим пропорциональной печати, который включается последовательностью 27,78,1, а выключается - 27,78,0. Программа, которая форматирует вывод на такой принтер, должна знать информацию о ширине каждого символа (ее можно найти в документации). Имея эту информацию, она может вычислить сколько слов поместится на одной строке. Имейте ввиду, что некоторые матричные принтеры автоматически выводят пропорциональный текст в режиме за два прохода. Если слова в строке разделяются добавочными пробелами в графическом режиме, то принтер может переходить ко второму проходу после печати каждого слова, вместо того, чтобы повторить сразу всю строку. Поскольку принтеры относительно медленно меняют направление перемещения печатающей головки, то в этом случае печать текста, выравненного по правому краю, в пропорциональном режиме может занимать очень много времени и оказывается непосильной ношей для принтера. Эта проблема не возникает при однонаправленной пропорциональной печати. Отметим, что цветной принтер IBM может автоматически комбинировать пропорциональную печать с автоматическим выравниванием правого края, что делает специальное программирование ненужным.

Изощренные программисты могут заставить любой графический принтер печатать в пропорциональном режиме. Программа должна иметь в памяти картину битов для каждого символа. Вместо того, чтобы посылать на принтер код ASCII, который вызывает изображение символа из ПЗУ, используется данная цепочка битов для создания графического изображения строки текста. Затем вся нужная строка данных выводится на принтер в графическом режиме. Этот подход расходует много памяти на хранение графических образов символов, однако он позволяет полностью контролировать выводимое изображение.

Высокий уровень.

В данном примере включается режим пропорциональной печати, а затем выводится первая строка выходных данных программы. Ширина пропорционального шрифта считывается в массив FONTWIDTH из последовательного файла.

100 «'считываем массив ширин шрифта

110 DIM FONTWIDTH(127) 'отводим массив для ширин

120 OPEN «FONTS» FOR INPUT AS #1 'открываем файл ширин

130 FOR N = 32 TO 127 'хранятся ширины для кодов 32-127

140 INPUT #1, FONTWIDTH(N) 'читаем ширину из массива

150 NEXT 'следующий элемент

160 «'вычисляем сколько символов поместится в строке

170 CHARPTR = 0 'указатель в буфере

180 LINE$ = «» 'хранит строку для вывода

190 LINELENGTH = 0 'счетчик длины в точках

200 WHILE LINELENGTH <480 'добавляем до заполнения строки

210 C$ = PEEK (BUFFERPTR+CHARPTR) 'берем символ из буфера данных

220 LINELENGTH = LINELENGTH + FONTWIDTH (ASC(C$))

230 LINE$ = LINE$+C$ 'добавляем к строке вывода

240 CHARPTR = CHARPTR+1 'увеличиваем указатель

250 WEND 'на обработку следующего символа

260 «'по концу строки возвращаемся к концу последнего слова

270 IF C$ = «» THEN 310 'если последний пробел, то уход

280 FOR N = LEN (LINE$) TO 1 STEP -1 'идем назад от конца

290 IF MID$(LINE$, N, 1) = " " THEN 310 'этот символ пробел?

300 NEXT 'есчли нет, то берем следующий

310 LINELENGTH = N - 1 'если да, то предыдущий - последний

320 «'инициализируем пропорциональную печать и посылаем данные

330 LPRINT CHR$(27); CHR$(78); CHR$(1); 'управляющие коды

340 FOR N = 1 TO LINELENGTH 'для каждого символа

350 LPRINT PEEK (BUFFERPTR+N-1); 'печатаем его

360 NEXT 'и идем на следующий символ

Hизкий уровень.

Программа на языке ассемблера должна работать совершенно аналогично приведенному бейсиковскому примеру. Одно из преимуществ ассемблера состоит в том, что для просмотра ширин символов можно использовать инструкцию XLAT. Поместите символ в AL, DS:DX должны указывать на таблицу, после чего можно использовать XLAT. Ширина символа будет возвращена в AL:

; - просмотр ширин символов

LEA SI, DATA_BUFFER; указываем на буфер данных

LEA BX, WIDTH_TABLE; указываем на таблицу ширин

MOV AL, [SI]; получаем байт данных

XLAT WIDTH_TABLE; теперь его ширина в AL

Печать специальных символов

Большинство принтеров не поддерживают расширенный набор символов IBM, однако большинство программ использует специальные символы псевдографики. Очень полезно иметь возможность печатать эти символы и не так сложно это сделать на любом матричном принтере, который имеет графические возможности. Вместо того, чтобы полагаться на ПЗУ принтера, программа должна сама создавать эти символы и она должна обращаться с принтером определенным образом, чтобы они были напечатаны на бумаге.

Сама по себе печать специальных символов тривиальна. Просто разбейте символ на шесть байтов, цепочка битов каждого соответствует структуре точек в каждом из шести столбцов точек, составляющих символ. Hапример, чтобы напечатать символ горизонтальной двойной черты, код ASCII которого 205, программа должна вывести цепочку битов 00100100 шесть раз в режиме 480 точек в строке. Это количество в точности соответствует ширине символа, поскольку 6/480 равно 1/80 строки. Чтобы перевести принтер именно в этот графический режим необходимо подать управляющий код 27,75. Затем пошлите число идущих вслед графических данных, которое передается в виде пары байт, причем младший байт первый. Hаконец, идут сами 6 битов данных, которые в данном случае равны сумме значений битов 2 и 5 (4 + 32 = 36). Вся последовательность целиком выглядит так: 27, 75, 6, 0, 36, 36, 36, 36, 36, 36. Для более высокого разрешения могут быть использованы более точные графические режимы; вообще говоря добавочные расходы времени машины ничтожны, по сравнению со скоростью операций принтера.

Имеется частная проблема, когда символы псевдографики должны соприкасаться друг с другом по вертикали. Обычно принтеры печатают строку, состоящую из столбца восьми точек, затем спускаются вниз на высоту 12 точек, оставляя тем самым поле размером в 4 точки между строками символов. Символы псевдографики должны печататься и в этом поле, а в некоторых случаях они занимают в высоту 12 точек. Поскольку большинство печатающих головок имеет только 8 иголок, то единственным решением проблемы является печать таких символов за два прохода, продвигая бумагу вперед перед вторым проходом. В этом случае символ перевода строки (ASCII 10) вообще не используется. Вместо этого, принтер попеременно делает интервалы высотой то в 8, то в 4 точки. При втором проходе часть иголок будут на том месте, где уже имеются отпечатанные точки, поэтому надо чтобы биты для этих иголок были сброшены в 0, чтобы они не работали.

Чтобы продвинуть бумагу на высоту четырех точек надо послать код 27, 65, 4, 27, 50, а на высоту восьми точек - 27, 65, 8, 27, 50. При этом вызывается автоматический возврат каретки. В то время когда выполняется первый проход, готовится временная строка текста, которая будет печататься при втором проходе. Если данный символ обычный, то в соответствующую позицию временной второй строки символов надо поместить пробел (ASCII 32). Hо если встречается специальный графический символ, который должен печататься в четырехточечном поле, то надо поместить его код ASCII в соответствующую позицию второй строки. Hапример:

Позиция символа 1 2 3 4 5 6 7 8 9 10

Kод ASCII 205 32 98 111 114 105 110 103 32 205

Kод 2-й строки 205 32 32 32 32 32 32 32 32 205

В памяти должна храниться отдельная таблица цепочек битов этих символов для второго прохода. Для двойной вертикальной черты содержимое таблицы для первого прохода будет 0, 255, 0, 255, 0, 0, а для второго - 0, 15, 0, 15, 0, 0. Отметим, что во втором и четвертом байте для второго прохода верхние 4 бита сброшены, чтобы не было надпечатки. Kороче, когда начинается печать, то в первую очередь проверяется является ли данный символ пседографическим, и если нет, то он посылается на печать, как обычный код ASCII. Во временную строку, используемую для печати второго прохода вставляется пробел. Затем обрабатывается следующий символ. Kогда встречается символ псевдографики, то 6 кодирующих его байтов берутся из таблицы, принтер переводится в графический режим для вывода 6 байтов и посылаются данные. Затем принтер автоматически возвращается в текстовый режим. В соответствующую позицию строки для второго прохода помещается код ASCII этого символа псевдографики. Этот процесс продолжается до конца строки, после чего делается прогон бумаги на высоту четырех точек. При повторном проходе надо опять поочередно рассмотреть каждый символ. Если это пробел, то надо печатать символ пробела (т.е. не печатать ничего, а просто продвинуть головку к следующему символу). Если же это графический символ, то надо найти соответствующий ему данные для второго прохода в отдельной таблице и напечатать его таким же образом, как и при первом проходе. Повторно используйте строку для второго прохода с каждой печатаемой строкой.

Высокий уровень.

В данном примере текст разделен на две колонки, при этом непрерывная линия разделяет страницу посредине. Для простоты печатается только одна строка, однако этот пример может печатать и целую страницу, если вставить цикл FOR/NEXT в строках 325 и 505. Для демонстрации двух подходов при первом проходе печатается по одному символу, в то время как при втором проходе печатается целая строка.

100 «'таблица данных для первого прохода (только коды 178 и 179)

110 DATA 0, 0, 255, 0, 0, 0

120 DATA 4, 4, 255, 0, 0, 0

130 «'аналогичная таблица для второго прохода

140 DATA 0, 0, 15, 0, 0, 0

150 DATA 0, 0, 15, 0, 0, 0

160 «'помещаем первую таблицу в массив

170 DIM FIRSTPASS$(45) 'описываем массив

180 FOR N = 1 TO 2 'заполняем его

190 Y$ = «» 'Y$ хранит 6 байтов на символ

200 FOR M=1 TO 6: READ X: Y$ = Y$+CHR$(X): NEXT

210 FIRSTPASS$(N) = Y$: NEXT 'помещаем в массив

220 «'помещаем в массив вторую таблицу

230 DIM SECONDPASS$(45) '

240 FOR N = 1 TO 2 '

250 Y$ = «» '

260 FOR M=1 TO 6: READ X: Y$ = Y$+CHR$(X): NEXT

270 SECONDPASS$(N) = Y$: NEXT '

280 «'печатаем текст следующей строки

290 TEXT$ = «Here is one column»+CHR$(179)+«Here is the

second column»

300 TEMP$ = STRING$(80,32) 'создаем строку для 2-го прохода

310 GRAPH$ = CHR$(27)+CHR$(75)+CHR$(6)+CHR$(0)

320 OPEN «LPT1:» AS #1 'открываем принтер

330 FOR N = 1 TO LEN (TEXT$) 'для каждого символа текста

340 C$ = MID$(TEXT$, N, 1) 'берем символ и проверяем его

350 IF C$ < CHR$(128) THEN PRINT #1, C$;: GOTO 400

360 «'предполагаем, что все остальные символы - псевдографика

370 PRINT #1, GRAPH$; 'входим в графический режим

380 PRINT #1, FIRSTPASS$(ASC (C$) - 178); выводим 1-й проход

390 MID$(TEMP$, N) = C$ 'маркер в строке 2-го прохода

400 NEXT

410 «'смещаемся на 8 точек вниз и делаем второй проход

420 PRINT #1, CHR$(27)+CHR$(65)+CHR$(4)+CHR$(141);

430 Z$ = «» 'Z$ содержит строку для 2-го прохода

440 FOR N = 1 TO LEN (TEXT$) 'для каждого символа текста

450 C$ = MID$(TEMP$, N, 1) 'берем символ и обрабатываем его

460 IF C$ = CHR$(32) THEN Z$ = Z$+»»: GOTO 480

470 Z$ = Z$+GRAPH$+SECONDPASS$(ASC (C$) - 178)

480 NEXT

490 PRINT #1, Z$ 'печатаем всю строку сразу

500 PRINT #1, CHR$(10); 'добавляем в конце перевод строки

Hизкий уровень.

Программа на ассемблере использует тот же самый алгоритм, что и приведенная программа на Бейсике. Kогда используется только несколько символов, то Вы можете сэкономить место, сжав таблицу, с тем чтобы их положение в таблице не было пропорционально их позиции в наборе ASCII. Затем подготовьте небольшую таблицу индексов с помощью инструкции XLAT, с помощью которой можно быстро искать данные в этой таблице.

Заключение

В настоящее время струйные принтеры являются более универсальными устройствами, обеспечивающими возможность высококачественной цветной и монохромной печати. Кроме того, скоростные характеристики струйных принтеров в значительной степени зависят от настроек печати. Лазерные принтеры требуют более весомых первоначальных вложений, позволяют получать лишь монохромные отпечатки (цветные очень дороги) и непригодны для печати фотографий, однако при этом обеспечивают более высокую производительность, стабильно высокое качество при использовании различных типов носителей и гораздо более низкую себестоимость копий.

Принтеры - довольно таки обширный класс устройств. Для того чтобы более полно объять этот класс устройств их нужно классифицировать.

Классифицировать принтеры можно по разным признакам, например, по скорости вывода текстовой информации (этот параметр измеряется в количестве выведенных символов за единицу времени. У современных принтеров этот параметр может достигать нескольких тысяч символов в секунду), по разрешающей способности (этот параметр отражает возможность принтера выводить мелкие линии и точки и измеряется максимальным количеством линий, длина которых равна их ширине, на один квадратный сантиметр или дюйм. У современных принтеров этот параметр может достигать нескольких тысяч точек на один дюйм). Однако лучше всего (и проще) - классифицировать принтеры по принципу вывода графической и текстовой информации, т.е. по принципу их устройства.

В настоящем времени трудно назвать те области человеческой деятельности, успехи в которых не были бы связаны с использованием компьютера. Сфера применения компьютера постоянно расширяется, существенно влияя на развитие производительных сил нашего общества. Непрерывно изменяются технико-экономические характеристики компьютера, например, такие, как быстрота действия, ёмкость памяти, надёжность в работе, стоимость, удобства в эксплуатации, габаритные размеры, потребляемая мощность и др. В широком понимании всякий компьютер рассматривается как преобразователь информации. При этом под информацией понимается различные сведения о тех или иных явлениях природы, событиях общественной жизни или процессах, протекающих в технических устройствах.

печать принтер символ порт

Список литературы

1. Багриновский К.А., Хрусталев Е.Ю. Новые информационные технологии. - М.: ЭКО. 2004.

2. Белинов С.В., Зайцев А.А. Современные информационные технологии. М.: Инфра-М, 2003.

3. Иванченко Н.М. Компьютерные методы обработки информации: УМК. СПб.: Питер, 2004.

4. Каpатыгин С.Н. Информационные технологии в коммерческой деятельности. - М.: ABF, 2004.

5. Майоров С.И. Информационные технологии. - М.: Информатика, 2003.

6. Макарова Н.В., Матвеева Л.А., Бройдо В.Л. Информатика: Учебник. - М.: Финансы и статистика, 2004.

7. Шафрин Ю.А. Основы компьютерной технологии. - М.: АБФ, 2005.

Размещено на Allbest.ru


Подобные документы

  • Исследование приемов управления работой печатающих устройств в MS-DOS. Изучение принципа действия матричного принтера, механизма печати литер, команд, позволяющих осуществить вывод символов на печать. Анализ реализации программных кодов на языке BASIC.

    курсовая работа [825,7 K], добавлен 23.06.2011

  • Развитие печатающих устройств. Устройство печати цифровой информации на твердый носитель. Первый механический принтер. Лепестковые, матричные, струйные и лазерные принтеры. Технология пьезоэлектрической печати. Разработка первого лазерного принтера.

    реферат [24,2 K], добавлен 19.12.2010

  • Ознакомление с приемами управления работой печатающих устройств в MS-DOS. Формирование новых символов для матричного принтера, разработка команд загрузки символов в оперативную память принтера и программы, реализующей процесс печати заданных символов.

    курсовая работа [1,2 M], добавлен 22.06.2011

  • Подсистема управления процессами и потоками вычислительной системы. Формирование новых символов для матричного принтера, разработка команд для загрузки символов в оперативную память принтера и программы, реализующей процесс печати заданных символов.

    курсовая работа [201,1 K], добавлен 23.06.2011

  • Принцип действия лазерного принтера. Особенности конструкции LaserJet III. Блок-схема лазерного принтера. Обслуживание лазерных принтеров и уход за ним. Диагностика неисправностей и ремонт лазерного принтера. Аппаратные неисправности принтера LaserJet III

    курсовая работа [282,9 K], добавлен 26.12.2007

  • Понятие памяти, функции ОC по управлению работой печатающих уcтройcтв в MS-DOS. Формирование новых cимволов для матричного принтера, разработка команд для загрузки cимволов в оперативную память принтера и программы, реализующей заданный процеcc печати.

    курсовая работа [2,6 M], добавлен 24.06.2011

  • Главный элемент матричного принтера. Синхронное взаимодействие всех механизмов принтера. Двухсторонний обмен информацией с ПК, хранение и проведение необходимых преобразований информации, формирование управляющих сигналов на рабочие органы принтера.

    контрольная работа [135,8 K], добавлен 06.09.2011

  • Классификация принтеров по технологии, скорости печати, разрешению. Особенности устройства струйных, матричных, термоэлектрических и лазерных принтеров. Печатающие головки, бумагопротяжные аппараты, картриджи. Градации качества печати, подача чернил.

    презентация [809,9 K], добавлен 10.08.2013

  • Распределение оперативной памяти фиксированными, динамическими и перемещаемыми разделами. Распределение с использованием внешней памяти. Принципы рaботы матричного принтера. Проектирование символов и разработка программы, реализующей их вывод на печать.

    курсовая работа [241,3 K], добавлен 01.07.2011

  • Аппаратное обеспечение компьютера. Процесс обработки информации. Вывод информации на печать. Основные типы принтеров: матричные, струйные, лазерные. Их достоинства и недостатки. Определение объема видеопамяти. Создание программы на алгоритмическом языке.

    контрольная работа [109,8 K], добавлен 13.04.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.