include "p16f877а. inc"
#define BAUD d’4800’; Скорость обмена 4800 бод
#define XTAL d’8’; 8-МГц резонатор
#define X ((XTAL*d’1000000’)/(d’64’*BAUD))-1
START bsf STATUS,RP0; Переключаемся в 1-й банк
movlw X; Загружаем X в контроллер скорости обмена
movwf SPBRG
movlw b’00100000’; 8 битов данных, передатчик включен,
movwf TXSTA; низкоскоростной режим
bcf STATUS,RP0; Возвращаемся обратно в 0-й банк
movlw b’10010000’; USART включен, 8-битные данные
movwf RCSTA; Приемник включен
Заметьте, что для корректной работы модуля USART в микроконтроллерах линейки PIC16F87X требуется, чтобы оба вывода RX и ТХ были сконфигурированы как входы. Поскольку после сброса микроконтроллера выводы находятся в этом состоянии по умолчанию, в приведенном фрагменте отсутствуют команды для конфигурирования регистра TRISC. Как было отмечено в примечании на стр. 426, другие члены семейства могут потребовать других настроек для выводов RX и ТХ.
Код самих подпрограмм приведен в Программе 12.15. Подпрограмма PUTCHAR просто опрашивает флаг TXIF, ожидая его установки, а затем копирует байт данных в регистр передачи TXREG.
Подпрограмма приема символа GETCHAR будет немного сложнее из-за наличия контроля ошибок. Подпрограмма постоянно опрашивает состояние флага RCIF, который устанавливается при наличии доступных для чтения данных. При отсутствии каких-либо проблем в переменной ERR возвращается число h’00’, при возникновении ошибки кадрирования возвращается -1, при переполнении —2, а при одновременном обнаружении обеих ошибок —3. В последних двух случаях осуществляется сброс бита OERR посредством сброса логики приемника. После проверки на наличие ошибок данные считываются из буфера приемника RCXREG. Контроль ошибок всегда выполняется перед считыванием данных, чтобы избежать непреднамеренного изменения этих флагов регистра состояния приемника.