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

📄 16c552.c

📁 16c552驱动程序
💻 C
字号:

#define PRINT_PE		0
#define PRINT_BUSY	1
#define PRINT_OK	2

#define 16C1552_BaseAddress	0x0000

//UART A REGISTER DEFINE
#define UART2_RBR	XBYTE[16C1552_BaseAddress+0x00]
#define UART2_THR  	XBYTE[16C1552_BaseAddress+0x00]
#define UART2_DLL  	XBYTE[16C1552_BaseAddress+0x00]
#define UART2_DLM  	XBYTE[16C1552_BaseAddress+0x01]
#define UART2_IER  	XBYTE[16C1552_BaseAddress+0x01]
#define UART2_FCR  	XBYTE[16C1552_BaseAddress+0x02]
#define UART2_IIR  	XBYTE[16C1552_BaseAddress+0x02]
#define UART2_LCR  	XBYTE[16C1552_BaseAddress+0x03]
#define UART2_MCR  	XBYTE[16C1552_BaseAddress+0x04]
#define UART2_LSR  	XBYTE[16C1552_BaseAddress+0x05]
#define UART2_MSR  	XBYTE[16C1552_BaseAddress+0x06]
#define UART2_SCR  	XBYTE[16C1552_BaseAddress+0x07]


//UART B REGISTER DEFINE
#define UART3_RBR	XBYTE[16C1552_BaseAddress+0x00]
#define UART3_THR  	XBYTE[16C1552_BaseAddress+0x00]
#define UART3_DLL  	XBYTE[16C1552_BaseAddress+0x00]
#define UART3_DLM  	XBYTE[16C1552_BaseAddress+0x01]
#define UART3_IER  	XBYTE[16C1552_BaseAddress+0x01]
#define UART3_FCR  	XBYTE[16C1552_BaseAddress+0x02]
#define UART3_IIR  	XBYTE[16C1552_BaseAddress+0x02]
#define UART3_LCR  	XBYTE[16C1552_BaseAddress+0x03]
#define UART3_MCR  	XBYTE[16C1552_BaseAddress+0x04]
#define UART3_LSR  	XBYTE[16C1552_BaseAddress+0x05]
#define UART3_MSR  	XBYTE[16C1552_BaseAddress+0x06]
#define UART3_SCR  	XBYTE[16C1552_BaseAddress+0x07]

#define PRT_DATA  	XBYTE[16C1552_BaseAddress+0x00]
#define PRT_STS  	XBYTE[16C1552_BaseAddress+0x01]
#define PRT_CON  	XBYTE[16C1552_BaseAddress+0x02]

#define 16C552_FRE  8			//crystal frequency
#define UART2_BAUT 9600			//uart 2 baut rate
#define UART3_BAUT 9600			//uart3 baut rate
#define DL_UART2 (unsigned int)(16C552_FRE*1000000/16/UART2_BAUT)	 //分频系数计算
#define DL_UART3 (unsigned int)(16C552_FRE*1000000/16/UART3_BAUT)

#define Enable_Prt_Int()	PRT_CON=0x1c;
#define Disable_Prt_Int()	PRT_CON=0x0c;

/********************************************************************** 
*
* 名称:  Init_16C552
* 说明:  
* 功能:  初始化552串口和并口
* 调用:  none
* 输入:  none
* 返回值:  none
*
***********************************************************************/

