#define ECLOCK 24000000L #define BAUD9600 (ECLOCK/(16*9600L)) #define TE 0x08 #define RE 0x04 #define TDRE 0x80 #define RDRF 0x20 #define SCI_BASE_ADDR 0xC8 struct sSCI { unsigned short bdr; // 0x0 unsigned char cr1; // 0x2 unsigned char cr2; // 0x3 unsigned char sr1; // 0x4 unsigned char sr2; // 0x5 unsigned char drh; // 0x6 unsigned char drl; // 0x7 }; #define SCI ((struct sSCI *)SCI_BASE_ADDR) void sci_init(void) { // init baud rate SCI->bdr = BAUD9600; // enable transmission + recieving SCI->cr2 |= TE | RE ; } char serial_in(void) { // check that data have been recieved while((SCI->sr1 & RDRF) == 0); // return data return SCI->drl; } void serial_out(char a) { // check that data register is available (empty) while((SCI->sr1 & TDRE) == 0); // write data SCI->drl = a; }