⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stprin~1.~cp

📁 该程序用来测试89C51与IDE硬盘的接口
💻 ~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 + -