#include "config.h" #include "io430x16x.h" #ifndef EOF #define EOF (-1) #endif #ifndef USART0_RX_BUF_LEN #define USART0_RX_BUF_LEN (8) #endif #ifndef USART0_TX_BUF_LEN #define USART0_TX_BUF_LEN (8) #endif #define enable_USART0_RX_interrupt IE1 |= URXIE0 //#define disable_USART0_RX_interrupt IE1 &= ~URXIE0 #define enable_USART0_TX_interrupt IE1 |= UTXIE0 #define disable_USART0_TX_interrupt IE1 &= ~UTXIE0 static char rxput=0; static char rxget=0; static int ungetcharacter = EOF; static char rxbuf[USART0_RX_BUF_LEN]; static char txput=0; static char txget=0; static char txbuf[USART0_TX_BUF_LEN]; void U0_init (int div ) { rxput = rxget = txput = txget = 0; P3SEL |= (1<<4) | (1<<5); // sel P3.4 and P3.5 for USART0 P3DIR |= (1<<4); // TxD0, output P3DIR &=~(1<<5); // RxD0, input ME1 |= URXE0 | UTXE0; U0CTL_bit.SWRST = 1; U0CTL_bit.CHAR = 1; // 8 bit U0TCTL = (SSEL0 | SSEL1); //U0RCTL U0BR0 = div & 0xff; U0BR1 = div >> 8; U0MCTL = 0; U0CTL_bit.SWRST = 0; enable_USART0_RX_interrupt; } /* int U0_getchar (void) { while( IFG1_bit.URXIFG0 != 1 ) ; return U0RXBUF; } int U0_putchar (int ch) { while( IFG1_bit.UTXIFG0 != 1 ) ; return U0TXBUF = ch; } */ #pragma vector = USART0RX_VECTOR __interrupt void USART0_RX(void) { char i = rxput; rxbuf[i++] = U0RXBUF; if( i >= USART0_RX_BUF_LEN ) i=0; if( i != rxget ) rxput = i; } #pragma vector = USART0TX_VECTOR __interrupt void USART0_TX(void) { U0TXBUF = txbuf[txget++]; if( txget >= USART0_TX_BUF_LEN ) txget=0; if( txget == txput) disable_USART0_TX_interrupt; } int U0_getchar(void) { if(ungetcharacter != EOF) { int i = ungetcharacter; ungetcharacter = EOF; return i; } if(rxget != rxput) { int i = rxbuf[rxget]; if( rxget >= (USART0_RX_BUF_LEN-1) ) rxget=0; else rxget++; return i; } else return EOF; } int U0_ungetc (int ch) { return ungetcharacter = ch; } int U0_putchar (int ch) { char i=txput; if( ++i >= USART0_TX_BUF_LEN ) i = 0; if( i != txget ) { txbuf[txput] = ch; txput = i; enable_USART0_TX_interrupt; return ch & 0xff; } else return EOF; } int U0_getcharw (void) { int i; while(EOF == (i=U0_getchar())) ; return i; } int U0_putcharw (int ch) { while(EOF == U0_putchar(ch)) ; return ch; } void U0_gets (char *s, int len ) //= 10) { char c; for( ; --len; ) { c = U0_getcharw(); U0_putcharw(c); if( (c == '\n') || (c == '\r')) break; else *s++ = c; } *s = 0; } void U0_puts (char *s) { while( *s ) U0_putcharw( *s++ ); }