main()
{
/* В начале идут описания разных переменных */
set_tris_a(0xFE); /* Вывод RA0 — выход, остальные выводы — входы */
set_tris_b(0); /* Все выводы порта В — выходы */
При любом
После того как задано направление передачи данных через выводы порта, программа может считывать данные из порта или записывать их в него, как в обычный регистр, и таким образом взаимодействовать с окружающим миром. А именно:
• Для отслеживания состояния любого вывода, сконфигурированного как вход, можно использовать команды btfsc и btfss. Так, команда btfss PORTA, 1 пропустит следующую команду, если на выводе RA1 присутствует ВЫСОКИЙ уровень (т. е. если 1-й бит регистра PORTA установлен в 1). Можно одновременно считать состояние нескольких битов, копируя содержимое всего регистра порта в рабочий регистр, например командой movf PORTA, w. При необходимости это значение можно будет затем переписать в какой-нибудь РОН для дальнейшей обработки.
• Для изменения состояния любого вывода, сконфигурированного как выход, можно использовать команды bcf или bsf. Так, команда bcf PORTA, 0 установит на выводе RA0 НИЗКИЙ уровень (т. е. 0-й бит регистра PORTA сбросится в 0). Можно одновременно изменять несколько битов, копируя содержимое рабочего регистра в регистр данных порта. К примеру, если все выводы порта В являются выходами, то для выдачи на выводы RB[7:6] ВЫСОКОГО уровня, а на выводы RB[5:0] — НИЗКОГО, можно воспользоваться следующими командами:
movlw b’11000000’
movwf PORTB
Наверняка у вас возник вопрос: а что произойдет, если будет считано состояние вывода, сконфигурированного как выход? Ответ на этот и некоторые другие вопросы вы узнаете чуть позже, когда мы приступим к изучению электрических характеристик портов ввода/вывода. А пока давайте рассмотрим использование портов на реальном примере.
Представим ситуацию, изображенную на Рис. 11.2, в которой внешнее периферийное устройство (скажем, принтер) собирается через порт В считывать по запросу содержимое регистра h’20’, подавая на вывод RA1 микроконтроллера напряжение НИЗКОГО уровня. Обозначим этот сигнал от периферийного устройства как
Рис. 11.2.
Такой принцип обмена с использованием семафоров называется обменом с
В Программе 11.1, а приведен пример реализации обмена с квитированием на языке ассемблера. Обратите внимание, что начальное состояние портов в программе задается перед их конфигурированием. Символические имена PORTA и PORTB определены во