/*┏━━━━━━━━━━━━━━━━━━━━┅?/
/*┃程序名 ... I25TMLQ.C ┃*/
/*┃功 能 ... 用 LQ-1600 打印机打印 I25 条码┃*/
/*┗━━━━━━━━━━━━━━━━━━━━┅?/
/*┌───────────────────────────────────┐*/
/*│ 包含头文件区 │*/
/*└───────────────────────────────────┘*/
#include <stdio.h>
#include <dos.h>
/*┌───────────────────────────────────┐*/
/*│ 变量说明区 │*/
/*└───────────────────────────────────┘*/
/* 版权 */
char RightsMsg[] = "LQ-1600K 打印机 I25 条码打印程序/n/r(C)1995 XAC - All Rights Reserved!/n/r/n/r";
/* 图形打印方式控制命令 */
unsigned char ImageCMD[] = { 0x1b,0x2a,0x27,'?','?' };
/* 单向打印控制命令 */
unsigned char PrintDirection[] = { 0x1b,0x55,'1' };
/* 走纸换行命令 */
unsigned char LineFeed[] = { 0x1b,0x4a,0x14,0x0d };
/* I25 条码字符集 */
unsigned char ASCIICode[] = {
'0','1','2','3','4','5','6','7','8','9'
};
/* I25 条码编码(与字符集对应) */
unsigned char *BarCode[] = {
"00011","10001","01001","11000","00101",
"10100","01100","00110","10010","01010"
};
/* 宽窄条空字节数 */
int KBar = 6;
int ZBar = 3;
/* ASCII 编码文件指针 */
FILE *ASCIIfp;
/* ASCII 编码点阵缓冲区 */
unsigned char ASCIIBuffer[ 4096 ];
/* 条码编码缓冲区 */
char Buffer[ 100 ];
/* 一行打印 8 位编码个数 */
int CodeNumALine = 4;
/* 码长+CR+LF */
int CodeLen = 10;
/*┌───────────────────────────────────┐*/
/*│ 子程序区 │*/
/*└───────────────────────────────────┘*/
/* 打印一字符 */
void PrintChar( char ch )
{
union REGS r;
r.h.ah = 0;
r.h.al = ch;
r.x.dx = 0;
int86( 0x17,&r,&r );
}
/* 打印一行条码 */
void PrintALine()
{
int TotalRow,i,j,k,l,m,p;
unsigned char TempBuff[ 4000 ];
l = 0;
/* 按每行打印编码个数循环 */
for( m = 0; m < CodeNumALine; m++ ) {
/* 如果编码结束,则转 */
if( Buffer[ m * CodeLen + 0 ] == 0x1a ) goto CodeEnd;
/* 起始标志 : 窄条,窄空,窄条,窄空 */
for( i = 0; i < ZBar; i++ ) TempBuff[ l++ ] = 0xff;
for( i = 0; i < ZBar; i++ ) TempBuff[ l++ ] = 0x00;
for( i = 0; i < ZBar; i++ ) TempBuff[ l++ ] = 0xff;
for( i = 0; i < ZBar; i++ ) TempBuff[ l++ ] = 0x00;
/* 按 I25 字符集编码位循环 */
for( i = 0; i < 5; i++ ) {
/* 在字符集中搜索用户编码第 1 字符 */
for( k = 0; k < 10; k++ ) {
if( Buffer[ m * CodeLen + 0 ] == ASCIICode[ k ] ) break;
}
/* 判断第 i 位宽窄条 */
if( BarCode[ k ][ i ] == '0' )
for( p = 0; p < ZBar; p++ )
TempBuff[ l++ ] = 0xff;
else {
for( p = 0; p < KBar; p++ )
TempBuff[ l++ ] = 0xff;
}
/* 在字符集中搜索用户编码第 2 字符 */
for( k = 0; k < 10; k++ ) {
if( Buffer[ m * CodeLen + 1 ] == ASCIICode[ k ] ) break;
}
/* 判断第 i 位宽窄空 */
if( BarCode[ k ][ i ] == '0' )
for( p = 0; p < ZBar; p++ )
TempBuff[ l++ ] = 0x00;
else {
for( p = 0; p < KBar; p++ )
TempBuff[ l++ ] = 0x00;
}
}
for( i = 0; i < 5; i++ ) {
/* No.3 */
for( k = 0; k < 10; k++ ) {
if( Buffer[ m * CodeLen + 2 ] == ASCIICode[ k ] ) break;
}
/* 判断第 i 位宽窄条 */
if( BarCode[ k ][ i ] == '0' )
for( p = 0; p < ZBar; p++ )
TempBuff[ l++ ] = 0xff;
else {
for( p = 0; p < KBar; p++ )
TempBuff[ l++ ] = 0xff;
}
/* No.4 */
for( k = 0; k < 10; k++ ) {
if( Buffer[ m * CodeLen + 3 ] == ASCIICode[ k ] ) break;
}
/* 判断第 i 位宽窄空 */
if( BarCode[ k ][ i ] == '0' )
for( p = 0; p < ZBar; p++ )
TempBuff[ l++ ] = 0x00;
else {
for( p = 0; p < KBar; p++ )
TempBuff[ l++ ] = 0x00;
}
}
for( i = 0; i < 5; i++ ) {
/* No.5 */
for( k = 0; k < 10; k++ ) {
if( Buffer[ m * CodeLen + 4 ] == ASCIICode[ k ] ) break;
}
/* 判断第 i 位宽窄条 */
if( BarCode[ k ][ i ] == '0' )
for( p = 0; p < ZBar; p++ )
TempBuff[ l++ ] = 0xff;
else {
for( p = 0; p < KBar; p++ )
TempBuff[ l++ ] = 0xff;
}
/* No.6 */
for( k = 0; k < 10; k++ ) {
if( Buffer[ m * CodeLen + 5 ] == ASCIICode[ k ] ) break;
}
/* 判断第 i 位宽窄空 */
if( BarCode[ k ][ i ] == '0' )
for( p = 0; p < ZBar; p++ )
TempBuff[ l++ ] = 0x00;
else {
for( p = 0; p < KBar; p++ )
TempBuff[ l++ ] = 0x00;
}
}
for( i = 0; i < 5; i++ ) {
/* No.7 */
for( k = 0; k < 10; k++ ) {
if( Buffer[ m * CodeLen + 6 ] == ASCIICode[ k ] ) break;
}
/* 判断第 i 位宽窄条 */
if( BarCode[ k ][ i ] == '0' )
for( p = 0; p < ZBar; p++ )
TempBuff[ l++ ] = 0xff;
else {
for( p = 0; p < KBar; p++ )
TempBuff[ l++ ] = 0xff;
}
/* No.8 */
for( k = 0; k < 10; k++ ) {
if( Buffer[ m * CodeLen + 7 ] == ASCIICode[ k ] ) break;
}
/* 判断第 i 位宽窄空 */
if( BarCode[ k ][ i ] == '0' )
for( p = 0; p < ZBar; p++ )
TempBuff[ l++ ] = 0x00;
else {
for( p = 0; p < KBar; p++ )
TempBuff[ l++ ] = 0x00;
}
}
/* 结束标志 : 宽条,窄空,窄条 */
for( i = 0; i < KBar; i++ ) TempBuff[ l++ ] = 0xff;
for( i = 0; i < ZBar; i++ ) TempBuff[ l++ ] = 0x00;
for( i = 0; i < ZBar; i++ ) TempBuff[ l++ ] = 0xff;
for( i = 0; i < ZBar; i++ ) TempBuff[ l++ ] = 0x00;
for( i = 0; i < 20 * 8 + 5; i++ ) TempBuff[ l++ ] = 0x00;
}
CodeEnd:
/* 设置一行打印字节数 */
TotalRow = l;
ImageCMD[ 4 ] = TotalRow / 256;
ImageCMD[ 3 ] = TotalRow % 256;
/* 打印用户编码 */
PrintChar( 0x0d ); PrintChar( 0x0a );
for( i = 0; i < 5; i++ ) PrintChar( ImageCMD[ i ] );
for( i = 0; i < CodeNumALine * CodeLen; i++ ) {
if( i % CodeLen == 0 ) for( j = 0; j < 24*3; j++ ) PrintChar( 0x00 );
if( Buffer[ i ] == 0x1a ) break;
if( Buffer[ i ] != '?' ) {
k = Buffer[ i ];
for( j = 0; j < 8; j++ ) {
PrintChar( 0x00 );
PrintChar( ASCIIBuffer[ k*16+j ] );
PrintChar( ASCIIBuffer[ k*16+j+8 ] );
}
for( j = 0; j < (36-8-8-8)*3; j++ ) PrintChar( 0x00 );
}
else {
for( j = 0; j < 36*3+3*16*4-12*3; j++ ) PrintChar( 0x00 );
}
}
PrintChar( 0x0d ); PrintChar( 0x0a );
/* 打印条码 */
for( l = 0; l < 4; l++ ) {
for( i = 0; i < 5; i++ ) PrintChar( ImageCMD[ i ] );
for( j = 0; j < TotalRow; j++ ) {
PrintChar( TempBuff[ j ] );
PrintChar( TempBuff[ j ] );
PrintChar( TempBuff[ j ] );
}
/* 打印行间隔 */
for( i = 0; i < 4; i++ ) PrintChar( LineFeed[ i ] );
}
PrintChar( 0x0d ); PrintChar( 0x0a );
}
/*┌───────────────────────────────────┐*/
/*│ 主程序区 │*/
/*└───────────────────────────────────┘*/
main( int argc,char *argv[] )
{
FILE *fp;
char ch;
int ReadNum;
int PageNum = 0,i;
if( argc < 3 ) {
printf( "/nLQ-1600K 打印机 I25 条码打印程序 Ver 1.0/n" );
printf( "(C)1995 XAC - YangTze presents/n" );
printf( "/n使用方法 : I25TMLQ <编码文件> <0/1><回车>/n" );
printf( "说 明 : 编码文件...ASCII文本文件,编码长度为 8 位/n" );
printf( " : 0..........窄行打印纸/n" );
printf( " : 1..........宽行打印纸/n" );
exit( 1 );
}
if( argv[ 2 ][ 0 ] == '1' ) CodeNumALine = 7;
else CodeNumALine = 4;
if( ( ASCIIfp = fopen( "ASCIIPRN.DOT","r+b" ) ) == NULL ) {
printf( "/n错误! 不能打开 ASCIIPRN.DOT 文件!/n" );
exit( 1 );
}
if( fread( ASCIIBuffer,1,4096,ASCIIfp ) != 4096 ) {
printf( "/n读 ASCIIPRN.DOT 文件错误!/n" );
fclose( ASCIIfp );
exit( 1 );
}
fclose( ASCIIfp );
if( ( fp = fopen( argv[ 1 ],"r+b" ) ) == NULL ) {
printf( "/n错误! 不能打开编码文件 : %s/n",argv[ 1 ] );
exit( 1 );
}
for( i = 0; i < 3; i++ ) PrintChar( PrintDirection[ i ] );
ReadNum = 0;
memset( Buffer,'?',100 );
i = 0;
while( RightsMsg[ i ] ) PrintChar( RightsMsg[ i++ ] );
do {
ch = getc( fp );
if( ch != 0x0d && ch != 0x0a && ch != EOF ) Buffer[ ReadNum++ ] = ch;
else Buffer[ ReadNum++ ] = '?';
if( ReadNum == CodeNumALine * CodeLen || ch == EOF ) {
PrintALine();
PageNum++;
if( !( PageNum % 10 ) && ch != EOF ) {
PrintChar( 0x0c );
printf( "/n已打印 %d 页,按任意键打印下一页.../n",PageNum / 10 );
getch();
i = 0;
while( RightsMsg[ i ] ) PrintChar( RightsMsg[ i++ ] );
}
ReadNum = 0;
memset( Buffer,'?',100 );
if( ch == EOF ) {
PrintChar( 0x0c );
fclose( fp );
printf( "/n打印结束!/n" );
exit( 0 );
}
}
} while( 1 );
}
/* 打印一字符 */
void PrintChar( char ch )
{
union REGS r;
r.h.ah = 0;
r.h.al = ch;
r.x.dx = 0;
int86( 0x17,&r,&r );
}
/*┃程序名 ... I25TMLQ.C ┃*/
/*┃功 能 ... 用 LQ-1600 打印机打印 I25 条码┃*/
/*┗━━━━━━━━━━━━━━━━━━━━┅?/
/*┌───────────────────────────────────┐*/
/*│ 包含头文件区 │*/
/*└───────────────────────────────────┘*/
#include <stdio.h>
#include <dos.h>
/*┌───────────────────────────────────┐*/
/*│ 变量说明区 │*/
/*└───────────────────────────────────┘*/
/* 版权 */
char RightsMsg[] = "LQ-1600K 打印机 I25 条码打印程序/n/r(C)1995 XAC - All Rights Reserved!/n/r/n/r";
/* 图形打印方式控制命令 */
unsigned char ImageCMD[] = { 0x1b,0x2a,0x27,'?','?' };
/* 单向打印控制命令 */
unsigned char PrintDirection[] = { 0x1b,0x55,'1' };
/* 走纸换行命令 */
unsigned char LineFeed[] = { 0x1b,0x4a,0x14,0x0d };
/* I25 条码字符集 */
unsigned char ASCIICode[] = {
'0','1','2','3','4','5','6','7','8','9'
};
/* I25 条码编码(与字符集对应) */
unsigned char *BarCode[] = {
"00011","10001","01001","11000","00101",
"10100","01100","00110","10010","01010"
};
/* 宽窄条空字节数 */
int KBar = 6;
int ZBar = 3;
/* ASCII 编码文件指针 */
FILE *ASCIIfp;
/* ASCII 编码点阵缓冲区 */
unsigned char ASCIIBuffer[ 4096 ];
/* 条码编码缓冲区 */
char Buffer[ 100 ];
/* 一行打印 8 位编码个数 */
int CodeNumALine = 4;
/* 码长+CR+LF */
int CodeLen = 10;
/*┌───────────────────────────────────┐*/
/*│ 子程序区 │*/
/*└───────────────────────────────────┘*/
/* 打印一字符 */
void PrintChar( char ch )
{
union REGS r;
r.h.ah = 0;
r.h.al = ch;
r.x.dx = 0;
int86( 0x17,&r,&r );
}
/* 打印一行条码 */
void PrintALine()
{
int TotalRow,i,j,k,l,m,p;
unsigned char TempBuff[ 4000 ];
l = 0;
/* 按每行打印编码个数循环 */
for( m = 0; m < CodeNumALine; m++ ) {
/* 如果编码结束,则转 */
if( Buffer[ m * CodeLen + 0 ] == 0x1a ) goto CodeEnd;
/* 起始标志 : 窄条,窄空,窄条,窄空 */
for( i = 0; i < ZBar; i++ ) TempBuff[ l++ ] = 0xff;
for( i = 0; i < ZBar; i++ ) TempBuff[ l++ ] = 0x00;
for( i = 0; i < ZBar; i++ ) TempBuff[ l++ ] = 0xff;
for( i = 0; i < ZBar; i++ ) TempBuff[ l++ ] = 0x00;
/* 按 I25 字符集编码位循环 */
for( i = 0; i < 5; i++ ) {
/* 在字符集中搜索用户编码第 1 字符 */
for( k = 0; k < 10; k++ ) {
if( Buffer[ m * CodeLen + 0 ] == ASCIICode[ k ] ) break;
}
/* 判断第 i 位宽窄条 */
if( BarCode[ k ][ i ] == '0' )
for( p = 0; p < ZBar; p++ )
TempBuff[ l++ ] = 0xff;
else {
for( p = 0; p < KBar; p++ )
TempBuff[ l++ ] = 0xff;
}
/* 在字符集中搜索用户编码第 2 字符 */
for( k = 0; k < 10; k++ ) {
if( Buffer[ m * CodeLen + 1 ] == ASCIICode[ k ] ) break;
}
/* 判断第 i 位宽窄空 */
if( BarCode[ k ][ i ] == '0' )
for( p = 0; p < ZBar; p++ )
TempBuff[ l++ ] = 0x00;
else {
for( p = 0; p < KBar; p++ )
TempBuff[ l++ ] = 0x00;
}
}
for( i = 0; i < 5; i++ ) {
/* No.3 */
for( k = 0; k < 10; k++ ) {
if( Buffer[ m * CodeLen + 2 ] == ASCIICode[ k ] ) break;
}
/* 判断第 i 位宽窄条 */
if( BarCode[ k ][ i ] == '0' )
for( p = 0; p < ZBar; p++ )
TempBuff[ l++ ] = 0xff;
else {
for( p = 0; p < KBar; p++ )
TempBuff[ l++ ] = 0xff;
}
/* No.4 */
for( k = 0; k < 10; k++ ) {
if( Buffer[ m * CodeLen + 3 ] == ASCIICode[ k ] ) break;
}
/* 判断第 i 位宽窄空 */
if( BarCode[ k ][ i ] == '0' )
for( p = 0; p < ZBar; p++ )
TempBuff[ l++ ] = 0x00;
else {
for( p = 0; p < KBar; p++ )
TempBuff[ l++ ] = 0x00;
}
}
for( i = 0; i < 5; i++ ) {
/* No.5 */
for( k = 0; k < 10; k++ ) {
if( Buffer[ m * CodeLen + 4 ] == ASCIICode[ k ] ) break;
}
/* 判断第 i 位宽窄条 */
if( BarCode[ k ][ i ] == '0' )
for( p = 0; p < ZBar; p++ )
TempBuff[ l++ ] = 0xff;
else {
for( p = 0; p < KBar; p++ )
TempBuff[ l++ ] = 0xff;
}
/* No.6 */
for( k = 0; k < 10; k++ ) {
if( Buffer[ m * CodeLen + 5 ] == ASCIICode[ k ] ) break;
}
/* 判断第 i 位宽窄空 */
if( BarCode[ k ][ i ] == '0' )
for( p = 0; p < ZBar; p++ )
TempBuff[ l++ ] = 0x00;
else {
for( p = 0; p < KBar; p++ )
TempBuff[ l++ ] = 0x00;
}
}
for( i = 0; i < 5; i++ ) {
/* No.7 */
for( k = 0; k < 10; k++ ) {
if( Buffer[ m * CodeLen + 6 ] == ASCIICode[ k ] ) break;
}
/* 判断第 i 位宽窄条 */
if( BarCode[ k ][ i ] == '0' )
for( p = 0; p < ZBar; p++ )
TempBuff[ l++ ] = 0xff;
else {
for( p = 0; p < KBar; p++ )
TempBuff[ l++ ] = 0xff;
}
/* No.8 */
for( k = 0; k < 10; k++ ) {
if( Buffer[ m * CodeLen + 7 ] == ASCIICode[ k ] ) break;
}
/* 判断第 i 位宽窄空 */
if( BarCode[ k ][ i ] == '0' )
for( p = 0; p < ZBar; p++ )
TempBuff[ l++ ] = 0x00;
else {
for( p = 0; p < KBar; p++ )
TempBuff[ l++ ] = 0x00;
}
}
/* 结束标志 : 宽条,窄空,窄条 */
for( i = 0; i < KBar; i++ ) TempBuff[ l++ ] = 0xff;
for( i = 0; i < ZBar; i++ ) TempBuff[ l++ ] = 0x00;
for( i = 0; i < ZBar; i++ ) TempBuff[ l++ ] = 0xff;
for( i = 0; i < ZBar; i++ ) TempBuff[ l++ ] = 0x00;
for( i = 0; i < 20 * 8 + 5; i++ ) TempBuff[ l++ ] = 0x00;
}
CodeEnd:
/* 设置一行打印字节数 */
TotalRow = l;
ImageCMD[ 4 ] = TotalRow / 256;
ImageCMD[ 3 ] = TotalRow % 256;
/* 打印用户编码 */
PrintChar( 0x0d ); PrintChar( 0x0a );
for( i = 0; i < 5; i++ ) PrintChar( ImageCMD[ i ] );
for( i = 0; i < CodeNumALine * CodeLen; i++ ) {
if( i % CodeLen == 0 ) for( j = 0; j < 24*3; j++ ) PrintChar( 0x00 );
if( Buffer[ i ] == 0x1a ) break;
if( Buffer[ i ] != '?' ) {
k = Buffer[ i ];
for( j = 0; j < 8; j++ ) {
PrintChar( 0x00 );
PrintChar( ASCIIBuffer[ k*16+j ] );
PrintChar( ASCIIBuffer[ k*16+j+8 ] );
}
for( j = 0; j < (36-8-8-8)*3; j++ ) PrintChar( 0x00 );
}
else {
for( j = 0; j < 36*3+3*16*4-12*3; j++ ) PrintChar( 0x00 );
}
}
PrintChar( 0x0d ); PrintChar( 0x0a );
/* 打印条码 */
for( l = 0; l < 4; l++ ) {
for( i = 0; i < 5; i++ ) PrintChar( ImageCMD[ i ] );
for( j = 0; j < TotalRow; j++ ) {
PrintChar( TempBuff[ j ] );
PrintChar( TempBuff[ j ] );
PrintChar( TempBuff[ j ] );
}
/* 打印行间隔 */
for( i = 0; i < 4; i++ ) PrintChar( LineFeed[ i ] );
}
PrintChar( 0x0d ); PrintChar( 0x0a );
}
/*┌───────────────────────────────────┐*/
/*│ 主程序区 │*/
/*└───────────────────────────────────┘*/
main( int argc,char *argv[] )
{
FILE *fp;
char ch;
int ReadNum;
int PageNum = 0,i;
if( argc < 3 ) {
printf( "/nLQ-1600K 打印机 I25 条码打印程序 Ver 1.0/n" );
printf( "(C)1995 XAC - YangTze presents/n" );
printf( "/n使用方法 : I25TMLQ <编码文件> <0/1><回车>/n" );
printf( "说 明 : 编码文件...ASCII文本文件,编码长度为 8 位/n" );
printf( " : 0..........窄行打印纸/n" );
printf( " : 1..........宽行打印纸/n" );
exit( 1 );
}
if( argv[ 2 ][ 0 ] == '1' ) CodeNumALine = 7;
else CodeNumALine = 4;
if( ( ASCIIfp = fopen( "ASCIIPRN.DOT","r+b" ) ) == NULL ) {
printf( "/n错误! 不能打开 ASCIIPRN.DOT 文件!/n" );
exit( 1 );
}
if( fread( ASCIIBuffer,1,4096,ASCIIfp ) != 4096 ) {
printf( "/n读 ASCIIPRN.DOT 文件错误!/n" );
fclose( ASCIIfp );
exit( 1 );
}
fclose( ASCIIfp );
if( ( fp = fopen( argv[ 1 ],"r+b" ) ) == NULL ) {
printf( "/n错误! 不能打开编码文件 : %s/n",argv[ 1 ] );
exit( 1 );
}
for( i = 0; i < 3; i++ ) PrintChar( PrintDirection[ i ] );
ReadNum = 0;
memset( Buffer,'?',100 );
i = 0;
while( RightsMsg[ i ] ) PrintChar( RightsMsg[ i++ ] );
do {
ch = getc( fp );
if( ch != 0x0d && ch != 0x0a && ch != EOF ) Buffer[ ReadNum++ ] = ch;
else Buffer[ ReadNum++ ] = '?';
if( ReadNum == CodeNumALine * CodeLen || ch == EOF ) {
PrintALine();
PageNum++;
if( !( PageNum % 10 ) && ch != EOF ) {
PrintChar( 0x0c );
printf( "/n已打印 %d 页,按任意键打印下一页.../n",PageNum / 10 );
getch();
i = 0;
while( RightsMsg[ i ] ) PrintChar( RightsMsg[ i++ ] );
}
ReadNum = 0;
memset( Buffer,'?',100 );
if( ch == EOF ) {
PrintChar( 0x0c );
fclose( fp );
printf( "/n打印结束!/n" );
exit( 0 );
}
}
} while( 1 );
}
/* 打印一字符 */
void PrintChar( char ch )
{
union REGS r;
r.h.ah = 0;
r.h.al = ch;
r.x.dx = 0;
int86( 0x17,&r,&r );
}