Вообще говоря,
Рис. 11.1.
В моделях среднего уровня, имеющих 28 выводов и более, реализованы дополнительные порты ввода/вывода, как указано в Табл. 11.1. В то же время эти модели имеют более богатый набор встроенных периферийных устройств, использующих линии ввода/вывода, так что увеличение емкости параллельных портов ввода/вывода может оказаться не более чем иллюзией. К примеру, в модели PIC16F87X пять линий порта A (RA5, RA[3:0]) и 3-битный порт Е используются в качестве аналоговых входов 8-канального АЦП.
И все же, несмотря на возможность такого упрощенного представления (как на Рис. 11.1), поведение порты ввода/вывода несколько отличается от поведения остальных регистров микроконтроллера. Так, необходимо иметь возможность конфигурирования портов либо на считывание сигналов с соответствующих выводов микроконтроллера (вход), либо на выдачу сигналов на эти выводы (выход). Помимо этого, нам нужно определить, каким образом та или иная конфигурация порта будет влиять на результат операций изменения или чтения состояния порта.
Из Рис. 11.1 видно, что каждому регистру параллельного порта в 0-м банке соответствует регистр TRIS в 1-м банке. В Приложении Б можно увидеть, что это справедливо для любого порта. С каждым битом
В качестве примера рассмотрим ситуацию, при которой вывод RA0 и выводы RB[7:0] являются выходами, а остальные выводы порта А — входами. Следующий фрагмент кода, как правило, размещается в самом начале основной процедуры (см. Программу 11.1,
bsf STATUSfRP0; Переключаемся на 1-й банк
movlw b’1111110’; Вывод RA0 — выход
movwf TRISA; Остальные выводы — входы
clrf TRISB; Все выводы порта В — выходы
bcf STATUS,RP0; Возвращаемся в 0-й банк
Разумеется, на языке Си тоже можно написать код, выполняющий аналогичные действия. К примеру, в используемом нами компиляторе CCS этот код будет выглядеть следующим образом:
#bit BANK_SWITCH =3.5 /* Бит RP0 регистра STATUS */
#byte TRISA = 0x85 /* Регистр направления передачи данных TRISA */
#byte TRISB = 0x86 /* Регистр направления передачи данных TRISB */
main()
{
BANK_SWITCH =1; /* Переключаемся на 1-й банк */
TRISA = 0xFE; /* Вывод RA0 — выход, остальные выводы — входы */
TRISB =0; /* Все выводы порта В — выходы */
BANK_SWITCH =0; /* Возвращаемся в 0-й банк */
Однако в отдельных компиляторах могут иметься встроенные функции для поддержки операций инициализации и обращения к портам. Так, в компиляторе CCS для каждого порта X имеется своя функция set_tris_x () для установки соответствующего регистра TRIS