📄 serial_poll.c
字号:
//=======================================================================================
//
// SERIAL_POLL.C - UART Polling Routines.
//
// (C) Copyright 2003-4-20, ARM STUDY GROUP
// By Lee Chae-Won (ichijo@hanafos.com ; ichijo99@hanmail.net)
// http://arm.cim.co.kr/ , http://user.chollian.net/~hebb/
//
//=======================================================================================
typedef unsigned char byte;
typedef unsigned short word;
typedef unsigned int dword;
#define UARTClock 75000000
#define PNone 0x00000000
#define D8Bit 0x00000003
#define S1Bit 0x00000000
#define CR 0x0d#define BS 0x08
#define BAUD 115200
#include "REG_DEFINE.H"
void ser_init(byte Port)
{
switch(Port){
case 0:
rINTMSK |= (0x1<<23); // Rx INT. Disable
rINTMSK |= (0x1<<28); // Tx INT. Disable
rULCON0 = D8Bit + PNone + S1Bit;
rUCON0 = 0x00000005; // Tx, Rx Pulse mode, INT. or Polling mode
rUFCON0 = 0; // FIFO Disable
rUMCON0 = 0x1; // ACF Off, RTS: Low (Active)
rUBRDIV0 = (dword) ((UARTClock / (BAUD*16))-1);
break;
case 1:
rINTMSK |= (0x1<<24); // Rx INT. Disable
rINTMSK |= (0x1<<29); // Tx INT. Disable
rULCON1 = D8Bit + PNone + S1Bit;
rUCON1 = 0x00000005; // Tx, Rx Pulse mode, INT. or Polling mode
rUFCON1 = 0; // FIFO Disable
rUMCON1 = 0x1; // ACF Off, RTS: Low (Active)
rUBRDIV1 = (dword) ((UARTClock / (BAUD*16))-1);
break;
}
}
void ser_putch(byte Port, char ch) {
switch(Port){
case 0:
while(!(rUTRSTAT0&0x02));
rUTXH0 = ch;
break;
case 1:
while(!(rUTRSTAT1&0x02));
rUTXH1 = ch;
break;
}} char ser_getch(byte Port)
{
char ch;
switch(Port){
case 0:
while(!(rUTRSTAT0&0x01));
ch = rURXH0;
break;
case 1:
while(!(rUTRSTAT1&0x01));
ch = rURXH1;
break;
}
ser_putch(Port, ch); // Echo!! return (ch);
}
int asc2int(char ch) /* Conv. ASCII code into Integer */
{
if ((ch>='0') && (ch<='9')) return (ch-'0');
else if ((ch>='A') && (ch<='F')) return ( (ch-'A')+10 );
else if ((ch>='a') && (ch<='f')) return ( (ch-'a')+10 );
else return -1;
}
int int2asc(int i) /* Conv. integer into ASCII code */
{
if ((i >= 0) && (i <= 9)) return (i&0x0f)+'0';
else if ((i >= 10) && (i <= 15)) return (i&0x0f)+'A';
else return -1;
}
void puthex1(byte Port, char c) /* Output 1 nibble HEX code */
{
if( c>=10) ser_putch(Port, c+'A'-10);
else ser_putch(Port, c+'0');
}
void puthex(byte Port, char ch) /* Out 1 Byte HEX code */
{
puthex1(Port, (ch>>4)&0x0f);
puthex1(Port, ch&0x0f);
}
void puthexw(byte Port, unsigned short ch) /* Output 2 Byte HEX code */
{
puthex(Port, (ch>>8)&0xff);
puthex(Port, ch&0xff);
}
int ser_gets(byte Port, char* str) /* read string */
{
int i;
for( i=0; *(str+i) != 0;)
{
*(str+i) = ser_getch(Port); /* read 1 byte... */
if(*(str+i) == BS) /* if it is Back space? */
{
if( i>0)
{
ser_putch(Port, *(str+i)); /* Echo */
i--; /* Decrease */
}
}
else if(*(str+i) == CR) /* If ENTER? */
{
*(str+i) = 0; /* Insert NULL */
break; /* Escape */
}
else if(!(((*(str+i)>0) &&(*(str+i)<0x1F))||(*(str+i)==0x7F))){ /* If neither 0~1F nor 7F*/ ser_putch(Port, *(str+i)); /* Echo */ i++; /* Increase */ }
} /* Repeat */
return( i); /* Return No. of characters */
}
void ser_puts(byte Port, char* str)
{
int i;
for( i=0; *(str+i) != 0; i++)
{
ser_putch(Port, *(str+i));
}
}
short getdec(byte Port)
{
short dec;
dec = asc2int(ser_getch(Port));
return dec;
}
short getdecw(byte Port)
{
short high, low;
short result;
high = getdec(Port); low = getdec(Port);
result = 10*high + low;
return result;
}
void putdec(byte Port, unsigned short ch)
{
ch = ch % 100;
puthex1(Port, ch/10);
puthex1(Port, ch%10);
}
void putdecw(byte Port, unsigned short ch)
{
ch = ch % 10000;
putdec(Port, ch/100);
putdec(Port, ch%100);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -