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

📄 bspdotprnt.c

📁 基于ARM与μCOS-II的嵌入式操作系统实现针式和热敏微型打印程序.
💻 C
📖 第 1 页 / 共 5 页
字号:
/*
****************************************************
*
* 函数名:bspDotprntPrintOneLine
*
* 功  能:穿孔机芯打印一行数据
*
* 输  入:g_ucPrntWidthAdjust
*
* 输  出:s_uiprntPatternCount
*         g_ucprntLinePrinted
*
* 返  回:SUCESS----处理成功
*
*****************************************************
*/
INT1 bspDotprntPrintOneLine
(
	UINT1 _ucDots     /* 正、反向打印中间错开的点数 */
)
{
	/* 打印机状态正确且有数据才打印 */
	if ((!(g_ucprntState&0x0f)) && (s_usprntPatternCount > g_ucPrntWidthAdjust))
	{
		if (s_ucRequestDoubleHigh)
		{
			bspDotPrntDrive(1);
			bspDotPrntDrive(0);
			bspDotPrntPFLineSpace(1, 16);
			s_ucRequestDoubleHigh = 0;
		}
		bspDotCRLeft2RightDrive();
		bspDotPrntPFLineSpace(1, _ucDots);
		bspDotCRRight2LeftDrive();
		
		g_ucprntLinePrinted ++; /* 当前已经打印的行数 */
	}
	mem_set(g_ucprntPattern1, 0, PRNT_WIDTH);
	mem_set(g_ucprntPattern2, 0, PRNT_WIDTH);
	mem_set(g_ucprntPattern3, 0, PRNT_WIDTH);
	s_usprntPatternCount = g_ucPrntWidthAdjust;
	s_ucprntBufferFull = 0;
	
	return SUCCESS;
}

/*
*****************************************************
*
* 函数名:bspDotprntAndNewline
*
* 功  能:穿孔机芯打印并换行函数
*
* 输  入:g_ucprinterState
*
* 输  出:s_ucprntDataBuffer
*         s_usprntPatternCount
*
* 返  回:FAULT  打印机故障
*         SUCESS 打印成功
*
*****************************************************
*/
INT1 bspDotprntAndNewline
(
	UINT1 _ucLine,		 /* 进纸行数*/
	UINT1 _ucLineSpace   /* 行间距 */
)
{
	UINT1 i;
	UINT1 _ucCount = 0;

	
	if (g_ucprntState&0x0f)
	{
		s_ucprntBuffDataIn = 0;
		return FAULT;
	}
	do
	{
		_ucCount += bspDotPrntGetPattern(_ucCount); /*取打印字模*/
		if (s_ucprntBufferFull)
		{
			bspDotprntPrintOneLine(1);
			bspDotPrntPFLineSpace(1, _ucLineSpace - 1);		
			s_ucprntBufferFull = 0;
			/* 打印接收缓冲区满了之后 先只打印一行 */
			if (s_ucDataBufferFull)
			{
				if (s_ucprntBuffDataIn > _ucCount)
				{
					for (i = 0; i < (s_ucprntBuffDataIn - _ucCount); i++)
					{
						s_ucprntDataBuffer[i] = s_ucprntDataBuffer[_ucCount + i];
					}
					s_ucprntBuffDataIn -= _ucCount;
				}
				s_ucDataBufferFull = 0;
				return SUCCESS;
			}
		}
		if (g_ucprntState&0x0f)
		{
			s_ucprntBuffDataIn = 0;
			return FAULT;
		}
	}
	while (_ucCount < s_ucprntBuffDataIn);
	/* 防止空走纸一行时,字车来回空运行 */
	if (_ucCount > 0)  
	{
		bspDotprntPrintOneLine(1);
	}
	if ((_ucLine > 0)&&(g_syscPowOff != SUCCESS))
	{
		if (_ucCount == 0)
		{
			/* 空走纸一行间距 */
			bspDotPrntPFLineSpace(1, _ucLineSpace * _ucLine);
		}
		else
		{
			/* 调用打印行数已走纸一步, 进纸少走一步 */
			bspDotPrntPFLineSpace(1, _ucLineSpace * _ucLine - 1);	
		}
	}
	
	s_usprntPatternCount = g_ucPrntWidthAdjust;/* 单行打印横向调整点 */
	s_ucprntBuffDataIn = 0;
	mem_set(s_ucprntDataBuffer, 0, sizeof(s_ucprntDataBuffer));
	
	return SUCCESS;
}

