📄 bspdotprnt.c
字号:
/*
****************************************************
*
* 函数名: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 + -