📄 16c554.c
字号:
#include <REG952.H>
#include <intrins.H>
#include "16C554.h"
#include "uart.h"
#define uchar unsigned char
#define uint unsigned int
uchar d554,s[8]={0x08,0x18,0x28,0x38,0x00,0x10,0x20,0x30};
#define RBUF_SIZE554 8
#define SIZEMASK554 0x7
static unsigned char r_in554 = 0;
static unsigned char r_out554 = 0;
static unsigned char rbuf554[RBUF_SIZE554];
static void Serial_Int1(void) interrupt 2 using 0
{
uchar c,k;
EA=0;
for(k=0;k<8;k++)
{
c = 0x0f&SC16C554_Read(s[k]|ISR); //获取中断状态
if(c==0x04)
{
d554=k;
while(!SC16C554_Read(s[d554]|LSR)&0x1); //等待接收到的数据准备好
if (((r_in554 +1)&SIZEMASK554)!=r_out554)
{
rbuf554[r_in554]=SC16C554_Read(s[d554]|RHR); //接收数据
r_in554=(r_in554+1)&SIZEMASK554;
}
}
}
EA=1;
}
char com_getchar554(uchar *ch)
{
uchar b;
EX1=0;
if (com_rbuflen554()==0)
{
EX1=1;
return 0;
}
b=rbuf554[r_out554];
r_out554=(r_out554+1)&SIZEMASK554;
*ch=b;
EX1=1;
return (1);
}
/*计算接收缓冲器长度*/
unsigned char com_rbuflen554(void)
{
return ((r_in554 -r_out554)&SIZEMASK554);
}
//*************************************************************************
//函数名: SC16C554_Write
//功 能: 写SC16C554 寄存器
//入参数: reg=要写的寄存器地址,val=要写的值
//出参数: 无
//*************************************************************************
void SC16C554_Write(unsigned char Reg, unsigned char Val)
{
EA=0;
P5=Reg;
_nop_();
P4=0xEF&P4;
P0 = Val;
_nop_(); //_nop_()1us
P4=0x10|P4;
EA=1;
}
//*************************************************************************
//函数名: SC16C554_Read
//功 能: 读SC16C554寄存器
//入参数: reg=要读的寄存器地址
//出参数: 寄存器值
//*************************************************************************
unsigned char SC16C554_Read(unsigned char Reg)
{
unsigned char RegData;
EA=0;
P5=Reg;
_nop_();
P4=0xDF&P4;
RegData = P0;
P4=0x20|P4;
return RegData;
EA=1;
}
void SC16C554_SET(uchar PortID,uint baudrate)
{
uchar dll,dlm;
dll=(uchar)(1562500/baudrate);
dlm=(uchar)(1562500/baudrate/256);
SC16C554_Write(PortID|LCR,0x80); //设置波特率
SC16C554_Write(PortID|DLL,dll); //设置DLL 低位
SC16C554_Write(PortID|DLM,dlm); //设置DLL 高位
SC16C554_Write(PortID|LCR,0x03); //8位数据,1 位停止位,无奇偶校验位
SC16C554_Write(PortID|MCR,0x0); //清除外部输出
SC16C554_Write(PortID|FCR,0x0f); //FIFO
SC16C554_Write(PortID|IER,0x00); //设置16C554禁止所有中断
SC16C554_Write(PortID|IER,0x01); //允许554receiver ready interrupt
SC16C554_Write(PortID|MCR,0x08); //打开554串口总开关
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -