/* * Serial port driver for 16Cxx chips * using RTCC. */ /* * Tunable parameters */ #include #include /* Transmit and Receive port bits */ static bit TxData @ (unsigned)&PORTA*8+3; /* bit3 in port A */ static bit RxData @ (unsigned)&PORTA*8+2; /* bit2 in port A */ /* Xtal frequency */ #define XTAL 4000000 /* Baud rate */ #define BRATE 9600 /* Don't change anything else */ #define DLY 3 /* cycles per loop */ #define TX_OHEAD 20 /* overhead cycles per loop */ #define RX_OHEAD 14 /* receiver overhead per loop */ #define DELAY(ohead) (((XTAL/4/BRATE)-(ohead))/DLY) void putch(char c) { unsigned char dly, bitno; bitno = 11; TRISA = 7; for(bitno = 11 ;; --bitno) { switch(bitno) { case 11: /* start bit */ TxData = 0; break; case 10: case 9: case 8: case 7: case 6: case 5: case 4: case 3: if(c & 1) TxData = 1; if(!(c & 1)) TxData = 0; c >>= 1; break; case 2: TxData = 1; /* stop bit */ case 1: break; case 0: return; } dly = DELAY(TX_OHEAD); do /* nix */ ; while(--dly); } } char getch(void) { unsigned char c, bitno, dly; for(;;) { while(RxData) continue; /* wait for start bit */ dly = DELAY(3)/2; do /* nix */; while(--dly); if(RxData) continue; /* twas just noise */ bitno = 8; c = 0; do { c >>= 1; dly = DELAY(RX_OHEAD); do /* nix */; while(--dly); if(RxData) c |= 0x80; } while(--bitno); return c; } }