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

📄 back.txt

📁 这是驱动出租车开票打印机的程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
                   if(p_over)                  //若已打完,关全部中断
                     { IE1=0; EX1=0; ET0=0;}
                  }    //要求更新点缓冲
            }
        //若到了144点,关打点中断,置点行打完标志,点行计数器++,从0--23点行往返
        //若开始打新缓冲页,允许更新缓冲

      x=dot_count/36;             //判断是哪个针头打
      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+=36;                      //修改下一个取点位置
        if(dot_count>=143)  dot_count=dot_count-143; //修改下一个点的位置
       }
    else ;

}








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

void rec_int(void) //interrupt 4
{unsigned char ch=0,k;
 unsigned int n=0;
 busy=0;   rlc=0; first_bag=0; p_over=0; del_temp1=1; del_temp2=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_temp1=0;
                   else if(rlc==1) del_temp2=0;}
              }        //若不是回车,写入缓冲
           else if(k==0x0d)                   //若是回车,这一行缓冲剩下的用空格0x00填补
             {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>5000)
          {p_over=1; first_bag=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 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; nop;}}


void time_arrange(void)
{unsigned char a;
 unsigned int count,time_long;
 motor=0;
 main_delay(30000);        //来回计时求平均数
 a=0; time_long=0;
 while(rst_det==1) ;
 main_delay(3);
 while(rst_det==0) rst_det=1;
 main_delay(3);
 while(rst_det==1) rst_det=1;
 main_delay(3);

 while(a<5)
  {count=0;
  // rst_det=1;
   //while(rst_det==1) ;
  // main_delay(1);

 //  while(rst_det==0) rst_det=1;
 //  main_delay(1);

 //  rst_det=1;
 //  while(rst_det==1) ;
//   main_delay(1);

   do
   {count++;rst_det=1;}
   while(rst_det==0);
   main_delay(3);

   do
   {count++;rst_det=1;}
   while(rst_det==1);
   main_delay(3);

   if(count>2500) {a++; time_long+=count;}
   if(a>=5) break;
   }
   motor=1;
   time_long/=12;
   //time_long/=2;
 /*if(time_long>=8500) time_long-=2500;
    else if(time_long>=8000) time_long-=2200;       //分段补偿
    else if(time_long>=7500) time_long-=1800;
    else if(time_long>=7000) time_long-=1500;
    else if(time_long>=6000) time_long-=1300;
    else if(time_long>=5000) time_long-=1100;  */

//   if(time_long>=10500) time_long+=11570;
//    else if(time_long>=10000) time_long+=11580;
 //   else if(time_long>=9500) time_long+=11590;
  //  else if(time_long>=9000) time_long+=11610;
   if(time_long>=8500) time_long+=11620;
    else if(time_long>=8000) time_long-=1560;       //分段补偿
    else if(time_long>=7500) time_long-=1500;
    else if(time_long>=7000) time_long-=1440;
    else if(time_long>=6000) time_long-=1370;
    else if(time_long>=5000) time_long-=1300;


    time_long=0xffff-time_long;
    down_time_l=time_long&0xff;
    down_time_h=time_long>>8;
 }

 void uart_init(void)
{ /*
  SCON   = 0x50;
  TMOD   = 0x20;
  TH1    = 0xFD;
  TL1    = 0xFD;
  PCON  &= 0x7F;                    //串行通信选择方式2
   TR1=1;ES=1;                              //开定时器1用和中断
  */
  SCON   = 0x50;
  TMOD   = 0x20;
  TH1    = 0xFA;
  TL1    = 0xFA;
  PCON  &= 0x7f;
  TR1    = 1;  ES=0;

}


















if(plc==0)
     {rst_det=1; insert_line=insert_line_bak;
      while(insert_line>0)
         {while(rst_det==0) rst_det=1;  main_delay(1);
          while(rst_det==1) rst_det=1; insert_line--;}
      }
   else if(plc==12)
       {rst_det=1; insert_line=insert_line_bak;
        while(insert_line>0)
           {while(rst_det==0) rst_det=1;  main_delay(1);
            while(rst_det==1) rst_det=1; insert_line--;}
        }

⌨️ 快捷键说明

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