#include #include "sysinit.h" // for SYSCLK //#define SYSCLK 22118400 #define BAUDRATE 57600 #define BAUDVAL (65536 - (SYSCLK / BAUDRATE / 32)) // why 32 and not 16?? void uart0_init(void) { char save = SFRPAGE; SFRPAGE = UART0_PAGE; SCON0 = 0x70; // enable Uart0 TX and RX, stop bit level checking SSTA0 = 0x15; // disable divide-by-two on baud rate, enable timer2 clock source TI0 = 1; // initialize transmitter ready flag SFRPAGE = TMR2_PAGE; // Load the preload value into Timer2 RCAP2L = (BAUDVAL & 0xff); RCAP2H = ((BAUDVAL >> 8) & 0xff); // Set up Timer2 TMR2CF = 0x08; // use SYSCLK as Timer2 timebase TMR2CN = 0x04; // start Timer2 SFRPAGE = save; } void uart0_tx(char ch) { char save = SFRPAGE; SFRPAGE = UART0_PAGE; while (!TI0); TI0 = 0; SBUF1 = ch; SFRPAGE = save; } char uart0_rx(void) { char save = SFRPAGE; char ch; SFRPAGE = UART0_PAGE; while (!RI0); RI0 = 0; ch = SBUF0; SFRPAGE = save; return ch; } char uart0_ready(void) { char save = SFRPAGE; char ret; SFRPAGE = UART0_PAGE; ret = (RI0 != 0); SFRPAGE = save; return ret; } void putchar(char c) { uart0_tx(c); } char getchar(void) { return uart0_rx( ); }