include "p16f627a.inc"
__config _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _LVP_OFF
DATUM equ h’20’
; Инициализируем порты и задаем начальные состояния выводов —
MAIN clrf PORTB; Начальное состояние порта В — 0
bsf PORTA,0; Начальное состояние сигнала DAV — 1
bsf STATUS,RP0; Сначала переключаемся на 1-й банк
movlw b’11111110’; Вывод RA0 — выход
movwf TRISA; Остальные выводы — входы
clrf TRISB; Все выводы порта В — выходы
bcf STATUS,RP0; Возвращаемся в 0-й банк
; Ожидаем появления НИЗКОГО уровня на выводе RA1 —
RFD_YES btfsc PORTA,1; 1-й бит порта А равен 0?
goto RFD_YES; ЕСЛИ нет, ТО считываем снова
; Копируем запрошенные данные в порт В —
movf DATUM,w;Копируем в W
movwf PORTB; и вовне
; Теперь формируем отрицательный импульс DAY на выводе RA0 —
bcf PORTA,0; DAV (вывод RA0) — НИЗКИЙ уровень
nop; на короткое время,
bsf PORTA,0; а затем ВЫСОКИЙ уровень
; Теперь ждем появления ВЫСОКОГО уровня на линии RFD —
RFD_NO btfss PORTA,1;Пропускаем, если на RA1 ВЫСОКИЙ уровень
goto RFD_NO;ЕСЛИ нет, ТО считываем снова
goto RFD_YES;И так до бесконечности
end
#include <16f627a.h>
#byte PORTB =6 /* Порт В — регистр 0x06 */
#byte DATUM = 0x20 /* В регистре 0x20 хранится байт данных */
#bit DAV =5.0 /* Вывод RA0 — линия DAV */
Ibic RFD =5.1 /* Вывод RA1 — линия RFD */
void main(void)
{
DAV = 1; /* Неактивный уровень на линии DAV — 1 */
PORTB = 0; /* Начальное состояние порта В — 0 */
set_tris_a(0xFE); /* Вывод RAO (DAV) — выход */
set_tris_b(0); /* Все выводы порта В — выходы */
while(TRUE) /* БЕСКОНЕЧНЫЙ ЦИКЛ */
{
while(RFD) {;} /* Ждем, пока результат чтения RFD не станет FALSE */
/* (НИЗКИЙ уровень) */
PORTB = DATUM; /* Копируем байт данных в порт В */
DAV = 0; /* Выставляем на DAV (вывод RA0) НИЗКИЙ уровень */
delay_cycles(1); /* Немного подождем, */
DAV = 1; /* а затем снова выставляем ВЫСОКИЙ уровень */
while(!RFD) {;} /* Ждем, пока результат чтения RFD не станет TRUE */
/* (ВЫСОКИЙ уровень) */
}
}
После инициализации портов микроконтроллер ожидает появления НИЗКОГО уровня на выводе RA1 — этому состоянию соответствует 0 в 1-м бите регистра PORTA. Когда это происходит, содержимое регистра h’20’ копируется через рабочий регистр в регистр PORTB и на вывод RA0 выставляется НИЗКИЙ уровень. Перед повторным переводом RA0 в состояние ВЫСОКОГО уровня вставляется одна команда nop, формирующая задержку длительностью в один машинный цикл. Здесь мы не оговаривали длительность импульса DAV, но в реальном устройстве команда nop будет заменена вызовом подпрограммы формирования задержки.
В конце процедуры микроконтроллер снова проверяет состояние вывода RA1 (отслеживая значение 1-го бита регистра PORTA), ожидая появления на линии