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

📄 main.c

📁 这是驱动出租车开票打印机的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
 TL0=up_time_l;           //载入抬起时间
 TH0=up_time_h;

 if(insert_line>0)
   {if(plc==0||plc==12)
     {insert_line--;  main_delay(30); IE1=0; EX1=1; goto nodot;}
    }

 if(plc==0)         {if(del_1==1) plc+=2;}
    else if(plc==12) {if(del_2==1) plc+=2;}
    else if(plc==10) {if(del_1==1) plc+=1;}
    else if(plc==22) {if(del_2==1) plc+=1;}

 if(insert_line==0) insert_line=insert_line_bak;

 TR0=1;

 dot_done=0;              //清点打印完成数
 dot_count=0;             //清点计数
 up_or_down=1;            //打印头为抬起
 line_over=0;             //一行打完的标志清零


// if(int_counter==1)       //如果第一次计时
 /// { TR0=1;  back=0;}                 //开定时器
 // else if(int_counter==2) //如果是假计时,
 //   {TR0=0; int_counter=0; EX1=1; }    //关打点计时,清行中断计数,从新打开自己的行中断
  //  else {TR0=0; EX1=1;}
 nodot:
 next_dota=1; next_dotb=1; next_dotc=1; next_dotd=1;

}

//============================================================================

void dot_int(void) interrupt 1 //T0       //点中断
{
 if(back==1)    //如果是在打印头返回状态
     {if(back_counter<35)
          { TL0=down_time_l; TH0=down_time_h;  back_counter++; back=1;}  //重载计数器,计数器加
        else
            { back=0; back_counter=0; TR0=0;line_over=1;  IE1=0; EX1=1; }
              //若没返回到一行,返回标志清零,计数器清0,关打点中断,
      }
   else prt_dotline();
}


//===================================================================
void prt_dotline(void)
{unsigned char x,y;
 if(up_or_down && ET0)      //如果在针抬起状态
    { TL0=down_time_l;            //载入抬起时间地位
      TH0=down_time_h;            //高位
      up_or_down=!up_or_down;     //针状态为打下



      dot_done++;                //一点行已打印过的点数++
      if(dot_done<=(ch_per_head*24)  )  EX1=0;   //如果没到144点,关行复位中断
      else { back=1; m_a=1; m_b=1; m_c=1; m_d=1;
             plc++;      //打完一行,行计数加
            if(plc==12)           //若打完12行
                { flash=1;    //要求更新缓冲
                  if(p_over) {IE1=0; EX1=0; ET0=0;}   //若已打完,关全部中断
                 }
               else if(plc==24)   //若两行都打完
                  {flash=2; plc=0; del_1=del_bak1; del_2=del_bak2;
                   if(p_over)                  //若已打完,关全部中断
                     { IE1=0; EX1=0; ET0=0;}
                  }    //要求更新点缓冲
            }
        //若到了144点,关打点中断,置点行打完标志,点行计数器++,从0--23点行往返
        //若开始打新缓冲页,允许更新缓冲

      x=dot_count/(ch_per_head*6);             //判断是哪个针头打
      m_a=1; m_b=1; m_c=1; m_d=1;
      switch (x)
      {case 0: m_a=next_dota;     //针打下已准备好的电缓冲
               x=dot_count/6;     //缓冲中第几个字节
               y=dot_count%6;     //该字节 第几位
               if((prt_buf[plc].n[x]<<y)&0x80) next_dota=0; //准备下一个点
                else next_dota=1;
         break;
       case 1: m_b=next_dotb;     //针打下已准备好的电缓冲
               x=dot_count/6;     //缓冲中第几个字节
               y=dot_count%6;     //该字节 第几位
               if((prt_buf[plc].n[x]<<y)&0x80) next_dotb=0; //准备下一个点
                else next_dotb=1;
         break;
       case 2: m_c=next_dotc;     //针打下已准备好的电缓冲
               x=dot_count/6;     //缓冲中第几个字节
               y=dot_count%6;     //该字节 第几位
               if((prt_buf[plc].n[x]<<y)&0x80) next_dotc=0; //准备下一个点
                else next_dotc=1;
         break;
       case 3: m_d=next_dotd;     //针打下已准备好的电缓冲
               x=dot_count/6;     //缓冲中第几个字节
               y=dot_count%6;     //该字节 第几位
               if((prt_buf[plc].n[x]<<y)&0x80) next_dotd=0; //准备下一个点
                else next_dotd=1;
         break;
       }
     }
   else if((up_or_down==0) && ET0)    //若针是打下的
      { TL0=up_time_l;    TH0=up_time_h;     //载入打下时间
       // m_a=1; m_b=1; m_c=1; m_d=1;          //针抬起
        up_or_down=!up_or_down;              //置针头标志为抬起
         dot_count+=(ch_per_head*6);         //修改下一个取点位置
        if(dot_count>=(ch_per_head*24-1))  dot_count=dot_count-(ch_per_head*24-1); //修改下一个点的位置
       }

}

//=============================================

