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

📄 hzprn.c

📁 点阵式打印机驱动程序,CPU:89C51RD2,含3562个汉字,可打印图形,有1024字节缓冲区
💻 C
字号:
/********************************************************************************/
/*  HzPrn.C  为点阵式汉字打印机编写的程序                                       */
/*  其他模块: HzPrnTy.ASM                                                       */
/*  C P U   : 89C51RD2(64kB)                                                    */
/*  晶    振: 11.0592M                                                          */
/*  程 序 员: 张现                                                              */
/*  修改日期: 2003-5-28                                                         */
/********************************************************************************/
#include <Reg51RD2.h>
#include <HzPrn.h>
#include <Alpha6x8.C>
#include <HzK3562.C>   //code unsigned char HzCode12x12[3783][17];

code  unsigned char BitMask[12] = {0,0,0x80,0x40,0x20,0x10,8,4,2,1,0,0};
xdata unsigned char PrintBuf[1024];
data  unsigned char CacheBuf[32]="信息产业部电子第49研究所\xD";
data  unsigned char Flag;
data  unsigned char LineBuf[12];
data  unsigned char HzKBuf[8*2];  /*** 读EEPROM(24C512)缓冲区: 8个汉字 ***/
data  unsigned char PrintABCD,FetchABCD;
data  unsigned char PrintStep,FetchStep;
data  unsigned char Loop,pStr;
data  unsigned int  Head,End;   /*** 打印缓冲区头, 尾指针 ***/

#pragma disable
void  Interrupt_INT1()  interrupt 2
{
    if( (Flag & fgPrinting) )
    {
        if( PrintStep>99 )
        {
            P1=0xF;   Flag &= ~fgPrinting;
        }
        else
        {
            switch( (PrintStep&3) )
            {
                case  0:  P1 = PrintABCD | 0xE;  break;   /* Print B */
                case  1:  P1 = PrintABCD | 0x7;  break;   /* Print C */
                case  2:  P1 = PrintABCD | 0xB;  break;   /* Print D */
                case  3:  P1 = PrintABCD | 0xD;           /* Print A */
                          Flag |= fgFetchOld;  PrintABCD=FetchABCD;  break;
            }
            PrintStep++;
        }
    }
}
//#define  XON    19
//#define  XOFF   17
#define  XON    '<'
#define  XOFF   '>'
void  Interrupt_RS232() interrupt 4
{
    TI = 0;
    if( RI )
    {
       if( pStr<sizeof(CacheBuf) )
           CacheBuf[pStr++] = SBUF;
       RI = 0;
       if( pStr>(sizeof(CacheBuf)-20) )SBUF=XOFF;
       else if( pStr<10 )SBUF=XON;
    }
}

void  PrintOneLine()
{
    if( !ResetPulsePin )
    {
        while( !ResetPulsePin );
    }
    else
    {
        while( ResetPulsePin );   while( !ResetPulsePin );
    }
    FetchFourDot( );
    FetchStep=PrintStep=0;      Flag |= fgPrinting;     Flag &= ~fgFetchOld;
    while( (Flag&fgPrinting) )
    {
        if( (Flag&fgFetchOld) )
        {
             FetchFourDot( );
        }
    }
    T1 = ~T1;
}

main()
{
    InitConfig();       pStr = 30;
    while( true )
    {
        while( pStr>15 || ExistReturn() )
        {
            P14 = ON;
            if( GraphicLine() )
            {
                PrintOneLine();
            }
            else
            {
                for(Loop=0;   Loop<12;   Loop++)
                {
                    FetchOneLine(Loop);
                    PrintOneLine();
                }
                BlockMove();
            }
        }
        P14 = OFF;
        if( ++Loop==0 && ++FetchStep>35 ) /* 没有字符可打印时灯闪烁 */
        {
            T1=~T1;     FetchStep=0;
        }
    }
}
void  InitConfig()
{
    SCON = 0x50;       /** 10 bits, Enable receive **/
    TMOD = Timer1_BPS; /** T1: mode 2**/
    PCON = 0;
    TH1  = cTH1_11M_BPS9600; /** 11.0592M: 9600BPS  **/
    TCON = 0x45;
    PrintABCD = 0xF;
    TI   = RI = false;
    IE   = E_INT_RS + E_INT_X0 + E_INT_X1;
}
/*
void  FetchLine(unsigned char pLine)  // 8x12
{
    unsigned char i,Tmp;
    for(Tmp=0xF,i=0;  i<4;  i++)
    {
        Tmp *= 2;
        if( (Alpha_Code8x12[CacheBuf[FetchStep/8+i*3]-0x20][pLine] & EBitMask[FetchStep&7]) ) Tmp++;
    }
    FetchABCD=~Tmp;  Flag &= ~2;  FetchStep++;
}

void  FetchOneLine2(unsigned char pLine)
{
    unsigned char i,j,k,Tmp,m,n;
    Flag &= ~(fgFound+fgReturn);
    for(n=m=i=j=k=0;  j<(sizeof(LineBuf)*8);  j++)
    {
        Tmp *= 2;
        if( CacheBuf[i]==0xD )
        {
            Flag |= fgReturn;
        }
        if( CacheBuf[i]>0xA0 )
        {
            if( !(Flag&fgFound) )
            {
                for(m=CacheBuf[i],k=0;  k<(sizeof(HzStr)/2);  k++)
                {
                    if( m==HzStr[k].AxChar[0] )
                    {
                        if( CacheBuf[i+1]==HzStr[k].AxChar[1] ) break;
                    }
                }
                Flag |= fgFound;   m=0;
            }
            if( (HzCode12x12[k][(pLine*3+m/4)/2] & BitMask[2+((m+((pLine&1)?4:0))&7)]) ) Tmp++;
            if( ++m>=12 )Flag&=~fgFound;
        }
        else if( !(Flag&fgReturn) && (j%6) )
        {
            if( (Small_Alpha_Code6x8[CacheBuf[i]-0x20][(j%6)-1] & BitMask[pLine]) ) Tmp++;
        }
        if( !((j+1)%6) && !(Flag&fgReturn) )i++;
        if( !((j+1)&7) )LineBuf[n++]=Tmp;
    }
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -