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

📄 bsptsprnt.c

📁 基于ARM与μCOS-II的嵌入式操作系统实现针式和热敏微型打印程序.
💻 C
📖 第 1 页 / 共 5 页
字号:
*
* 功  能:热敏打印机统计走纸步数
*
* 输  入:无
*
* 输  出:g_uiprntPaperLen1
*         g_usprntPaperLen2
*         g_usprntPaperLen3
*
* 返  回:SUCCESS	  时序处理成功
*		  FAULT		  函数参数输入不合法
*
*******************************************************
*/
INT1 bspTSPrntStepTotal
(
	UINT1 _ucDirection,		/* 正反向进纸选择 1 正向 0 反向 */
	UINT1 _ucPaperType		/* 纸类型 0 非黑标纸 1 黑标纸 */
)
{
	if ((_ucDirection > 1)||(_ucPaperType > 1))
	{
		return FAULT;
	}
	else if (0 == _ucPaperType)  /* 非黑标纸 */
	{
		if (_ucDirection)
		{
			g_usprntPaperLen3 ++;
		}
		else if ((!_ucDirection) && ( g_usprntPaperLen3 >= 2 ))
		{
			g_usprntPaperLen3 --;
		}
	}
	else  						/* 黑标纸 */
	{
		if (_ucDirection)
		{
			g_usprntPaperLen1 ++;
			g_usprntPaperLen2 ++;
		}
		else if ((!_ucDirection) && ( g_usprntPaperLen2 >= 2 ))
		{
			g_usprntPaperLen1 --;
			g_usprntPaperLen2 --;
		}
	}
	return SUCCESS;
}

/*
*******************************************************
*
* 函数名:bspTSPrntPFLineSpace
*
* 功  能:热敏打印机进、退纸N步距函数
*
* 输  入:s_ucprntPFRunSign
*
* 输  出:s_usprntPFStepCnt
*
* 返  回:SUCCESS	函数处理成功
*		  FAULT 	函数参数输入不合法
*
*******************************************************
*/
INT1 bspTSPrntPFLineSpace
(
	UINT1 _ucDirection,       /*1 进纸, 0 退纸 */
	UINT2 _usLength			  /*走纸或退纸的步数*/
)
{
	UINT1 ucRunSign;
	UINT1 ucPFRunMode;
	UINT2 usStepTotal;
	
	if ((_ucDirection > 1) || (_usLength < 1) || (_usLength > TS_LEED_LEN))
	{
		return FAULT;
	}
	s_ucprntPrintEnable = 0;
	s_ucprntHeatEnable = 0;
	s_usprntPFStepCnt = 0;
	g_ucprntTimerInt = 0;
	s_ucprntPrintEnable = 0;
	s_ucprntPFRunSign = 1;
	ucRunSign = 1;
	TS_POWER_ON(); 
	/*禁止任务切换  */
	OSSchedLock();
	if (1 == g_ucprntCheckBM)
	{
		g_ucprntCheckBM = 0;
		bspTSprntSetTimer(TS_PU_TIME);
		ucPFRunMode = 3;
	}
	else
	{
		/*根据走纸的步数来确定是否要加速*/
		if ((_usLength == 1) && (_usLength <= 30))
		{
			bspTSprntSetTimer(TS_PFSHORTLEN_TIMER);
			ucPFRunMode = 0;
		}
		else /* 要加速*/
		{
			bspTSprntSetTimer(TS_PU_TIME);
			ucPFRunMode = 1;
		}
	}
	while (ucRunSign)
	{
		if (g_ucprntTimerInt)
		{
			g_ucprntTimerInt = 0;
			switch (ucPFRunMode)
			{
				case 0: /* 低步数没有加减速过程 */
					bspTSPrntPFPhase(_ucDirection, g_ucPaperType);
					s_usprntPFStepCnt ++;
					bspTSprntSetTimer(TS_PFSHORTLEN_TIMER);
					if (s_usprntPFStepCnt == _usLength)
					{
						ucPFRunMode = 2;
					}
					break;		

				case 1: /* 多步数包含加、减速驱动 */
					bspTSPrntPFPhase(_ucDirection, g_ucPaperType);
					s_usprntPFStepCnt ++;
					if (s_usprntPFStepCnt <= TS_UPDOWN_STEP)/* 14步减速驱动 */
					{
						bspTSprntSetTimer(s_usPFSpeedUp[s_usprntPFStepCnt - 1]);
					}
					else if (s_usprntPFStepCnt <= (_usLength - TS_UPDOWN_STEP)) /* 匀速驱动 */
					{
						bspTSprntSetTimer(TS_PFSPEED_TIMER);
					}
					else if ((s_usprntPFStepCnt > (_usLength - TS_UPDOWN_STEP)) && (s_usprntPFStepCnt < _usLength))
					{
						bspTSprntSetTimer(s_usPFSpeedDown[s_usprntPFStepCnt + TS_UPDOWN_STEP - _usLength]);
					}
					else if (s_usprntPFStepCnt >= _usLength)
					{
						bspTSprntSetTimer(TS_PD_TIME);
						ucPFRunMode = 2;
					}
					break;		

				case 2: /* PF停机函数 */
					bspTSPrntPFStop();
					ucRunSign = 0;
					break;		
				
				case 3:	/* 检测黑标处理流程 */
					bspTSPrntPFPhase(_ucDirection, 1);
					s_usprntPFStepCnt ++;
					if (s_usprntPFStepCnt <= TS_UPDOWN_STEP)	/* 14步减速驱动 */
					{
						bspTSprntSetTimer(s_usPFSpeedUp[s_usprntPFStepCnt - 1]);
					}
					else if ((0 == g_ucprntCheckedBMark) && (s_usprntPFStepCnt <= TS_LEED_LEN))/* 匀速驱动 */
					{
						bspTSprntSetTimer(TS_PFSPEED_TIMER);
					}
					else if ((0 == g_ucprntCheckedBMark) && (s_usprntPFStepCnt <= (TS_LEED_LEN + TS_UPDOWN_STEP)))
					{
						bspTSprntSetTimer(s_usPFSpeedDown[s_usprntPFStepCnt - TS_LEED_LEN]);
					}
					else
					{
						if (g_ucprntCheckedBMark)
						{
							if (1 == g_ucPrntCheckBMInt)
							{
								g_ucPrntCheckBMInt = 0;
								bspTSprntSetTimer(TS_PD_TIME); /* 上电初始化找到黑标后,即停机 */
								ucPFRunMode = 2;
							}
							else
							{
								s_usprntPFStepCnt = 0;
								g_usprntPaperLen1 = g_usprntPaperLen2;
								usStepTotal = g_usprntPaperLen2;
								if (g_usPrintLocatOffset <= usStepTotal)
								{
									DelayXus(PD);
									/* 打印起始位置设定值为0,不进入流程4,否则步数统计误差1步 */
									ucPFRunMode = 2;
								}
								else
								{
									ucPFRunMode = 4; /* 找到黑标后进入流程4走纸到起始位置 */
								}
							}
						}
						else
						{
							bspTSprntSetTimer(TS_PD_TIME);/* 未找到黑标走满整页纸后停机*/
							ucPFRunMode = 2;
						}
					}
					break;

				case 4: /* 进纸找黑标后走纸到打印起始位置 */
					bspTSPrntPFPhase(_ucDirection, 1);
					s_usprntPFStepCnt ++;
					bspTSprntSetTimer(TS_PFSHORTLEN_TIMER - 3);
					if (s_usprntPFStepCnt == (g_usPrintLocatOffset - usStepTotal))
					{
						bspTSprntSetTimer(TS_PD_TIME);
						ucPFRunMode = 2;
					}
					else if(s_usprntPFStepCnt > 1200)
					{
						bspTSprntSetTimer(TS_PD_TIME);/* 异常停机处理流程*/
						ucPFRunMode = 2;
					}
					break;
					
				default:
					break;
			}
			bspPrntCheckBM(1);
		}
	}
	bspTimer1Stop();
	/* 启动任务切换 */
	OSSchedUnlock();
	return SUCCESS;
}

/*
******************************************************
*
* 函数名:bspTSPrntGoToBeginPlace 
*
* 功  能:进纸到打印起始位置
*
* 输  入:g_uiPrintLocatOffset
*         g_uiprntPaperLeni
*
* 输  出:g_ucprntCheckBM
*
* 返  回:FAULT   打印机状态异常
*		  SUCCESS 函数执行成功
*
*******************************************************
*/
INT1 bspTSPrntGoToBeginPlace 
(
	UINT1 _ucPaperType           /* 票据类型 1 定长、0不定长 */
)
{
	if ((_ucPaperType > 1)||(g_ucprntState&0x0f))
	{
		return FAULT; 
	}
	else if ( _ucPaperType == 0)
	{
		g_usprntPaperLen3 = 0;   /* 非定长票据进纸步数计数器清0 */
		bspTSPrntPFLineSpace (1 , g_usPrintLocatOffset);
	}
	else
	{
		/* 如果之前已经检测到黑标 */
		if (g_ucprntCheckedBMark)
		{
			g_ucprntCheckedBMark = 0;
			g_usprntPaperLen1 = g_usprntPaperLen2;
			if (g_usPrintLocatOffset > g_usprntPaperLen1 )
			{
				bspTSPrntPFLineSpace (1 , (g_usPrintLocatOffset - g_usprntPaperLen1));
			}
			else
			{ 
				/* 置起找黑标标志,并进纸到起始位置 */
				g_ucprntCheckBM = 1;
				bspTSPrntPFLineSpace (1 , 100);
			}
		}
		else
		{
			/* 以前未检测到黑标,直接进纸找黑标操作 */
			g_ucprntCheckBM = 1;
			bspTSPrntPFLineSpace (1 , 100);
		}
	}
	return SUCCESS;
}

/*
********************************************************
*
* 函数名:prntTSGoToCutPlace
*
* 功  能:进纸到打印切纸位置
*
* 输  入:g_uiprntPaperLeni
*
* 输  出:无
*
* 返  回:FAULT	  打印机故障
*		  SUCESS  处理成功
*
********************************************************
*/
INT1 bspTSPrntGoToCutPlace 
(
	UINT1 _ucPaperType,        /* 票据类型(1 定长、0 不定长)*/
	UINT2 _usPageLength,	   /* 打印纸页长 */	
	UINT2 _usCutOffset         /* 打印切纸位置 */
)
{
	if (g_ucprntState&0x0f)
	{
		return	FAULT;      /* 打印机状态异常直接返回 */
	}
	if (_ucPaperType == WHITE_PAPER)
	{
		if (g_usprntPaperLen3 > 1)
		{
 			if(_usPageLength > g_usprntPaperLen3)
 			{
 				bspTSPrntPFLineSpace(1, _usPageLength - g_usprntPaperLen3);
 			}		
		}
		else
		{
			bspTSPrntPFLineSpace(1, _usPageLength);
		}
	}
	else
	{
		if (_usCutOffset > g_usprntPaperLen1) 
		{
			bspTSPrntPFLineSpace(1, _usCutOffset - g_usprntPaperLen1);
		}
		else if (_usCutOffset > g_usprntPaperLen2)
		{
			bspTSPrntPFLineSpace(1, _usCutOffset - g_usprntPaperLen2);
		}
		else 
		{
			bspTSPrntPFLineSpace (1, 200);
		}
		g_usprntPaperLen1 = g_usprntPaperLen2;
	}
	return SUCCESS;
}

/*
*******************************************************
*
* 函数名:bspTSPrntGetPattern
*
* 功  能:热敏打印机取字模函数
*
* 输  入:无
*
* 输  出:无
*
* 返  回:ASCII_PATTERN----处理字符字模
*		  CHINESE_PATTERN----处理汉字字模
*		  ERROR_CODE----非法区位码 
*
*******************************************************
*/
INT1 bspTSPrntGetPattern
(
	const UINT1* _pStr,	   /* [in]待取字模国标码首地址 */
	UINT1* _pBuffer,  	   /* [out]存放显示字模数据缓存首地址 */
	UINT1  _ucLangFlag	   /* 语言种类选择标志(0中文 1阿拉伯语 2英语)*/
)
{
	UINT1	uctempData1, uctempData2;
	UINT4	offset;
	
	uctempData1 = *(_pStr);		   /* 取ASCII码或国标码区码 */
	if ((uctempData1 >= 0x20) && (uctempData1 <= 0x7f))
	{
		offset = (uctempData1 - 0x20) * ASCII_PATTERN_LEN + ASCII_24_ADDR;
		mem_cpy(_pBuffer, (UINT4 *)offset, ASCII_PATTERN_LEN);
		return ASCII_PATTERN;
	}
	else
	{
		if (_ucLangFlag == 0x01)  /* 取阿拉伯语字模 */
		{
			mem_cpy(_pBuffer, (UINT1 *)g_ArabFont24X12[uctempData1-0x80], 48);
			return ASCII_PATTERN;
		}
		else
		{
			uctempData2 = *(_pStr + 1);	/* 取字模位码 */
			if ((uctempData1 >= 0xa1) && (uctempData2 >= 0xa1) && (uctempData1 <= 0xf7) && (uctempData2 <= 0xfe))
			{
				offset = ((uctempData1 - 0xA1) * 94 + (uctempData2 - 0xA1)) * CN_PATTERN_LEN + GB2312_24_ADDR;
				mem_cpy(_pBuffer, (UINT4 *)offset, CN_PATTERN_LEN);
				return CHINESE_PATTERN;
			}
		}
	}
	return ERROR_CODE;
}

#pragma arm section code = "bspTSPrntDealWord"
/*
*****************************************************
*
* 函数名:bspTSPrntDealWord
*
* 功  能:热敏打印机字模移位处理函数
*
* 输  入:g_ucprntCharPattern
*         s_ucprntBitInByte
*         s_usprntDotLine
*
* 输  出:g_ucprntPrintLineBuffer
*
* 返  回:SUCCESS---处理成功
*
******************************************************
*/
INT1 bspTSPrntDealWord
(
	UINT1 _ucCNSign,		/* 0 ASCII字符   1 中文字符 */
	UINT1 _ucCharSpace,		/* 字符间距 */
	UINT1* _pBuffer 		/* [in]存放显示字模数据缓存首地址 */	
)
{
	UINT1 i,j,k;
	UINT1 ucDealBytes;
	UINT1 ucAdjustBit;
	UINT1 ucReadOneByte;
	UINT1 ucDealOneBit;
	UINT1 ucDotLinePos;
	UINT1 ucDotRowPos;
	UINT1 ucDotBitPos;
	
	if (_ucCNSign)	
	{
		ucDealBytes = CN_PATTERN_LEN;    	/* 24点阵72字节( 长度24点 ) */
	}
	else
	{
		ucDealBytes = ASCII_PATTERN_LEN;	/* 24点阵48字节( 长度12点 ) */
	}
	ucDotLinePos = s_usprntDotLine;			/* 保存起始打印行位置(增加1个字符字模后,回到初始位置) */
	ucDotRowPos = s_ucprntHoriByte;			/* 存起始打印列位置(以字节为单位) */		
	ucDotBitPos = s_ucprntBitInByte;		/* 当前处理的位在打印列位置相对位置 */
	for (i = 0; i < ucDealBytes; i ++)
	{
		ucReadOneByte = *(_pBuffer + i); 	/* 从字模缓存取1字节 */
		if (_ucCNSign)
		{
			ucAdjustBit = 8;				/* 汉字字模的取值调整位 */
		}
		else
		{
			if( i % 2)						/* ASCII字模 */
			{
				ucAdjustBit = 4;			/* ASCII奇数字节只有4位数据有效 */
			}
			else
			{
				ucAdjustBit = 8;			/* ASCII长度12,横向前一字节8位 */				
			}
		}
		for (j = 0; j < ucAdjustBit; j ++)  /* 将字模单字节移位处理存取打印缓冲区 */
		{
			ucDealOneBit = ucReadOneByte >> 7;
			ucReadOneByte = ucReadOneByte << 1;
			bspTSPrntPatternShift(ucDealOneBit, 0);
		}		
		if  (((_ucCNSign == 1) && (i % 3 == 2))||((_ucCNSign == 0) && (i % 2 == 1)))
		{
			if (s_ucTSDoubleHigh)
			{
				INC(s_usprntDotLine, DOTLINE_LIMIT);
			}
			INC(s_usprntDotLine, DOTLINE_LIMIT);
			s_ucprntHoriByte = ucDotRowPos;	 /* 换点行后,恢复起始打印列字节位置 */
			s_ucprntBitInByte = ucDotBitPos; /* 换点行后,恢复当前字模处理位在打印列字节中的位置 */
		}
	}
	s_usprntDotLine = ucDotLinePos;

⌨️ 快捷键说明

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