📄 stprin~1.~cp
字号:
//---------------------------------------------------------------------------
//Copyright SATCPRINTER1.0
//Changed by pang xiaohu 9/20/2001
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdlib.h>
#pragma hdrstop
#include "StPrinter.h"
static unsigned short int IoPortBase=0x378;
static long CircleTimes;
unsigned short int MakePrt=0x0F;
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
return 1;
}
//---------------------------------------------------------------------------
int _outp(unsigned short int port, unsigned char val)
{
asm mov dx, port
asm mov al, val
asm out dx, al
asm xor ah, ah
return (_AX);
}
//---------------------------------------------------------------------------
int _inp(unsigned short int port)
{
asm mov dx,port
asm in al,dx
asm xor ah,ah
return _AX;
}
//---------------------------------------------------------------------------
void __stdcall SelectPrinter(int _prt)
{
if (_prt==0) MakePrt=0x0F;
if (_prt==1) MakePrt=0x07;
}
//---------------------------------------------------------------------------
void __stdcall Set_IoPortBase(unsigned short int _ioportbase)
{
IoPortBase=_ioportbase;
}
//---------------------------------------------------------------------------
int __stdcall InitPrinter()
{
int ret;
//set the circletime
long BeginTimeMillis,LapseMillis;
BeginTimeMillis=GetTickCount();
for(CircleTimes=0L;CircleTimes<100000000L;CircleTimes++);
LapseMillis=GetTickCount()-BeginTimeMillis;
if(LapseMillis>0L)
CircleTimes=100000000L/LapseMillis;
else
CircleTimes=100000L;
//init the printer
_outp(IoPortBase+2,(unsigned char)0x0); //加0x00,0xff可以激活打印机
Sleep(10);
_outp(IoPortBase+2,(unsigned char)0xff);
Sleep(10);
_outp(IoPortBase+2,(unsigned char)0x08 & MakePrt);
Sleep(10);
_outp(IoPortBase+2,(unsigned char)0xcc & MakePrt);
Sleep(300);
ret=IsPrnStatusOk(); //如果初始化超时,就用0x00,0xff激活
if(ret!=0)
{
_outp(IoPortBase+2,0x0);
Sleep(10);
_outp(IoPortBase+2,0xff);
Sleep(10);
_outp(IoPortBase+2,(unsigned char)0x08 & MakePrt);
Sleep(10);
_outp(IoPortBase+2,(unsigned char)0xcc & MakePrt);
Sleep(200);
if((_inp(IoPortBase+1)&0x80)==0) return ret;
} //如果激活无效,表明打印机故障,返回错误信息
//clear the command buffer
ret=biosprint(0x1B); if(ret!=0) return ret;
ret=biosprint(0x40); if(ret!=0) return ret;
//15-cpi
ret=biosprint(0x1B); if(ret!=0) return ret;
ret=biosprint(0x67); if(ret!=0) return ret;
//cancel condence
ret=biosprint(0x12); if(ret!=0) return ret;
//cancel one_line elongated
ret=biosprint(0x14); if(ret!=0) return ret;
//cancel superscripts and subscripts
ret=biosprint(0x1B); if(ret!=0) return ret;
ret=biosprint(0x54); if(ret!=0) return ret;
//cancel ennhancee printing
ret=biosprint(0x1B); if(ret!=0) return ret;
ret=biosprint(0x46); if(ret!=0) return ret;
//select quick print
ret=biosprint(0x1C); if(ret!=0) return ret;
ret=biosprint(0x78); if(ret!=0) return ret;
ret=biosprint(0x01); if(ret!=0) return ret;
//set left margin 0
ret=biosprint(0x1B); if(ret!=0) return ret;
ret=biosprint(0x49); if(ret!=0) return ret;
ret=biosprint(0x0); if(ret!=0) return ret;
//set right margin 0
ret=biosprint(0x1B); if(ret!=0) return ret;
ret=biosprint(0x51); if(ret!=0) return ret;
biosprint(0x0); if(ret!=0) return ret;
//select proportional spaceing
ret=biosprint(0x1B); if(ret!=0) return ret;
ret=biosprint(0x70); if(ret!=0) return ret;
ret=biosprint(0x0); if(ret!=0) return ret;
//cancel double height printing
ret=biosprint(0x1B); if(ret!=0) return ret;
ret=biosprint(0x77); if(ret!=0) return ret;
ret=biosprint(0x0); if(ret!=0) return ret;
//select draft mode
ret=biosprint(0x1B); if(ret!=0) return ret;
ret=biosprint(0x78); if(ret!=0) return ret;
ret=biosprint(0x01); if(ret!=0) return ret;
//set space 0 between char
ret=biosprint(0x1B); if(ret!=0) return ret;
ret=biosprint(0x21); if(ret!=0) return ret;
ret=biosprint(0x0); if(ret!=0) return ret;
//set char usa
ret=biosprint(0x1B); if(ret!=0) return ret;
ret=biosprint(0x52); if(ret!=0) return ret;
ret=biosprint(0x0); if(ret!=0) return ret;
//set two direction printing
ret=biosprint(0x1B); if(ret!=0) return ret;
ret=biosprint(0x55); if(ret!=0) return ret;
ret=biosprint(0x0); if(ret!=0) return ret;
//cancel auto return
ret=biosprint(0x1B); if(ret!=0) return ret;
ret=biosprint(0x35); if(ret!=0) return ret;
ret=biosprint(0x0); return ret;
}
//
int __stdcall Set_Page_Size(int _pagesize)
{
int ret;
//clear the command buffer
ret=biosprint(0x1B); if(ret!=0) return ret;
ret=biosprint(0x40); if(ret!=0) return ret;
//set page size
ret=biosprint(0x1B); if(ret!=0) return ret;
ret=biosprint(0x43); if(ret!=0) return ret;
if(_pagesize<30){//"以英寸计算"
ret=biosprint(0); if(ret!=0) return ret;
}
ret=biosprint(_pagesize); return ret;
}
//
int __stdcall IsPrnStatusOk()
{
int statue,condition;
long BeginTimeMillis;
BeginTimeMillis=GetTickCount();
do{
statue = _inp(IoPortBase+1);
if (statue == 0x7f) //"打印机掉电"
condition=-10006;
else if ((statue & 0x80) == 0) //"打印机忙"
condition=1;
else if ((statue & 0x40) == 0) //"缺纸错误"
condition=-10001;
else if ((statue & 0x20) == 1) //"缺纸错误"
condition = -10004;
else if ((statue & 0x10) == 0) //online
condition = -10005;
else if ((statue & 0x08) == 0) //"打印机I/O错误"
condition=-10002;
else //"打印机工作正常且空闲"
condition=0;
}while(((GetTickCount()-BeginTimeMillis)<50L)&&(condition==1));
if(condition==1)//"超时错误"
condition=-10003;
return condition;
}
//
int __stdcall Print_Str_Wide(char *_buff)
{
int ret,i;
//set double width
ret=biosprint(0x1b); if(ret!=0) return ret;
ret=biosprint(0x0e); if(ret!=0) return ret;
for(i=0;i<180,_buff[i]!='\0';i++){
ret=biosprint(_buff[i]); if(ret!=0) return ret;
}
//cancle double width
ret=biosprint(0x1b); if(ret!=0) return ret;
ret=biosprint(0x14); if(ret!=0) return ret;
return ret;
}
//
int __stdcall Print_Str(char *_buff)
{
int ret,i;
for(i=0;i<180,_buff[i]!='\0';i++){
ret=biosprint(_buff[i]); if(ret!=0) return ret;
}
return ret;
}
//
int __stdcall Feed_Paper(int _feedline)
{
int ret;
for(int i=0;i<abs(_feedline);i++){
ret=biosprint(0x1B); if(ret!=0) return ret;
if(_feedline>0){
ret=biosprint('J'); if(ret!=0) return ret; //0x4a
}
else{
ret=biosprint('j'); if(ret!=0) return ret;//0x6A;
}
ret=biosprint(30); if(ret!=0) return ret;
}
ret=biosprint(0x20); if(ret!=0) return ret; //the blank
ret=biosprint(0x0D);//the '\r'
return ret;
}
//
int __stdcall End_Page()
{
int ret;
ret=biosprint(0x0c);
return ret;
}
//
int __stdcall biosprint(int data)
{
//test the state
int ret;
long i;
for(int j=0; j<100; j++){
ret=IsPrnStatusOk();
if(ret==0)
break;
else if(ret!=-10003)
return ret;
if(j==99) return -10003;
Sleep(50);
}
_outp(IoPortBase, (unsigned char)data);
for(i=0;i<CircleTimes;i++);
//send the store pulse to the printer
_outp(IoPortBase+2,(unsigned char)0x0d & MakePrt);
for(i=0;i<CircleTimes;i++);
_outp(IoPortBase+2,(unsigned char)0x0c & MakePrt);
for(i=0;i<CircleTimes;i++);
return 0;//"操作成功"
}
void __stdcall Get_PrnErrMsg(int ErrNo,char *ErrMsg)
{
if(ErrNo==-10001)
strcpy(ErrMsg,"打印机缺纸");
else if(ErrNo==-10002)
strcpy(ErrMsg,"打印机I/O错误");
else if(ErrNo==-10003)
strcpy(ErrMsg,"打印机超时");
else if(ErrNo==-10004)
strcpy(ErrMsg,"打印机缺纸");
else if(ErrNo==-10005)
strcpy(ErrMsg,"打印机电源或联线出错");
else if(ErrNo==-10006)
strcpy(ErrMsg,"打印机电源或联线出错");
else
strcpy(ErrMsg,"打印机出现异常错误");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -