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

📄 ftp.c

📁 富士通微型打印机驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
#include  <msp430x14x.h>
#include  "ftp.h"
#include  "stdio.h"

/************************************************
定义全局变量 
************************************************/
//系统寄存器 
uchar   COM0[COM0_LEN];                                          //定义串口缓冲区
#define PRN_BC      16                                           //打印机行缓冲计数
uchar   prn_havedata = FALSE;
uchar   prn_cmd  =0;                                             //打印命令
uchar   prn_para1 = 0;                                           //打印命令参数
uchar   prn_cmd_ok = FALSE;
uchar   prn_head = 0;                                            //打印缓冲区头
uchar   prn_tail = 0;                                            //打印缓冲区尾
uint    prn_flag = 0;                                            //打印机缓冲区标识
uchar   prn_buff[PRN_BC][48];//[48]={"郑州玖和科技电子有限公司郑州玖和科技电子有限公司"};  //定义打印缓冲区为48字节
uchar   paperwant_sn = 0;                                        //定义缺纸标志   0 - 不缺纸   2 缺纸
uchar   paperok_sn = 0;
uchar   printstate_sn = 0;                                       //定义打印忙标志寄存器  0 - 空闲    2 - 忙置位等待闲  3 - 忙
uchar   waitcmd = 0;
uchar   DOUB_HIGH = 0;                                           //定义双倍高度打印标志
uchar   ROW_SP = 2;                                              //定义打印行间距参数
uchar   u0flag;     //串口状态
uchar   *pTU0,*pRU0;                                             //定义串口指针
uchar   verify0;                                                 //定义接收校验字节
uchar   verify0t;                                                //定义发送校验字节
uchar   CmdOk = FALSE;                                           //定义接收完整的数据帧标示
uint    length0;                                                 //定义接收指令数据长度寄存器
uint    len_rv;                                                  //环形缓冲区内有效的数据长度
uchar   w_spi_sn = 0;                                            //写FLASH标示, 1表示写FLASH状态
uchar   nopaper_cnt = 0;                                         //打印头缺纸标识   0 为缺纸状态
ulong   wr_length,spiaddr;                                       //写入FLASH的数据长度/flash写地址
uchar   command0=0;                                              //指令类型寄存器
uchar   printer_mode = FALSE;                                    //打印指令类型寄存器
ulong   temp1;
ulong   tempaddr;
uint    ledflash=0;                                              //led闪烁计数器
uchar   print_timer=0;                                           //打印机驱动定时

/************************************************
主程序
************************************************/
void main(void)  
{ 
	uint i;
	WDTCTL = WDTPW + WDTHOLD;                              // 停止看门购
	BCSCTL1 &= ~XT2OFF;                                    // XT2on 外部晶体
	do 
	{
	   IFG1 &= ~OFIFG;                                     // Clear OSCFault flag
	   for (i = 0xff; i > 0; i--);                         // Time for flag to set
	}while ((IFG1 & OFIFG));                               // OSCFault flag still set?
	BCSCTL2 |= SELM_2 + SELS;                              // MCLK= SMCLK= XT2 (safe)
	//初始化部分
	initialize_IO();                                       //I/O初始化
	initialize_U0();                                       //初始化串口1
	initialize_timerA();                                   //初始化定时器A--125ms定时
	//initialize_timerB();                                 //初始化定时器B--PWM 输出
	CLRWTD;
	clr_u0();
	_EINT();                                                //开放中断  
	printer_mode = 0;                                       //禁止打印模式有效                                         
        waitcmd = 0;  
        while (waitcmd<30)
        {
           CLRWTD; 
           instr_u0();
           if(ledflash >= 100)                                   //1 秒定时
            {
                  ledflash =0;
                  LED_RUN_TOG;                                   //闪烁LED
                  waitcmd++;
            }
        } 
        clr_u0();
        u0flag = 0;
        paperok_sn = 0;
        printer_mode = 1;
        paperwant_sn = 0;                                      //缺纸状态寄存器标识  
        printstate_sn = 0;                                     //打印状态标识  
        waitcmd = 0;
        //if(paperwant_sn == 0)
	while(TRUE)                                              /*主循环体*/
	{
		 CLRWTD;
                 OnPrinterCmd();                                //处理打印机命令   
                 if(nopaper_cnt == 100)         //检测到P2.0端口   24ms时间仍为高电平  认为打印机缺纸           24ms
		  { 
		      nopaper_cnt = 0;
                      paperwant_sn = 2;         //置位缺纸标志
                      VOTSHUT_EN;               //切断7.2V电源 保护
                      STB_DIS;                  //屏蔽加热信号 
                      nopaper_ack(); 
                  }
                 if((paperwant_sn&4) == 4) 
                 {
                      paperwant_sn = 0;
                      VOTSHUT_DIS;              //检测到不再缺纸时开启7.2V电源
                 }
                 if(paperok_sn == 1)  
                 {
                      paperok_sn = 0;
                      paperok_ack();
                 }
                 if((printstate_sn&1) == 1)
                 {
                      printerbusy_ack();
                      printstate_sn &= ~1;
                 }
                 if((printstate_sn&4) == 4)
                 {
                      printerok_ack();
                      printstate_sn=0;
                 }
                 if(ledflash >= 250)                                //1 秒定时
                  { 
                      ledflash =0;
                      LED_RUN_TOG;                                 //闪烁LED
                  }  
       }
}
//写数据时回传字符串程序
void ComOutStr(uchar *pChar)
{
    uchar *pC=pChar;
    while(*pC && (pC-pChar<48))
    {
            while((UTXIFG0 & IFG1) != UTXIFG0);
            TXBUF0 = *pC++;
    }
}

//串口0指令处理程序
void instr_u0(void)
{
        if (!CmdOk) return;
        
	switch (command0)
	{
	case 0x21: 
		  look_spi();
		  break;
	case 0xd1:                                               //整片擦除flash
		  chip_ers_spi();
		  break;                           
	case 0xd2:                                               //块儿擦除flash
		  block_ers_spi();
		  break;              
	case 0x01:                                                    
	         // printer_mode =1;                                 
		  break;                          
	case 0x02:                                               //测试串口指令走纸情况
                  Motor_Step(5);
                  MTA_LOSS;
                  MTB_LOSS;
		  break;
	case 0x03:                                               //向 FLASH 写 特定数据块  ''发票头''  
                  ComOutStr("INVOICE IDENTIFIER Write ?");
                  sector_erase(BLOCK6);
                  sector_erase(BLOCK6);
                  if(COM0[3] != 2)
                  {
                    ComOutStr("Command INVOICE Error!");
                    break;
                  }
                  wr_length = COM0[5];
                  wr_length = (wr_length << 8) + COM0[6]; 
                  w_spi_sn = 1;                              //将FLASH写标示置1
                  len_rv = 0;                                //初始化接收变量
                  pTU0 = COM0;
                  pRU0 = COM0;
                  temp1 = BLOCK6;
                  while((w_spi_sn == 1)||(len_rv >= ONE_PAGE))
                 {
                   if(len_rv >= 256)
                   {
                     spi_write(temp1,ONE_PAGE);       //进行一页的写操作
                     temp1 += ONE_PAGE;               //FALSH地址加256
                     len_rv -= ONE_PAGE;              //计数长度减256
                     LED_RUN_TOG;                     //写数据指示
                     CLRWTD;
                   }
                 }
                 if(len_rv != 0)  
                 {
                    spi_write(temp1,len_rv); 
                 }                                            //写不足一页的剩余字节
                  break; 
        case 0x04:                                            //向FLASH内写公司标志数据块 "CNC 中国联通"   注:写完发票头后方可以写此块
                ComOutStr("COMPANY IDENTIFIER Write ?");
		//sector_erase(BLOCK6 + 3840);
	        if(COM0[3] != 2)
	         {
		  ComOutStr("Command COMPANY Error!");
		  break;
		 }
		  wr_length = COM0[5];
		  wr_length = (wr_length << 8) + COM0[6]; 
		  w_spi_sn = 1;                                //将FLASH写标示置1
                  len_rv = 0;                                  //初始化接收变量
                  pTU0 = COM0;
                  pRU0 = COM0;
                  temp1 = BLOCK6 + 3840;                       //位置紧跟在发票头数据块之后
                  while((w_spi_sn == 1)||(len_rv >= ONE_PAGE))
                 {
                   if(len_rv >= 256)
                   {
                     spi_write(temp1,ONE_PAGE);       //进行一页的写操作
                     temp1 += ONE_PAGE;               //FALSH地址加256
                     len_rv -= ONE_PAGE;              //计数长度减256
                     LED_RUN_TOG;                     //写数据指示
                     CLRWTD;
                   }
                }
                 if(len_rv != 0)  
                 {
                    spi_write(temp1,len_rv);
                 }                                      //写不足一页的剩余字节
		 break;
	case 0x10:                                      //进入打印机状态 
                printer_mode=TRUE;
                u0flag = 0;
                command0 = 0;
		break;
	case 0xae: //写汉字库
	       // printer_mode = 0;    //禁止打印模式有效
                ComOutStr("HZK Write ?");
                sector_erase(BLOCK0);                            //擦除块
                sector_erase(BLOCK1);
                sector_erase(BLOCK2);
                sector_erase(BLOCK3);
                sector_erase(BLOCK4);
                sector_erase(BLOCK0);                            //擦除块
                sector_erase(BLOCK1);
                sector_erase(BLOCK2);
                sector_erase(BLOCK3);
                sector_erase(BLOCK4);
                if(COM0[3] != 3)
                {
                    ComOutStr("Command HZK Error!");
                    break;
                }
                wr_length = COM0[5];
                wr_length = (wr_length<<8)+COM0[6];
                wr_length = (wr_length<<8)+COM0[7];
                w_spi_sn = 1;                                    //将FLASH写标示置1
                len_rv = 0;                                      //初始化接收变量
                pTU0 = COM0;  
                pRU0 = COM0;
                temp1 = 0; 
                while((w_spi_sn == 1)||(len_rv >= ONE_PAGE))
                 {
                   if(len_rv >= 256)
                   {
                     spi_write(temp1,ONE_PAGE);       //进行一页的写操作
                     temp1 += ONE_PAGE;               //FALSH地址加256
                     len_rv -= ONE_PAGE;              //计数长度减256
                     LED_RUN_TOG;                     //写数据指示
                     CLRWTD;
                   }
                 }
                 if(len_rv != 0)  
                 {
                    spi_write(temp1,len_rv); 
                 }                                             
	       break;                                             //*导入汉字库*//
	case 0xaf: //写字符库
                ComOutStr("ZFK Write ?");
                sector_erase(BLOCK5);
                sector_erase(BLOCK5);
                if(COM0[3] != 2)
                {
                    ComOutStr("Command ZFK Error!");
                    break;
                }
                wr_length = COM0[5];
                wr_length = (wr_length<<8)+COM0[6];
                w_spi_sn = 1;                                     //将FLASH写标示置1
                len_rv = 0;                                       //初始化接收变量
                pTU0 = COM0; 
                pRU0 = COM0;
                temp1 = BLOCK5;
                while((w_spi_sn == 1)||(len_rv >= ONE_PAGE))
               {
                 if(len_rv >= 256)
                 {
                   spi_write(temp1,ONE_PAGE);       //进行一页的写操作
                   temp1 += ONE_PAGE;               //FALSH地址加256
                   len_rv -= ONE_PAGE;              //计数长度减256
                   LED_RUN_TOG;                     //写数据指示
                   CLRWTD;
                 }
               }
               if(len_rv != 0)  
               {
                  spi_write(temp1,len_rv); 
               }                                     //写不足一页的剩余字节
		break;                                            
	case 0xff://数据错误
                ComOutStr("Command Format Error!");	
	        break;
	} 
        waitcmd = 0;
        pRU0 = COM0;
	u0flag = 0;  
	CmdOk = FALSE;             //清除发送标志
	command0 =0;               //清除命令字
}

//串口0中断服务程序            
#pragma vector = UART0RX_VECTOR
__interrupt void usart0_rx (void)
{ //打印机模式  
        if (printer_mode)
        {
            uchar  datain = RXBUF0;
            switch(u0flag)
            {
             case 0:                                    //默认状态
                if(datain == 0x1B)
                {

⌨️ 快捷键说明

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