8250.c

来自「该程序用来测试89C51与IDE硬盘的接口」· C语言 代码 · 共 84 行

C
84
字号
/************************************************************/

8250 Module Subroutine by 易兵 

Copyright 《单片机编程世界》 1999

/************************************************************/
 

#define UartBase 0x6000
#define UartData XBYTE[UartBase+0x0000]
#define UartDLL XBYTE[UartBase+0x0000]
#define UartIER XBYTE[UartBase+0x0001]
#define UartDLM XBYTE[UartBase+0x0001]
#define UartIIR XBYTE[UartBase+0x0002]
#define UartLCR XBYTE[UartBase+0x0003]
#define UartMCR XBYTE[UartBase+0x0004]
#define UartLSR XBYTE[UartBase+0x0005]
#define UartMSR XBYTE[UartBase+0x0006]
#define UartSCR XBYTE[UartBase+0x0007]



/* for UART routine */
data char uart_rx_char;
data bit uart_rx_ready;


void UartInit(void); /* Photo type of routine */
void UartInit()
{
  UartLCR = 0x80; /* Change to Baud Gen. mode*/
  UartDLL = 0x0c; /* Baud = 1.8432M /16 /0x0c*/
  UartDLM = 0x00;
  UartLCR = 0x03; /* Change to N,8,1*/
  UartIER = 0x01; /* 0000 0001 - Int When Rx data */

  Uart2LCR = 0x80; /* Change to Baud Gen. mode*/
  Uart2DLL = 0x0c; /* Baud = 1.8432M /16 /0x0c*/
  Uart2DLM = 0x00;
  Uart2LCR = 0x03; /* Change to N,8,1*/
  Uart2IER = 0x01; /* 0000 0001 - Int When Rx data */
}

void UartSend(char); /* Photo type of routine */
void UartSend(char c)
{ UartData = c; /* Tx the char.*/
   UartCrcCalc(c);
   while((UartLSR&0x20)==0);
}

char UartGet(void); /* Photo type of routine */
char UartGet()
{ if (UartLSR&0x01)
    return(UartData);
   return(0x00);
}



void UartStr(char *); /* Photo type of routine */
void UartStr(char *c)
{ data unsigned char d=0;
    while (c[d]!=0)
    UartSend(c[d++]); /* char to Uart */
}


/* subroutine for Interrupt Service */
void interrupt1() interrupt 2
{ 

  EX1=0;
  uart_rx_char=UartData;
  if (!uart_rx_ready)
{ 
   uart_rx_ready=1;
   UartInit();
}
EX1=1;
}
 
     

⌨️ 快捷键说明

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