#define rGPACON (*(volatile unsigned long *) 0x7F008000)
#define rGPAPUD (*(volatile unsigned long *) 0x7F008008)
#define rULCON0 (*(volatile unsigned long *) 0x7F005000)
#define rUCON0 (*(volatile unsigned long *) 0x7F005004)
#define rUFCON0 (*(volatile unsigned long *) 0x7F005008)
#define rUMCON0 (*(volatile unsigned long *) 0x7F00500C)
#define rUBRDIV0 (*(volatile unsigned long *) 0x7F005028)
#define rUDIVSLOT0 (*(volatile unsigned long *) 0x7F00502C)
#define rUTXH0 (*(volatile unsigned long *) 0x7F005020)
#define rURXH0 (*(volatile unsigned long *) 0x7F005024)
#define rUTRSTAT0 (*(volatile unsigned long *) 0x7F005010)
#define uINT unsigned int
void Uart_Init(void)
{
rGPACON = (rGPACON & ~(0xff<<0)) | (0x22<<0); // GPA0->RXD0, GPA1->TXD0
rGPAPUD = (rGPAPUD & ~(0xf<<0)) | (0x1<<0); // RXD0: Pull-down, TXD0: pull up/down disable
rULCON0 = 0x03; // Normal Mode, No Parity, 1 Stop Bit, 8 Bit Data
rUCON0 = 0x805; // PCLK divide, Polling Mode
rUMCON0 = 0x00; // Disable Auto Flow Control
rUBRDIV0 = 35; // Baud rate
rUDIVSLOT0 = 0x80; //aSlotTable[DivSlot];
void WrUTXH0(char data)
{
rUTXH0 = data;
}
uINT RdURXH0()
{
char data;
data = rURXH0;
return data;
}
void Uart_SendByte(char data)
{
while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
WrUTXH0(data);
}
void Uart_SendString(char *pt)
{
while(*pt)
Uart_SendByte(*pt++);
}
//=====================================================================
char Uart_GetCh(void)
{
while(!(rUTRSTAT0 & 0x1)); //Receive data ready
return RdURXH0();
}
char Uart_GetKey(void)
{
if(rUTRSTAT0 & 0x1) //Receive data ready
return RdURXH0();
return 0;
}