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

📄 bsptsprnt.c

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

#pragma arm section code = "bspTSSendOneLine"
/*
******************************************************
*
* 函数名:bspTSSendOneLine 
*
* 功  能:热敏打印发送点行数据SPI设置
*
* 输  入:g_ucprntPrintLineBuffer
*
* 输  出:s_ucTSSendOneLine
*
* 返  回:无
*		  
*
******************************************************
*/
void bspTSSendOneLine (void)
{
	UINT1 i;
	UINT1 ucValidCharacter = 0;
	
	if ((g_ucSpi0SendMark != 0) || (g_ucSpi0RecMark != 0))	/* 验证Spi是否被占用 */
	{
		return;
	}
	s_ucTSSwitchSpiMark = 1; 
	g_ucTsOccupySpiMark = 1;
	g_ucSpi0SendMark = SPI0_GEN_TX;
	s_ucTSSendOneLine = 0;

	/* 锂电池供电 */
	if (!s_ucAdapterPowder)
	{
		for (i = 0; i < 48; i ++)
		{
			if (g_ucprntPrintLineBuffer[s_usTSprntLinePrinted][i] != 0)
			{
				ucValidCharacter ++;
			}
		}
		
		/* 通过判断点行数据量(50%有效打印字符) */
		if ((ucValidCharacter > 24)&&(!s_ucDoubleHeat))
		{
			/* 下一点行拟采用两次加热打印 */
			s_ucNextDoubleHeat = 1;
		}
		else if ((ucValidCharacter < 24)&&(s_ucDoubleHeat))
		{
			/* 下一点行采用单次加热打印 */
			s_ucNextDoubleHeat = 0;
		}
		
		/* 仅调整加热时间 */
		if (ucValidCharacter < 24) /* 单行只有1/3数据可以打印 */
		{
			s_ucPrntAdjEffect = 1; /* 需要调整该点行打印效果 */
		}
		else
		{
			s_ucPrntAdjEffect = 0; /* 该点行打印效果不需要调整 */
		}
	}
	else
	{
		s_ucNextDoubleHeat = 0;
	}
	
	g_Spi0Tx.pTxBuf = &g_ucprntPrintLineBuffer[s_usTSprntLinePrinted][0];
	g_Spi0Tx.ucWantTxLen = 48;
	g_Spi0Tx.ucAlreadyTxLen = 0;
	SPI0_SPDR = g_Spi0Tx.pTxBuf[g_Spi0Tx.ucAlreadyTxLen++];

	return;
}
#pragma arm section code

/*
******************************************************
*
* 函数名:bspTSConfirmHeatTime 
*
* 功  能:热敏打印机根据终端设定和电池供电不同确定加热时间
*
* 输  入:g_usBatteryValue
*
* 输  出:g_ucprntHeatTime
*
* 返  回:无
*		  
*
******************************************************
*/
void bspTSConfirmHeatTime(void)
{
    UINT1 ucprntHeatTime;
    UINT4 ustmp;

    /* 读取热敏加热时间参数 */
    ET_mntnReadParaValue(ID_MNTN_THERMAL_HEAT_TIME, &ucprntHeatTime);
    if (g_ucVccOffCnt >= VCC_OFF_CNT)/*外电池掉电、锂电池供电 >=*/
    {
    	s_ucAdapterPowder = 0;
        ustmp = g_usBatteryValue/100;
        ustmp = (3257 + 41*(ustmp*ustmp)/5 - 319*ustmp)/ADJUST_TIMER_SCALE * ucprntHeatTime/40; 

        if (ustmp > 240)
        {
        	g_ucprntHeatTime = 250;
        }
        else
        {
	        if (g_usBatteryValue < 1750)        /*电压过低,额外补偿*/
	        {
	            g_ucprntHeatTime = ustmp + 10;
	        }
	        else
	        {
	            g_ucprntHeatTime = ustmp;
	        }
        }
        s_ucFirstArrayHeatEnd = 2;
        s_ucprntStepTime = (g_ucprntHeatTime + 4/ADJUST_TIMER_SCALE)/4 ;        /* 打印走步时间 */
	    /* 打印点行加热时间不大于走步时间 */
	    if (g_ucprntHeatTime >= 4*s_ucprntStepTime)
	    {
	    	s_ucprntStepTime = s_ucprntStepTime + 2;
	    }
	    else
	    {
	    	s_ucprntStepTime = s_ucprntStepTime + 1;
	    }
    }
    else
    {
    	s_ucAdapterPowder = 1;
        if ((ucprntHeatTime >= 30) && (ucprntHeatTime <= 180))
        {
            g_ucprntHeatTime = ucprntHeatTime/ADJUST_TIMER_SCALE; /* 设置打印加热时间 */
        }
        else
        {
            g_ucprntHeatTime = HEAT_TIME_DEFAULT/ADJUST_TIMER_SCALE;        /* 默认打印加热时间3.8ms */                                     
        }
	    s_ucprntStepTime = (g_ucprntHeatTime + 4/ADJUST_TIMER_SCALE)/4 ;        /* 打印走步时间 */
	    /* 打印点行加热时间不大于走步时间 */
	    if (g_ucprntHeatTime >= 4*s_ucprntStepTime)
	    {
	        s_ucprntStepTime = s_ucprntStepTime + 1;
	    }
    }
    return;
}

