Аппаратное обеспечение IBM PC© Александр Фролов, Григорий ФроловТом 2, книга 1, М.: Диалог-МИФИ, 1992. 7.6. Программирование режимов принтераДля изменения режимов работы принтера и выполнения загрузки шрифтов используются специальные командные последовательности символов. Командные последовательности посылаются в принтер как обычные символы. Вы можете использовать описанные ранее функции MS-DOS или BIOS для вывода этих последовательностей. Признак начала командной последовательности символов - байт ESC с кодом 1Bh. Вслед за этим байтом программа посылает в принтер саму командную последовательность. Длина последовательности зависит от выполняемой команды. Первый байт командной последовательности - код выполняемой команды. Далее следует один или несколько байтов параметра команды. Некоторым командам не предшествует байт ESC (это, например, команды перевода строки, страницы или команды табуляции). Подробное описание всех команд не входит в задачу данной книги. В приложении, однако, приведены полные таблицы команд для принтеров Epson LQ-2550 и Epson FX-1050/850 с краткими пояснениями для каждой команды. Мы опишем подробно лишь несколько команд принтера Epson FX-850/1050 с целью иллюстрации способов программирования с использованием протокола ESC/P. ESC "@" Инициализация принтераДля сброса принтера в исходное состояние программа должна послать на принтер два байта - байт ESC (1Bh) и байт, соответствующий ASCII-символу "@" (40h). 07h Генерация звукового сигналаЕсли послать этот байт, принтер издаст звуковой сигнал. Сигнал удобно использовать для привлечения внимания оператора, например, когда кончилась бумага. 0Dh Возврат кареткиРаспечатываются все символы из буфера принтера, затем каретка (печатающая головка) возвращается к началу строки. В зависимости от переключателя конфигурации SW 2-4 может дополнительно выполняться прогон бумаги на одну строку. 0Ah Перевод строкиКогда этот символ посылается на принтер, все символы, находящиеся во внутреннем буфере принтера, распечатываются, затем каретка возвращается к началу строки и происходит подача листа вперед на одну строку. 0Ch Перевод страницыПринтер распечатывает все символы, находившиеся в буфере, затем выполняет прогон одного листа бумаги. ESC "x" n Выбор качества печати:0 - низкое качество; 1 - качественный шрифт NLQ. Для задания типа шрифта надо вывести на принтер три байта: символ ESC (1Bh), символ "x" (78h), затем код шрифта (30h...31h). Существуют различные команды, позволяющие определить размер межстрочного интервала, расположение левой и правой границ листа, используемый для печати шрифт. Можно выполнять печать графических изображений, о чем мы раскажем немного позже. Если вас не устраивает шрифт, который записан в ПЗУ принтера (например, в нем нет русских букв), вы можете использовать команды для загрузки собственного шрифта. Приведем пример программы, которая посылает в принтер командные последовательности и обычные символы, пользуясь функцией 05h прерывания INT 21h: #include <dos.h> #include <stdio.h> main() { char buffer[] = { 0x1b, '@', // Сбрасываем принтер в исходное // состояние. 7,7,7, // Выдаем 3 раза звуковой сигнал. 0x1b, 'x','0', // Устанавливаем низкое // качество печати. 'S','t','r','i','n','g',' ','1', // Печатаем // строку. 0x1b, 'x','1', // Устанавливаем высокое // качество печати. 'S','t','r','i','n','g',' ','2', // Печатаем // строку. 0x0a, // Переводим строку. 7,7,7, // Выдаем 3 раза звуковой сигнал. 0 }; char *p; // Выводим строку символов на принтер for(p = buffer; *p != 0; p++) bdos(0x05, *p, 0); } Для вывода символа на принтер через функцию MS-DOS здесь использована функция bdos(), входящая в состав стандартных библиотек трансляторов Microsoft QC 2.5 и C 6.0. Первый параметр функции bdos() - номер выполняемой функции прерывания MS-DOS INT 21h, второй - содержимое регистра DX перед вызовом этой функции, и третий - содержимое регистра AL. В комментариях к программе объясняется назначение управляющих последовательностей, посылаемых на принтер. Перед запуском программы необходимо убедиться в том, что принтер включен и находится в состоянии ON LINE, иначе программа перейдет в состояние ожидания. |