#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
{
}