📄 ftp.c
字号:
#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 + -