#include #include "driver_io.h" #include "interrupt.h" #include #include #include FIFO rfifo = { { 0, 0 } }; // буфер чтения FIFO wfifo = { { 0, 0 } }; // буфер записи void set_vector(unsigned char xdata * Address, void * Vector) { *Address = 0x02; *(Address + 1) = (unsigned char) ((unsigned short) Vector >> 8); *(Address + 2) = (unsigned char) ((unsigned char) Vector); } char read_uart() { // читаем операнды из RFIFO if (rfifo.w_pointer == 0) { return 0; } rfifo.w_pointer--; return rfifo.buffer[rfifo.w_pointer]; } void write_uart(char * buf_char) { int size; size = strlen(buf_char); if (size < BUF_SIZE) { while (*buf_char) { wfifo.buffer[wfifo.w_pointer++] = *buf_char++; } } else { memcpy(wfifo.buffer, buf_char, BUF_SIZE); wfifo.w_pointer = BUF_SIZE - 1; } wfifo.buffer[wfifo.w_pointer++] = '\n'; TI = 1; } /**********************************************************************/ void handler_uart( void ) __interrupt ( 4 ) { write_char('D'); if (TI) { // Передача байта // Читаем WFIFO (буфер передачи) и записываем его в SBUF TI = 0; if (wfifo.w_pointer > 0) { SBUF = wfifo.buffer[wfifo.r_pointer++]; wfifo.w_pointer--; } else { wfifo.r_pointer = 0; } } if (RI) { // Прием байта // Читаем SBUF и записываем его в RFIFO (буфер приема) RI = 0; rfifo.buffer[rfifo.w_pointer++] = SBUF; } }