/*
****************************************************
*
* 函数名:bspPrntCheckBM
*
* 功  能:打印机黑标检测函数
*
* 输  入:s_usPrntBMCounter
*
* 输  出:g_ucprinterState
*         g_ucprntCheckedBMark
*         g_usprntPaperLen2
*
* 返  回:N/A
*
*****************************************************
*/
void bspPrntCheckBM
(
	UINT1 _ucSelectPrinter			    /* 机芯选择 0 穿孔  1 热敏 */
)
{
	if (0 == _ucSelectPrinter) 
	{
		if (!BLACK_SENSOR)				/* BLACK_SENSOR口线为高黑标信号 */
		{
			if (g_usPrntBMCounter < BM_DOT_COUNTER_STEP) 
			{
				g_usPrntBMCounter ++;
			}
		}
		else
		{	/* 检测到黑标(0.3528mm) */
			if (g_usPrntBMCounter > BM_DOT_CHECK_STEP) 
			{
				g_usprntPaperLen2 = 0;	    /* 清0步数统计计数器 */
				g_ucprntCheckedBMark = 1;	/* 置起检测到黑标标志 */
				g_usPrntBMCounter = 0;
			}
			else
			{
				g_usPrntBMCounter = 0;
				if (g_ucprntState&0x01)
				{
					g_ucprntState = g_ucprntState&0xfe;
				}
			}
		}
		bspDotPrntCheckPE();
	}
	else
	{
		if (!PE_SENSOR)					/* BLACK_SENSOR口线为高黑标信号 */
		{
			if (g_usPrntBMCounter < BM_TS_COUNTER_STEP) 
			{
				g_usPrntBMCounter ++;
			}
		}
		else
		{	
			/* 连续检测黑标信号达2mm则认为黑标信号 */
			if (g_usPrntBMCounter > BM_TS_CHECK_STEP) 
			{
				g_usprntPaperLen2 = 0;	    /* 清0步数统计计数器 */
				g_ucprntCheckedBMark = 1;	/* 置起检测到黑标标志 */
				g_usPrntBMCounter = 0;
			}
			else
			{
				g_usPrntBMCounter = 0;
				if (g_ucprntState&0x01)
				{
					g_ucprntState = g_ucprntState&0xfe;
				}
			}
		}
		 /* 连续检测到黑标信号达到10mm则判断为无纸 */
		if (g_usPrntBMCounter >= NP_CHECK_STEP)	   
		{
			g_usPrntBMCounter = 0;
			g_ucprntState = g_ucprntState|NOPAPER;
		}
	}
}

/*
****************************************************
*
* 函数名:bspDotprntSetTimer
*
* 功  能:设置定时器定时时间
*
* 输  入:无
*
* 输  出:无
*
* 返  回:N/A
*
****************************************************
*/
void bspDotprntSetTimer
(
	UINT4  _ucTimer         /* 定时时间 */
)
{
	bspTimer1Start(_ucTimer);
}

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

/*
********************************************************
*
* 函数名:prntGoToCutPlace
*
* 功  能:进纸到打印切纸位置
*
* 输  入:g_usprntPaperLen1
*         g_usprntPaperLen2
*         g_usprntPaperLen3
*
* 输  出:无
*
* 返  回:FAULT	  打印机故障
*		  SUCESS  处理成功
*
********************************************************
*/
INT1 bspDotPrntGoToCutPlace 
(
	UINT1 _ucPaperType,           /* 票据类型(1 定长、0 不定长)*/
	UINT2 _usPageLength,		  /* 打印纸页长 */	
	UINT2 _usCutOffset            /* 打印切纸位置 */
)
{
	if (g_ucprntState&0x0f)
	{
		return	FAULT;    /* 打印机状态异常直接返回 */
	}
	if (_ucPaperType == WHITE_PAPER)
	{
		/* 穿孔纸不定长打印进纸到切纸位置 */
		_usPageLength = ((_usPageLength + 36 )/HOLE_SPACE)*HOLE_SPACE;/* 设定值容错处理 */
		if (g_usprntPaperLen3 > 1)
		{
 			if(_usPageLength > g_usprntPaperLen3)
 			{
 				bspDotPrntPFLineSpace(1, _usPageLength - g_usprntPaperLen3);
 			}		
		}
		else
		{
			bspDotPrntPFLineSpace(1, _usPageLength);
		}
	}
	else
	{
		if (_usCutOffset > g_usprntPaperLen1) 
		{
			/* 如果走纸过程中检测到下一张黑标,则采用上一个黑标计数累计步数计算 */
			bspDotPrntPFLineSpace(1, _usCutOffset - g_usprntPaperLen1);
		}
		else if (_usCutOffset > g_usprntPaperLen2)
		{
			/* 进纸过程中未检测到下一张黑标,则以当前黑标计数值作为基准计算进纸切纸位置 */
			bspDotPrntPFLineSpace(1, _usCutOffset - g_usprntPaperLen2);
		}
		else 
		{
			/* 当前已进纸距离大于切纸位置,则走纸200步,确保正常出纸 */
			bspDotPrntPFLineSpace (1,200);
		}
		g_usprntPaperLen1 = g_usprntPaperLen2;
	}
	return SUCCESS;
}

/*
********************************************************
*
* 函数名:prntDetectPaper
*
* 功  能:检测上纸动作并进纸
*
* 输  入:无
*
* 输  出:g_ucprinterState
*
* 返  回:无
*
********************************************************
*/
void prntDetectPaper(void)
{
	if (PRINTER_TYPE)
	{
		/* 实时纸状态检测信号检测到有纸,但打印机状态为无纸,则判为发生上纸动作 */
		if ((PE_SENSOR) && (g_ucprntState&0x01))
		{
			g_ucprntState = g_ucprntState&0xfe;
		}
	}
	else
	{
		if ((PE_SENSOR) && (g_ucprntState &0x01))
		{
			g_ucprntState = g_ucprntState&0xfe;
		}
	}
	return;
}

/*
********************************************************
*
* 函数名:Delay350us
*
* 功  能: 打印出针定时函数
*
* 输  入:无
*
* 输  出:无
*
* 返  回:无
*
********************************************************
*/
void Delay350us(void)
{
	TIMER1_TCR = TIMER1_TCR_RESET;
	TIMER1_MCR = TIMER1_MCR_MR0S;
	TIMER1_PR = 0;
	TIMER1_PC = 0;
	TIMER1_MR0 = 19596; /* 设置计数最大值19996(为减少机芯出针时间) */
	TIMER1_TC = 0;
	TIMER1_TCR = TIMER1_TCR_EN;	
	while(TIMER1_TCR == TIMER1_TCR_EN);
	TIMER1_IR = 0x01;	/* 清MR0产生的中断标志 */
}

/*
********************************************************
*
* 函数名:Delay135us
*
* 功  能: 打印收针定时函数
*
* 输  入:无
*
* 输  出:无
*
* 返  回:无
*
********************************************************
*/
void Delay135us(void)
{
	TIMER1_TCR = TIMER1_TCR_RESET;
	TIMER1_MCR = TIMER1_MCR_MR0S;
	TIMER1_PR = 0;
	TIMER1_PC = 0;
	TIMER1_MR0 = 7312;	/* 设置计数最大值 */
	TIMER1_TC = 0;
	TIMER1_TCR = TIMER1_TCR_EN;	
	while(TIMER1_TCR == TIMER1_TCR_EN);
	TIMER1_IR = 0x01;	/* 清MR0产生的中断标志 */
}

/*
********************************************************
*
* 函数名:Delay115us
*
* 功  能: 打印收针定时函数
*
* 输  入:无
*
* 输  出:无
*
* 返  回:无
*
********************************************************
*/
void Delay115us(void)
{
	TIMER1_TCR = TIMER1_TCR_RESET;
	TIMER1_MCR = TIMER1_MCR_MR0S;
	TIMER1_PR = 0;
	TIMER1_PC = 0;
	TIMER1_MR0 = 6512;	/* 设置计数最大值 */
	TIMER1_TC = 0;
	TIMER1_TCR = TIMER1_TCR_EN;	
	while(TIMER1_TCR == TIMER1_TCR_EN);
	TIMER1_IR = 0x01;	/* 清MR0产生的中断标志 */
}

/*
********************************************************
*
* 函数名:DelayXus
*
* 功  能: 针式打印走步相位变化定时函数
*
* 输  入:无
*
* 输  出:无
*
* 返  回:无
*
********************************************************
*/
void DelayXus 
(
	UINT2 _DelayTime     /* 定时单位( us) */
)
{
	UINT4 value;
	
	if (_DelayTime == 1000)
	{
		value = 58750;
	}
	else if (_DelayTime == 1020)
	{
		value = 59750;
	}
	else if (_DelayTime == 1050)
	{
		value = 61150;
	}
	else if (_DelayTime == 1090)
	{
		value = 63450;
	}
	else
	{
		value = _DelayTime * 58750/1000;
	}	
	TIMER1_TCR = TIMER1_TCR_RESET;
	TIMER1_MCR = TIMER1_MCR_MR0S;
	TIMER1_PR = 0;
	TIMER1_PC = 0;
	TIMER1_MR0 = value;
	TIMER1_TC = 0;
	TIMER1_TCR = TIMER1_TCR_EN;	
	while(TIMER1_TCR == TIMER1_TCR_EN);
	TIMER1_IR = 0x01;	/* 清MR0产生的中断标志 */
}


⌨️ 快捷键说明

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