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

📄 ftp.c

📁 富士通微型打印机驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
                                  tempaddr <<= 5;                                          
                                  tempaddr =tempaddr + (i<<1);
                                  tempa = spi_read(tempaddr++);
                                  ByteWrite(tempa);
                                  tempa = spi_read(tempaddr);
                                  ByteWrite(tempa); 
                                  ch_cnt += 2; 
                          }
                          else if (*temp_sp>=' ')
                          {      
                                 tempaddr = *temp_sp++;
                                 tempaddr = (tempaddr<<4) + BLOCK5 + i; 
                                 tempa = spi_read(tempaddr);
                                 ByteWrite(tempa);
                                 ch_cnt += 1;
                          }
                          else
                            {
                                 break;
                            } 
                  }  
                  while (ch_cnt++ <48)
                  { 
                    spi_read(0);
                    ByteWrite(0);
                  }
                  //STB_DIS; 
                  STB_EN;
                  Motor_Step(1);                //启动电机走纸一步
                  LAT_EN;                       //启动锁存信号
                  _NOP(); 
                  LAT_DIS;                      //关闭锁存信号    
                  STB_DIS;                      //加热状态关闭
          } 
        }
        else
        {
		Motor_Step(16); 
	} 
	Motor_Step(ROW_SP);                     //走纸打印行间距       ROW_SP 默认情况值为 3  串口可以设置打印行距
        prn_flag &= ~(1<<prn_tail);             //清除标识
        if (++prn_tail == PRN_BC)       prn_tail = 0;
}       
//FLASH 中取PICTURE块阵列送打印头移位寄存器
void print_pic(uchar index)
{
	uchar i,tempa;
	uchar ch_cnt;
	ulong tempaddr;     
        //Cleasr the printer buffer
        ch_cnt = 0;
        while (ch_cnt++ <48)
        {
          ByteWrite(0);
        }
        LAT_EN;                                //启动锁存信号
        NOP2;
        LAT_DIS;                               //关闭锁存信号
        tempaddr = BLOCK6 + (index*80*48);     //数据保存到FLASH位置
	for(i=0;i<80;i++)
	{
	        ch_cnt = 0;
		while(ch_cnt < 48)
		{    
                    tempa = spi_read(tempaddr++);
                    ByteWrite(tempa);
                    ch_cnt++;
                    if(ch_cnt >= 24)
                    {
                      STB_EN;
                    }
		}
		LAT_EN;                      //启动锁存信号
		NOP2;
		LAT_DIS;                     //关闭锁存信号
		STB_DIS;                     //加热状态关闭
		Motor_Step(1);               //启动电机走纸一步
	}
	Motor_Step(10);                      //走纸发票头与打印内容之间的行距
}



//打印 ASCII 码表     ///////////////////////////
/*void print_asc(void)
{
       uchar i,j,ch_cnt,tempa,*temp_sp;
       ulong tempaddr;//ID;
       i = 0;
       tempa = 0;
       tempaddr = BLOCK5; 
       //tempaddr = BLOCK5;  // + ID; //ID 为所选 ascii 地址块 
       //Motor_Step(1);        //先走纸一步
       for(j=0;j<8;j++)
       {
            for(i=0;i<16;i++)
	       {    
	          //STB_EN;
	          ch_cnt = 0;
	          temp_sp = prn_buff[prn_tail];
                  while(temp_sp - prn_buff[prn_tail] <48)
                  {
                    tempaddr = *temp_sp++;
                    tempaddr = (tempaddr<<4) + BLOCK5 + i; 
                    tempa = spi_read(tempaddr);
                    ByteWrite(tempa);
                    tempaddr++;
                    ch_cnt += 1;  
                  } 
                }
             while (ch_cnt++ <48)
                  { 
                    spi_read(0);
                    ByteWrite(0);
                  }          
                  LAT_EN;                      //启动锁存信号
                  NOP2;
                  LAT_DIS;                     //关闭锁存信号
                  STB_DIS;                     //加热状态关闭
                  Motor_Step(1);               //启动电机走纸一步
	  Motor_Step(3);//走纸打印行距
      } 
      //tempaddr = 0;                  
}*/


//打印命令类型处理程序
void OnPrinterCmd(void)
{
        uchar datain =0;
        uchar  *dPtr;
        if (!printer_mode) return;
        if (prn_cmd_ok)
        {
            switch(prn_cmd)
            {
              case 'J':                     //打印并走纸 N 行      0~255
                  Motor_Step(prn_para1);
                  break;
              case '2':                     //设置行间距          0~255
                  ROW_SP = prn_para1;   
                  break;
              case '*':                     //取消行间距设置
                  ROW_SP = 2;               
                  break;   
              case 'A':                     //打印两倍高度
                  DOUB_HIGH = 1;
                  break;
              case '!':                     //取消双倍高打印
                  DOUB_HIGH = 0;           
                  break;
              case 'B':                     //打印两倍宽
               /* if()
                 {           
                 }
                 else if()
                 {
                 }*/
                  break;
              case 'C':                        //打印机自检        打印ASCII码表和公司标识
                  //print_asc();               //ASCII 码表
                  print_pic(1);                //打印预置公司标识    
                  break;            
              case 'D':                        //标准内容          prn_paral = 0  --> 发票头   prn_paral = 1 --> 公司标识   prn_paral = 2 --> ***  ...   
                  print_pic(prn_para1);
                  break;  
              case 'E':                        //串口发送指令改变串口通信波特率
                  break;    
            }
            prn_cmd = 0;
            prn_para1 = 0;
            prn_cmd_ok = FALSE;
        }
        //字符串打印   
       if (prn_havedata && ((prn_flag & (1<<prn_head))==0) )
       {   
          datain = 0;
          dPtr = &prn_buff[prn_head][0];
          while ((pTU0!=pRU0)&&datain <47 )
          {
              if (*pTU0 == 0x0A) 
              {
                ++pTU0;
                if((printstate_sn&2) == 2)
                {
                  if((pRU0 > pTU0)&&((COM0_LEN + pRU0 - pTU0) >= 512))
                       printstate_sn = 4;
                  else
                  {
                    if((pRU0 < pTU0)&&((pTU0 - pRU0) >= 512))
                       printstate_sn = 4;
                  }
                }
                if(pTU0 >= (COM0 + COM0_LEN))    
                pTU0 = COM0;
                break;
              }
              if (*pTU0 & 0x80)//
              {     //汉字,2字节
                  *dPtr++ = *pTU0++;
                  if((printstate_sn&2) == 2)
                  {
                    if((pRU0 > pTU0)&&((COM0_LEN + pRU0 - pTU0) >= 512))
                        printstate_sn = 4;
                    else
                    {
                      if((pRU0 < pTU0)&&((pTU0 - pRU0) >= 512))
                        printstate_sn = 4;
                    }
                  }
                  if(pTU0 >= (COM0 + COM0_LEN))    pTU0 = COM0;                                 
                  datain ++;
              }
              *dPtr++ = *pTU0++;
              if((printstate_sn&2) == 2)
              {
                if((pRU0 > pTU0)&&((COM0_LEN + pRU0 - pTU0) >= 512))
                    printstate_sn = 4;
                else
                {
                  if((pRU0 < pTU0)&&((pTU0 - pRU0) >= 512))
                    printstate_sn = 4;
                }
              }
              if(pTU0 >= (COM0 + COM0_LEN))    pTU0 = COM0;
              datain ++;                            
          }
          if (datain < 47)              *dPtr = 0;//?
          //下一个缓冲区
          prn_flag |= (1<<prn_head);
          if (++prn_head == PRN_BC)     prn_head = 0;                
          if (pTU0 == pRU0)             prn_havedata = FALSE;   
        }
      print_it();                
}
//清除打印头移位寄存器
void reg_clr(void)
{
    uchar i;
    for(i=0; i<48;i++)
    {
        ByteWrite(0x00);
    }
}
/*************************************/
//步进电机走纸程序
/**************************************/
void Motor_Step(uchar cnt)
{
    uchar i;
    for (i=0;i<cnt;i++)
    {
	print_timer = 0;                  //定时器清0
	MTA_1;   MTB_0; 
	while(print_timer !=1);
	MTA_0;  
  	while(print_timer !=2); 	
	MTB_1;
        while(print_timer !=3);
	MTA_1;  
	while(print_timer !=4);
	MTB_0;
	CLRWTD;
    }
    while(print_timer <5);
    print_timer = 0;                       //定时器清0
    MTA_LOSS;
    MTB_LOSS;
}
//发送数据送帧头
void SENT_HEAD(uchar cmd,uint length)
{ 
  verify0t = 0x55;
  while((UTXIFG0&IFG1)!=UTXIFG0);
    TXBUF0 = 0x55;
    
  while((UTXIFG0&IFG1)!=UTXIFG0);
    TXBUF0 = 0x7a;                                  //发送指令头
  verify0t ^= 0x7a;                                 //获取校验字节
  
  while((UTXIFG0&IFG1)!=UTXIFG0);
    TXBUF0 = cmd;
  verify0t ^= cmd;                                   //获取校验字节
   
  while((UTXIFG0&IFG1)!=UTXIFG0);
    TXBUF0 = length;                                 //送数据长度
  verify0t ^= length;                                //获取校验字节
  
  while((UTXIFG0&IFG1)!=UTXIFG0);
    TXBUF0 = 0;                                      //送保留字
}
//串口发送纸已转载成功处理程序
void paperok_ack(void)
{      
      SENT_HEAD(0,0);                                  //输出帧头
      while((UTXIFG0&IFG1)!= UTXIFG0); 
              TXBUF0 = verify0t;                         //送校验字节 
}
//串口发送缺纸处理程序
void nopaper_ack(void)               
{
      SENT_HEAD(2,0);                                  //输出帧头  
      while((UTXIFG0&IFG1)!=UTXIFG0); 
              TXBUF0 = verify0t;                          //送校验字节 
}
//串口发送打印忙处理程序
void printerbusy_ack(void)
{
      SENT_HEAD(3,0);                                  //输出帧头
      while((UTXIFG0&IFG1)!= UTXIFG0); 
              TXBUF0 = verify0t;                         //送校验字节 
}
//串口发送打印完成状态处理程序
void printerok_ack(void)
{
      SENT_HEAD(1,0);
      while((UTXIFG0&IFG1)!= UTXIFG0); 
              TXBUF0 = verify0t;                         //送校验字节 
}

⌨️ 快捷键说明

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