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