Несмотря на то что этот код совершенно корректен и благодаря комментариям его назначение в общем-то понятно, он все же не очень удобен для чтения. Второй вариант того же куска кода имеет куда более дружественный вид, но с точки зрения ассемблера совершенно идентичен первому (см. стр. 70).
STATUS equ 03; Регистр STATUS расположен по адресу h’03’
RP0 equ 05; Бит переключения банков — 5-й
TRISB equ h’86’; Регистр направления расположен по адресу h’86’
PORTB equ 06; Регистр данных порта расположен по адресу h’06
bsf STATUS,RP0; Переходим к 1-му банку
movlw b’ 01111111’; Двоичному числу 0111 1111 соответствует:
movwf TRISB ; RB7 — выход, RB6…0 — входы
bcf STATUS,RP0; Возвращаемся к 0-му банку
Очевидно, что последний вариант более предпочтителен. Может показаться, что сделанные нами изменения носят исключительно косметический характер. Однако более ясный текст снижает вероятность возникновения ошибок, а также облегчает отладку и внесение последующих изменений в программу. В реальных программах, в отличие от приведенного фрагмента кода, используется множество разнообразных переменных и битов регистров, поэтому они должны быть ясными и понятными.
Четыре первые строки приведенного фрагмента показывают один из способов, посредством которого программист может сообщить транслятору с языка ассемблера о необходимости подстановки вместо символьного имени числового значения. В частности, строка
STATUS equ 03
говорит о том, что при использовании в качестве операнда имени STATUS оно должно заменяться числом 3 (т. е. регистр h’03’). Директива equ является сокращением от «EQUivalent to»[77].
В качестве примера напишем код, который формирует на выводе RB7 положительный импульс (предполагается, что ЦПУ работает с 0-м банком):
bsf PORTB,7; Выставляем на RB7 ВЫСОКИЙ уровень (устанавливаем 7-й бит)
bcf PORTB,7; Выставляем на RB7 НИЗКИЙ уровень (сбрасываем 7-й бит)
С параллельными портами ввода/вывода связаны следующие регистры:
∙ PORTA (h’05’)
В этом регистре задействовано только 5 младших битов, подключенных к выводам RA4…RA0 микроконтроллера. Вывод RA4 используется также модулем Таймера 0. Фантомные три старших бита читаются как 0. В некоторых моделях семейства, например в PIC16F628, могут быть реализованы все 8 линий порта А.
∙ TRISA (h’85’)
Этот регистр предназначен для конфигурирования линий порта А в качестве входов или выходов. Установка бита TRISA[
∙ PORTB (h’06’)
Двунаправленный 8-битный порт ввода/вывода, подключенный к выводам RB0…RB7 микроконтроллера. Вывод RB0 может использоваться также в качестве входа аппаратного прерывания.
∙ TRISB (h’86’)
Этот регистр используется для конфигурирования линий порта В в качестве входов или выходов. Более подробно — см. описание регистра TRISA.
EEPROM-память данных
В большинстве моделей среднего и старшего семейства имеется блок памяти объемом до 256 (в PIC16F84 — 64) байт, для хранения содержимого которого не требуется питания. Эта
Подробно процессы чтения и записи EEPROM будут рассмотрены в главе 15, здесь же мы просто приведем последовательность действий для выполнения операций чтения/записи.
Чтение
1. Поместить адрес (h’00….h,FF’) в EEADR.
2. Установить бит RD (0-й бит регистра EECON1) в 1 для переключения в режим чтения.
3. Считать адресованные данные из EEDATA.