/*
*****************************************************
*
* 函数名:bspTSPrntSetInitState
*
* 功  能:置热敏打印初始状态函数
*
* 输  入:无
*
* 输  出:无
*
* 返  回:N/A
*
*****************************************************
*/
void bspTSPrntSetInitState (void)
{
	bspTSPrntEraseBuffer();
	bspTSConfirmHeatTime();
	g_usTSPrintedLine = 0;
	return;
}

/*
*****************************************************
*
* 函数名:bspTSPrntSetEndState
*
* 功  能:置热敏打印结束状态函数
*
* 输  入:无
*
* 输  出:无
*
* 返  回:N/A
*
*****************************************************
*/
void bspTSPrntSetEndState (void)
{
	HEAT_DISABLE1;
	HEAT_DISABLE2;
	s_ucprntPrintEnable = 0;
	bspTSPrntEraseBuffer();
	bspTSPrntPFStop();
	bspTimer1Stop();
	s_ucTSSwitchSpiMark = 0;
	s_ucRsponseKey = 0;
	
	return;
}

/*
*****************************************************
*
* 函数名:bspTSPrntISTRInit
*
* 功  能:热敏打印中断服务函数变量初始化,触发打印功能
*
* 输  入:无
*
* 输  出:无
*
* 返  回:N/A
*
*****************************************************
*/
void bspTSPrntISTRInit(void)
{
	UINT1 ucprntLineBuffer[48];
	
	s_ucDoubleHeat = 0;
	s_ucTSSwitchSpiMark = 1; 
	g_ucTsOccupySpiMark = 1;
	g_ucSpi0SendMark = SPI0_GEN_TX;
	s_ucTSSendOneLine = 0;
	s_ucPrntBlankLine = 1;
	mem_set(&ucprntLineBuffer[0], 0 ,48);
	g_Spi0Tx.pTxBuf = &ucprntLineBuffer[0];
	g_Spi0Tx.ucWantTxLen = 48;
	g_Spi0Tx.ucAlreadyTxLen = 0;
	SPI0_SPDR = g_Spi0Tx.pTxBuf[g_Spi0Tx.ucAlreadyTxLen++];
	OPERATE_LAT;		
	/* 运动步数计数器清0 */
	s_usprntPFStepCnt = 0;
	s_ucprntTimerStepCnt = 0;
	s_ucprntTimerHeatCnt = 0;
	s_ucprntPrintEnable = 1;
	s_ucprntHeatEnable = 1;
	s_ucprntPFRunSign = 0;
	bspTSprntSetISRTimer(s_ucprntStepTime);
	//HEAT_ENABLE;/* 确保打印第一点行 */
	s_ucTSSendOneLine = 1;
	return;
}

/*
**************************************************
*
* 函数名:bspTSPrntEraseBuffer
*
* 功  能:热敏打印机清空打印缓冲区
*
* 输  入:无
*
* 输  出:打印缓冲区输出、打印定位标志位
*
* 返  回:N/A
*
**************************************************
*/
void bspTSPrntEraseBuffer(void)
{
	UINT1 i,j;
	
	for (i = 0 ; i < DOTLINE_LIMIT ; i ++)
	{
		for (j = 0 ; j < TS_ONE_LINE_BYTE; j ++)
		{
			g_ucprntPrintLineBuffer[i][j] = 0;
		}
	}
	s_usprntDotLine = 0;					
	s_ucprntBitInByte = 0x80; 						
	s_ucprntHoriByte = 0; 		 			
	s_usprntDotLineDealed = 0;	 		
	s_usTSprntLinePrinted = 0;	 					
	s_usprntHoriPosition = 0;	
	return;
}

/*
*****************************************************
*
* 函数名:bspTSPrntPFStop
*
* 功  能:热敏打印机停机函数
*
* 输  入:无
*
* 输  出:无
*
* 返  回:N/A
*
*****************************************************
*/
void bspTSPrntPFStop(void)
{
	HEAT_DISABLE1;
	HEAT_DISABLE2;
	TS_POWER_OFF();			 /* 关闭5v电源 */
	s_ucprntPFRunSign = 0;   /* 清0进纸运行标志位 */
	s_ucprntHeatEnable = 0;  /* 清0加热使能标志位 */
	s_ucprntPrintEnable = 0; /* 清0打印使能标志位 */
	return;
}

/*
***************************************************
*
* 函数名:bspTSPrntPFLineSpace
*
* 功  能:热敏打印机温度检测
*
* 输  入:N/A
*
* 输  出:g_ucprntState
*
* 返  回:N/A
*
****************************************************
*/
INT1 bspTSPrntDetectTemp(void)
{
	UINT1 ucRet;
	UINT2 uiTempvoltage;   /* 单位是mv */

	ucRet = bspAdcStart(0, &uiTempvoltage);
	if (0 == ucRet)
	{
		if (uiTempvoltage <= TEMP_lIMIT_VALUE) /* 65度对应电压值mv */
		{
			g_ucprntState = g_ucprntState|HIGHTEMP;
		}
		else
		{
			g_ucprntState = g_ucprntState&0xfb;
		}
		return SUCCESS;
	}
	else
	{
		return FAULT;
	}
}

/*
*****************************************************
*
* 函数名:bspTSPrntArabAndASCDeal
*
* 功  能:热敏打印机阿拉伯语中ASCII处理
*
* 输  入:s_ucTSprntDataBuffDataIn
*         s_ucRevBuffer

*
* 输  出:s_ucRevBuffer
 
*
* 返  回:N/A
*
*****************************************************
*/	
void bspTSPrntArabAndASCDeal(void)
{
	UINT1 j;
	for (j = 0;j < s_ucTSprntDataBuffDataIn ;j++)
	{
		if (((s_ucRevBuffer[j] >= 'A') && (s_ucRevBuffer[j] <= 'Z') == 0x01)
				|| ((s_ucRevBuffer[j] >= 'a') && (s_ucRevBuffer[j] <= 'z') == 0x01)
				|| ((s_ucRevBuffer[j] >= '0') && (s_ucRevBuffer[j] <= '9') == 0x01))
		{
			guiReverseNum(s_ucRevBuffer+j);	
			break;				
		}

	}
	return;
}
/*
*****************************************************
*
* 函数名:bspTSPrntData
*
* 功  能:热敏打印机命令解析打印函数
*
* 输  入:s_usprntDotLineDealed
*         s_ucTSDealedLineCounter
*         s_ucOverFlowPrinted
*         g_ucBatVolLower
*         g_syscPowOff
*
* 输  出:s_usprntDotLine
*         g_ucprntPrintLineBuffer、
*      	  s_ucTSSendOneLine
*         s_ucprntPrintEnable   
*
* 返  回:N/A
*
*****************************************************
*/
void bspTSPrntData
(
	UINT1 *_pData,          	/* [in]待解析的排版打印数据 */
	UINT2  _usLength,       	/* 数据的长度 */
	UINT1 _ucLineSpace,    		/* 热敏打印行间距 */
	UINT1  _ucStartPos 	   		/* 热敏打印确定横向起始位置(精确mm) */
)
{	
	UINT2 i,j,k;
	UINT2 uiStepCount,uiStepTempCount;
	UINT1 ucEnableDealData = 1;
	UINT1 ucSetHeatTime = 0;
	UINT1 ucBeginPlace = 0;
	UINT1 ucRet = 0;
	UINT1 ucfPrnt = 1;
	INT1  Ret = 0;
	UINT1 ucParseData[2] = {0};
	
	mem_set(s_ucTSprntDataBuffer, 0 , sizeof(s_ucTSprntDataBuffer));
	/* 热敏打印行间距不超过默认行间距2倍 */
	if (_ucLineSpace >= 2*TS_DEFAULT_lINESPACE)
	{
		return ;
	}
	TS_POWER_ON();
	//bspUart0Set(9600);
	//bspUart0Write((UINT1 *)"1", 1);
	
	//OSTimeDly(100);
	bspTSPrntDetectTemp(); /* 温度过高程序自恢复功能 */
	bspTSPrntSetInitState();
	bspTSPrntSetIntPos(_ucStartPos);
	i = 0;
	s_ucRsponseKey = 1;   /* 热敏打印时候禁止响应进、退纸键 */
	
	if (g_ucPaperType)   
	{
		/* 定长票据支持票据分多次打印初始定位,其中黑标距离打印起始位置9mm(9mm*8*4=288点) */
		uiStepCount = (g_usprntPaperLen1 - 288)/4;
	}
	else
	{
		/* 不定长票据支持票据分多次打印初始定位,起始位置就是当前相对位置 */
		uiStepCount = g_usprntPaperLen3/4;
	}
	
	do
	{
		/* 打印机状态异常或外电掉电并且锂电池电压低,则停止打印 */
		if ((g_ucprntState&0x0f)||((g_ucVccOffCnt >= VCC_OFF_CNT)&&(g_ucBatVolLower == 1)))
		{
			bspTSPrntSetEndState();
			if (g_syscPowOff == SUCCESS) 
			{
				g_ucprntState = g_ucprntState |LOSEPOWER;
			}
			if ((g_usTSPrintedLine <= 345)&&(g_ucprntState&0x01))
			{
				g_usTSPrintedLine = 0;
			}
			return;
		}
		
		if ((i < _usLength)&&(ucEnableDealData)) /* 命令解析处理 */
		{
			switch (_pData[i])
			{
				case 0x0b: /* 设置倍宽打印命令 */
					s_ucTSDoubleWidth = 1;
					s_ucMaxASClen = 16;
					i ++;
					break;
				
				case 0x14: /* 取消倍宽打印命令 */
					s_ucTSDoubleWidth = 0;
					s_ucMaxASClen = LINEASCIINUM;
					i ++;
					break;
					
				case 0x0f: /* 设置倍高打印命令 */

⌨️ 快捷键说明

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