void rec_text(void) //interrupt 4
{unsigned char ch=0,k;
 unsigned long int n=0;
 busy=0; rlc=0; p_over=0; del_bak1=1; del_bak2=1;


 while(rlc<max_rec_line )        //当缓冲没满4行
    {while(ch<24)        //当一行没满24字节
      {if(RI==1)         //当串口标志位
           {k=SBUF; RI=0; n=0; if((rlc==max_rec_line -1)&&(ch==1)) busy=1; //收数据,清标志位,当最后一行,变忙
       if((k!=0x0d)&&(k!=0x0a))         //若不是回车
           {rec_buf[rlc].n[ch]=k; ch++;     //接收字符
            if(k>=0xb0)                     //若有中文
                 {if(rlc==0) del_bak1=0;    //抽行标志位
                   else if(rlc==1) del_bak2=0;}
            }                               //若不是回车,写入缓冲
       else if(k==0x0d)                 //若是回车,这一行缓冲剩下的用空格0x00填补
             {if((ch==0)&&((temp!=0x0d)&&(temp!=0x0a)))  nop;
                 else
                     {while(ch<24) {rec_buf[rlc].n[ch]=' ';
                      if((rlc==max_rec_line -1)&&(ch==1)) busy=1; ch++;}
                      }
              }
            else if(k==0x0a&&temp!=0x0d)
              {while(ch<24) {rec_buf[rlc].n[ch]=' '; if((rlc==max_rec_line -1)&&(ch==1)) busy=1; ch++;}
               }
          temp=k;
         }
       //if(rlc>0&&ch>0)
        n++; if(n>15000)
          {p_over=1; first_bag=1; busy=1; goto end;}  //若不是第一行,并且没有数据
       }                                                    //退出
      if(ch>=24) {rlc++;  ch=0;}
     }
 end:
 if(rlc== max_rec_line ||ch==0)
   { rlc--; }
   else if((ch!=0)&&(rlc< max_rec_line ))
     { while(ch<24) {rec_buf[rlc].n[ch]=' '; ch++;}  }
 k=rlc;
 for(;k<max_rec_line ;k--) rec_buf[k].mark=1;
 busy=1;
}

//===============================================================================

void rec_pemeter(void)
{ unsigned char i=0;
  busy=0;
  while(RI==0) ;
  i=SBUF;
  if(i!=0x28) goto no_pemeter;
    else ;

  while(i<17)
  {if(RI==1) {pemeter[i]=SBUF; RI=0; i++;}
   }
 insert_line_bak=pemeter[0];
no_pemeter:
 first_bag=0;
}

//========================================================================

void explain(unsigned char hang)
{unsigned l,c,d;
 unsigned long int add=0;
 if(hang==0) l=0;        //如果在打第一字行 预存字模定位到第二页缓冲区
   else if(hang==1) l=12; //如果在打第二字行 预存字模定位到第一页缓冲区
     else if(hang==2) l=0;
       else if(hang==3) l=12;

 for(d=0;d<12;d++)       //取一个字行的点缓冲
 {for(c=0;c<24;c++)     //取一点行数据
   {if(rec_buf[hang].n[c]<=0x7f)
      {add=rec_buf[hang].n[c]*12;
       prt_buf[d+l].n[c]=READ_SPI_DATA(add+d); }     //如果字符为ASC,取第n行的模
      else if(rec_buf[hang].n[c]>=0xb0)                   //如果为汉字
        {add=((rec_buf[hang].n[c]-0xb0)*96)+(rec_buf[hang].n[c+1]-0xa0);     //取本字节和下个字节的模,并拼成一个汉字,
         add*=24;  add+=0x600;                                 //汉字第二个打印的模,为前一字节的低2位做高位,加后一字节右移2位
         prt_buf[d+l].n[c]=READ_SPI_DATA(add+d*2); prt_buf[d+l].n[c+1]=READ_SPI_DATA(add+d*2+1);
         prt_buf[d+l].n[c+1]=(prt_buf[d+l].n[c]<<6)+(prt_buf[d+l].n[c+1]>>2);  c++;}      //若为汉字,额外加数据指针
     }
  }
 //for(d=0;d<12;d++) prt_buf[d+l].n[0]&=0x7f;
}
//==============================================








//===============================================================

void main_delay(unsigned int i)
{while(i-->0) nop;}

//===============================================================

void uart_init(void)
{SCON  = 0x50;  TMOD = 0x20;
 TH1   = 0xFA;  TL1  = 0xFA;
 PCON &= 0x7f;  TR1  = 1;    ES=0;
}

//================================================================

void system_init(void)
{busy=1;             //置忙
 xdata_used;
 motor=1;            //关电机
 m_a=1; m_b=1; m_c=1; m_d=1;   //针抬起

 EA=0;               //关中断
 IP=0x06;            //中断优先 int3,tr0

 ES=0; TI=0; RI=0;   //关串口中断,清标志位
 TR0=0; ET0=0;       //关定时中断,关定时器
 EX1=0; IT1=1;       //关行中断,边沿出发

}

//================================================================

void prt_init(void)
{
 up_or_down=1;  //1=up; 0=down
 next_dota=1;   //定义下一个要打的a点,
 next_dotb=1;   //定义下一个要打的b点,
 next_dotc=1;   //定义下一个要打的c点,
 next_dotd=1;   //定义下一个要打的d点,
 line_over=0;   //点行打完标志位
 p_over=0;      //打印结束位
 back=0;        //返回过程中标志位
 first_bag=0;   //第一包开始
 del_1=0;       //第一字行缓冲要删行标志位
 del_2=0;       //第二字行缓冲要删行标志位
 del_bak1=0;   //第一字行缓冲要删行标志位预存
 del_bak2=0;   //第二字行缓冲要删行标志位预存
 line_over=0;       //一行打完标志=0
 rec_buf[0].mark=0; //接受行标志=0
 rec_buf[1].mark=0; //接受行标志=0
 dot_done=0;        //清点打印完成数
 dot_count=0;       //清点计数
 plc=0;             //已打印行=0
 insert_line_bak=0; //插入点行=0
 insert_line=0;
 motor=1;


 IE1=0;              //清行中断标志位
 EX1=0;              //开行中断
}









⌨️ 快捷键说明

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