void Init_16C552(void)
{
	unsigned char temp;
	SELECT_UART2;
	//串口2设置
	UART2_LCR = 0x80;		 // 使能波特率设置
	UART2_DLL = DL_UART2%256; // 设置通讯波特率为1200
	UART2_DLM = DL_UART2/256;
	UART2_LCR = 0x03;		 // 8 bit_data, 1 bit_stop, no parity
	UART2_FCR = 0x00;		 //禁止FIFO模式
	UART2_IER = 0x01; 		// 使能接收中断01
	UART2_MCR = 0x08;		 // 使能串口中断
	temp=UART2_RBR;		// clear the int flag of 16c552

	//串口3设置
	SELECT_UART3;
	UART3_LCR = 0x80;		 // 使能波特率设置
	UART3_DLL = DL_UART3%256; // 设置通讯波特率为1200
	UART3_DLM = DL_UART3/256;
	UART3_LCR = 0x03;		 // 8 bit_data, 1 bit_stop, no parity
	UART3_FCR = 0x00;		 //禁止FIFO模式
	UART3_IER = 0x01; 		// 使能接收中断01
	UART3_MCR = 0x08;		 // 使能串口中断
	temp=UART3_RBR;		// clear the int flag of 16c552


	//并口设置
	SELECT_PRT;
	PRT_CON=0x0c;			//pull strobe signal high
	PRT_DATA=0xFF;
	SELECT_NULL;
}


/********************************************************************************
此函数为向并口发送一个字节,发送之前检查PE信号,如果出
错则返回PRINT_PE(0),检查BUSY状态,如果2s钟一直忙则超时推出,
返回PRINT_BUSY(1),如果一切正常返回PRINT_OK(2)
*********************************************************************************/
unsigned char WriteOneByteToPrt(unsigned char Data)
{	
	unsigned char Status;
	unsigned int Timer=0xffff;
	
	SELECT_PRINTER;
	Prt_Status=PRT_STS;
	if(Prt_Status&0x20)	return PRINT_PE;			//judge paper out
	while((!(Prt_Status&0x80))&&(Timer--))			//JUDGE BUSY,and quit after 1s busy
	{
		Prt_Status=PRT_STS;
	}
	if(Timer==0)	return PRINT_BUSY;
	
	PRT_DATA=Data;	
	PRT_CON=0x0d;		// generate the strobe signal
						//maybe need some delay here
	PRT_CON=0x0c;
	SELECT_NULL;
	return PRINT_OK;
}

/********************************************************************************
此函数为向并口发送一组数据,数据个数为Number,指针指向需要发送的地址
*********************************************************************************/
void WriteStringToPrt(unsigned char *Pointer,unsigned char  Number)
{
	unsigned char tmp;
	tmp=*Pointer;
	while(Number--)
	{
		if(WriteOneByteToPrt(tmp)!=PRINT_OK)	 break;
		Pointer++;
		tmp=*Pointer;
	}
}


/********************************************************************** 
*
* 名称:  UART2_SendByte
* 说明:  
* 功能:  从串口2发送1个字节
* 调用:  none
* 输入:  
* 返回值:  none
*
***********************************************************************/

void UART2_SendByte(unsigned char Data)
{
	unsigned int Timer=5000;
	SELECT_UART2;
	while(((UART2_LSR&0x20)==0)&&(Timer--))		//wait transmit can receive a new byte
	{
		;
	}
	if(Timer==0)					//add error process code here
	{
		;
	}
	UART2_THR=Data;	
	SELECT_NULL;
}

void UART3_SendByte(unsigned char Data)
{
	unsigned int Timer=5000;
	SELECT_UART3;
	while(((UART3_LSR&0x20)==0)&&(Timer--))		//wait transmit can receive a new byte
	{
		;
	}
	if(Timer==0)					//add error process code here
	{
		;
	}
	UART3_THR=Data;	
	SELECT_NULL;
}

//串口2接收数据中断
void UART2(void) interrupt 2
{
	unsigned char temp;
	SELECT_UART2;
	
	temp=UART2_RBR;		// read receive buffer
//add your code here

	SELECT_NULL;
	
}

//串口3接收数据中断
void  UART3(void) interrupt 6
{
	SELECT_UART3;
	temp=UART2_RBR;		// read receive buffer
//add your code here


	SELECT_NULL;
}

//并口数据申请中断
void  PRT(void) interrupt 7
{
}

⌨️ 快捷键说明

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