用 LQ-1600 打印机打印 I25 条码

/*┏━━━━━━━━━━━━━━━━━━━━┅?/
/*┃程序名 ... 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 );
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值