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

📄 bspdotprnt.c

📁 基于ARM与μCOS-II的嵌入式操作系统实现针式和热敏微型打印程序.
💻 C
📖 第 1 页 / 共 5 页
字号:
				break;

			case 2: /* 减速步 */					
				bspDotPrntCRPhase(1);
				ucCRRunSteps ++;
				DelayXus(prntCRSpeeddown[16 - ucCRRunSteps ]);	
									
				if (ucCRRunSteps == 16)
				{
					/* 若应该触发HP而没有触发或者不应该触发确触发了HP则叛未机械故障 */
					if (1 == bspDotPrntCheckHP())
					{
						g_ucprntState = g_ucprntState|MALFUNCTION;/* 故障 */
					}
					ucCRRunMode = 3;
					ucCRRunSteps = 0;
				}
				break;
				
			case 3: /* CR电机停机 */
				if (ucCRRunSteps == 0 )
				{
					DelayXus(PD);
					ucCRRunSteps ++;
				}
				else
				{
					bspDotPrntCRStop();
					ucCRRunFlag = 0;
					/* 启动任务切换 */
					OSSchedUnlock();
					return;
				}
				break;		

			default:
				break;
		}
	}	
	/* 启动任务切换 */
	OSSchedUnlock();
}

/*
***************************************************
*
* 函数名:bspDotPrntDrive
*
* 功  能:穿孔打印倍高打印时单向打印一行
*
* 输  入:g_ucprntPattern3
*
* 输  出:无
*
* 返  回:N/A
*
***************************************************
*/
void bspDotPrntDrive
(
	UINT1 _ucDirection	/* 正反向打印驱动选择 */
)
{
	UINT1 ucCRRunFlag = 1;
	UINT2 ucCRRunSteps = 0;
	UINT1 ucCRRunMode = 0;
	
	bspDotPrntSetCurrentLevel(LOW_CURRENT);
	/* 设置PU时间,让出CPU执行 */
	OSTimeDly(1);
	/*禁止任务切换  */
	OSSchedLock();
	bspDotPrntSetCurrentLevel(HIGH_CURRENT);
	
	while (ucCRRunFlag)
	{
		switch (ucCRRunMode)
		{
			case 0:	/* 设置驱动电流为满电流 */
				bspDotPrntCRPhase(_ucDirection);
				DelayXus(prntCRSpeedUp[ucCRRunSteps]);
				ucCRRunSteps ++;
				if (ucCRRunSteps == 16)
				{
					ucCRRunMode = 1;
					ucCRRunSteps = 0;
					bspDotPrntSetCurrentLevel(MIDDLE_CURRENT);
				}
				break;

			case 1: /*正向匀速运动并打印*/
				bspDotPrntCRPhase(_ucDirection);
				ucCRRunSteps ++;
				PRT_TRIG_ON();
				if (_ucDirection)
				{
					PSOLENIO(~g_ucprntPattern3[ucCRRunSteps * 2 - 2]);
				}
				Delay350us();
				PSOLENIO(0xff);		/* 收针操作 */
				PRT_TRIG_OFF();
				Delay135us();
				PRT_TRIG_ON();
				if (_ucDirection)
				{
					PSOLENIO(~g_ucprntPattern3[ucCRRunSteps * 2 - 1]);
				}
				Delay350us();
				PSOLENIO(0xff);		/* 收针操作 */
				PRT_TRIG_OFF();
				Delay115us();
				/* 打印完毕,准备减速 */
				if (ucCRRunSteps == (PRNT_WIDTH / 2))
				{
					ucCRRunMode = 2;
					ucCRRunSteps = 0;
				}
				break;

			case 2: /* 减速步 */					
				bspDotPrntCRPhase(_ucDirection);
				ucCRRunSteps ++;
				DelayXus(prntCRSpeeddown[16 - ucCRRunSteps ]);	
									
				if (ucCRRunSteps == 16)
				{
					/* 若应该触发HP而没有触发或者不应该触发确触发了HP则叛未机械故障 */
					if((1 == bspDotPrntCheckHP()) && (_ucDirection))
					{
						g_ucprntState = g_ucprntState|MALFUNCTION;/* 故障 */
					}
					ucCRRunMode = 3;
					ucCRRunSteps = 0;
				}
				break;
				
			case 3: /* CR电机停机 */
				if (ucCRRunSteps == 0 )
				{
					DelayXus(PD);
					ucCRRunSteps ++;
				}
				else
				{
					bspDotPrntCRStop();
					ucCRRunFlag = 0;
					/* 启动任务切换 */
					OSSchedUnlock();
					return;
				}
				break;		

			default:
				break;
		}
	}	
	/* 启动任务切换 */
	OSSchedUnlock();
}

/*
***************************************************
*
* 函数名:bspDotCRRight2LeftDrive
*
* 功  能:穿孔打印机反向打印一行数据
*
* 输  入:g_ucprntPattern2
*		  g_ucprntAdjustLevel
*
* 输  出:无
*
* 返  回:N/A
*
***************************************************
*/
void bspDotCRRight2LeftDrive(void)
{
	UINT1 i;
	UINT2 uiPattenCount;
	UINT1 ucCRRunFlag = 1;
	UINT2 ucCRRunSteps = 0;
	UINT1 ucCRRunMode = 0;

	
	uiPattenCount = PRNT_WIDTH - 1;
	bspDotPrntSetCurrentLevel(LOW_CURRENT);
	OSTimeDly(1);
	/*禁止任务切换  */
	OSSchedLock();
	bspDotPrntSetCurrentLevel(HIGH_CURRENT);
	
	while (ucCRRunFlag)
	{
		switch (ucCRRunMode)
		{
			case 0:	/* 设置驱动电流为满电流 */
				bspDotPrntCRPhase(0);
				DelayXus(prntCRSpeedUp[ucCRRunSteps]);
				ucCRRunSteps ++;
				if (ucCRRunSteps == 16)
				{
					ucCRRunMode = 1;
					ucCRRunSteps = 0;
					bspDotPrntSetCurrentLevel(MIDDLE_CURRENT);
				}
				break;

			case 1: /*正向匀速运动并打印*/
				
				if ((g_ucprntAdjustLevel % 4)== 0)
				{
					/* 当打印效果调节参数是4整数倍时,直接通过移位相应步数达到
					调节打印效果目的 */
					for(i = 0; i < g_ucprntAdjustLevel / 4; i++)
					{
						bspDotPrntCRPhase(0);
						DelayXus(1000);
					}
					while (ucCRRunSteps < (PRNT_WIDTH / 2))
					{
						bspDotPrntCRPhase(0);
						ucCRRunSteps ++;
						PRT_TRIG_ON();
						PSOLENIO(~g_ucprntPattern2[uiPattenCount--]);	
						Delay350us();
						PSOLENIO(0xff);	
						PRT_TRIG_OFF();
						Delay135us();
						PRT_TRIG_ON();
						PSOLENIO(~g_ucprntPattern2[uiPattenCount--]);
						Delay350us();
						PSOLENIO(0xff);
						PRT_TRIG_OFF();
						Delay115us();
					}
					/* 由于匀速区调节效果可能多运行一定步数,相应减速区应该补偿
					回来,以确保横向打印起始位置准确性 */
					ucCRRunSteps = g_ucprntAdjustLevel / 4;
				}
				else if ((g_ucprntAdjustLevel % 4) == 1)
				{
					for(i = 0; i < g_ucprntAdjustLevel / 4; i++)
					{
						bspDotPrntCRPhase(0);
						DelayXus(1000);
					}
					while (ucCRRunSteps < (PRNT_WIDTH / 2))
					{
						if (ucCRRunSteps == 0)
						{
							bspDotPrntCRPhase(0);
						}
						/* 切换相位走步后,延时250us开始打印出针操作 */
						DelayXus(100);
						PSOLENIO(0xff);		
						PRT_TRIG_OFF();
						Delay135us();
						PRT_TRIG_ON();
						PSOLENIO(~g_ucprntPattern2[uiPattenCount--]);
						Delay350us();
						PSOLENIO(0xff);	
						PRT_TRIG_OFF();
						Delay135us();
						PRT_TRIG_ON();
						PSOLENIO(~g_ucprntPattern2[uiPattenCount--]);
						DelayXus(240);
						ucCRRunSteps ++;
						bspDotPrntCRPhase(0);
					}
					/* 补齐时序,继续走完一步 */
					DelayXus(100);
					PSOLENIO(0xff);	
					PRT_TRIG_OFF();
					DelayXus(900);
					/* 由于存在补齐时序操作,匀速区运动步数相应会增加,需要占用
					减速区运动步数确保横向定位的准确性 */
					ucCRRunSteps = 1 + g_ucprntAdjustLevel / 4;
				}
				else if ((g_ucprntAdjustLevel % 4) == 2)
				{
					for(i = 0; i < g_ucprntAdjustLevel / 4; i++)
					{
						bspDotPrntCRPhase(0);
						DelayXus(1000);
					}
					while (ucCRRunSteps < (PRNT_WIDTH / 2))
					{
						/* 切换相位走步后,延时500us开始打印出针操作 */
						if (ucCRRunSteps == 0)
						{
							bspDotPrntCRPhase(0);
							DelayXus(350);
						}
						Delay115us();
						PRT_TRIG_ON();		
						PSOLENIO(~g_ucprntPattern2[uiPattenCount--]);
						Delay350us();		
						PSOLENIO(0xff);	
						PRT_TRIG_OFF();
						Delay115us();
						ucCRRunSteps ++;
						/* 切换相序点,每步时间1ms */
						bspDotPrntCRPhase(0);
						PRT_TRIG_ON();
						PSOLENIO(~g_ucprntPattern2[uiPattenCount--]);
						Delay350us();
						PSOLENIO(0xff);	
						PRT_TRIG_OFF();
					}
					/* 补齐时序,继续走完一步 */
					DelayXus(650);
					ucCRRunSteps = 1 + g_ucprntAdjustLevel / 4;
				}
				else if ((g_ucprntAdjustLevel % 4) == 3)
				{
					for(i = 0; i < g_ucprntAdjustLevel / 4; i++)
					{
						bspDotPrntCRPhase(0);
						DelayXus(1000);
					}
					while (ucCRRunSteps < (PRNT_WIDTH / 2))
					{
						/* 切换相位走步后,延时750us开始打印出针操作 */
						if (ucCRRunSteps == 0)
						{
							bspDotPrntCRPhase(0);
							DelayXus(500);
						}
						/* 实际延时值为150us 收针操作 */
						Delay115us();
						PRT_TRIG_ON();
						PSOLENIO(~g_ucprntPattern2[uiPattenCount--]);
						Delay350us();
						PSOLENIO(0xff);
						PRT_TRIG_OFF();
						ucCRRunSteps ++;
						bspDotPrntCRPhase(0);
						Delay115us();
						PRT_TRIG_ON();
						PSOLENIO(~g_ucprntPattern2[uiPattenCount--]);
						Delay350us();
						PSOLENIO(0xff);
						PRT_TRIG_OFF();
					}
					/* 补齐时序,继续走完一步 */
					DelayXus(500);
					ucCRRunSteps = 1 + g_ucprntAdjustLevel / 4;
				}
				ucCRRunMode = 2;
				break;

			case 2: /* 减速步 */					
				bspDotPrntCRPhase(0);
				ucCRRunSteps ++;
				DelayXus(prntCRSpeeddown[16 - ucCRRunSteps ]);	
									
				if (ucCRRunSteps == 16)
				{
					/* 若应该触发HP而没有触发或者不应该触发确触发了HP则判为机械故障 */
					if (0 == bspDotPrntCheckHP())
					{
						g_ucprntState = g_ucprntState|MALFUNCTION;/* 故障 */
					}
					ucCRRunMode = 3;
					ucCRRunSteps = 0;
				}
				break;
				
			case 3: /* CR电机停机 */
				if (ucCRRunSteps == 0 )
				{
					DelayXus(PD);
					ucCRRunSteps ++;
				}
				else
				{
					bspDotPrntCRStop();
					ucCRRunFlag = 0;
					/* 启动任务切换 */
					OSSchedUnlock();
					return;
				}
				break;		

			default:
				break;
		}
	}	
	/* 启动任务切换 */
	OSSchedUnlock();
}

/*
**************************************************
*
* 函数名:bspDotPrntPFLineSpace
*
* 功  能:打印出针控制
*
* 输  入:无
*
* 输  出:无
*
* 返  回:N/A
*
***************************************************
*/
void bspDotprntControlPins
(
	UINT1 _ucValue /*打印字模的值*/
)
{
	PSOLENIO(_ucValue);
}

/*
***************************************************
*
* 函数名:bspDotPrntPFLineSpace
*
* 功  能:穿孔打印机进、退纸N步距函数
*
* 输  入:g_ucPaperType
*         g_ucprntCheckBM
*
* 输  出:无
*
* 返  回:N/A
*
****************************************************
*/
void bspDotPrntPFLineSpace
(
	UINT1 _ucDirection,       /* 1 进纸, 0 退纸  */
	UINT2 _uiLength		      /* 走纸或退纸的步数 */
)
{    
	UINT1 ucPFRunMode;
	UINT2 usPFBMStep = 0;
	UINT1 ucPFRunFlag = 1;
	UINT2 ucPFRunSteps = 0;
	const UINT2  prntPFSpeedUp[4] = {3500,2500,2500,1300};
	
	if ((_ucDirection > 1) || (_uiLength < 1) || (_uiLength > FEEDLEN))
	{
		return;
	}
	/* 根据走纸的步数来确定是否要加速 */
	LF_STEP_SIGNAL_ON();
	if (g_ucprntCheckBM)
	{
		g_ucprntCheckBM = 0;
		ucPFRunMode = 4;
	}
	else if (_uiLength == 1)
	{
		ucPFRunMode = 3;
	}
	else if (_uiLength <= 18)
	{
		ucPFRunMode = 0;
	}
	else /* >18步,要加速 */
	{
		ucPFRunMode = 1;
	}

	while (ucPFRunFlag )
	{
		switch (ucPFRunMode)
		{
			case 0: /* 低步数进纸不需要加减速过程 */
				bspDotPrntPFPhase(_ucDirection, g_ucPaperType);
				ucPFRunSteps ++;
				/* 用2500us比较合理 */
				DelayXus(PF_SHORTLEN_TIMER);
				if (ucPFRunSteps == _uiLength)
				{
					ucPFRunMode = 2;
				}
				break;		

			case 1: /* 进纸步数大于18步,需要加、减速处理 */
				bspDotPrntPFPhase(_ucDirection, g_ucPaperType);
				ucPFRunSteps ++;
			
				if (ucPFRunSteps <= 4)                    /* 加速运行 */
				{
					DelayXus(prntPFSpeedUp[ucPFRunSteps - 1]);
				}
				else if (ucPFRunSteps <= (_uiLength - 4)) /* 匀速运行 */
				{
					DelayXus(PF_SPEED_TIMER);
				}
				else if (ucPFRunSteps < _uiLength)        /* 减速运行 */
				{
					DelayXus(prntPFSpeedUp[_uiLength - ucPFRunSteps]);
				}
				else if (ucPFRunSteps == _uiLength) 
				{
					DelayXus(PD);
					ucPFRunMode = 2;
				}

				break;		

			case 2: /*PF stop*/
				bspDotPrntPFStop();
				ucPFRunFlag = 0;
				break;		

			case 3: /* 打印中文字符,单步进纸,时序2500us */
				ucPFRunSteps ++;
				if (ucPFRunSteps == 1)
				{
					bspDotPrntPFPhase(_ucDirection, g_ucPaperType);
					DelayXus(PF_SHORTLEN_TIMER);
				}
				else if (ucPFRunSteps == 2)
				{
					DelayXus(PD);
					ucPFRunMode = 2;
				}
				break;	

			case 4: /* 进纸找黑标流程 */
				bspDotPrntPFPhase(_ucDirection, g_ucPaperType);
				ucPFRunSteps ++;
				
				if (1 == ucPFRunSteps)
				{
					DelayXus(3500);
				}
				else if (2 == ucPFRunSteps)
				{
					DelayXus(2500);
				}
				else if ((0 == g_ucprntCheckedBMark)&&(ucPFRunSteps < 800))
				{	/* 未检测到黑标,并且未进纸到页长,则匀速进纸 */
					DelayXus(1300);
				}
				else
				{
					DelayXus(2500);

⌨️ 快捷键说明

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