Full listing programm.
Определения:
SYS .EQU 000H ;Номер системы
CLK_KHZ = 12000 ;Тактовая частота 12 МГц
RC5_DF .EQU B.0 ;Флаг данных
RC5_PF .EQU B.1 ;Флаг периода
RC5_N =(1+2*(CLK_KHZ/188))/2
RC5_N1 =(1+2*(CLK_KHZ/249))/2
RC5_N2 =(1+2*(CLK_KHZ/382))/2
RC5_NT =(1+2*(CLK_KHZ/135))/2
Вектора:
ORG 0000H ;Вектор сброса
LJMP INIT
ORG 0003H ;Вектор прерывания INT0
LJMP RC5
Инициализация системы прерываний:
SETB PX0 ;Высокий приоритет INT0
STB IT0 ;Прерывание INT0 по переходу
SETB EX0 ;Разрешение INT0
SETB EA ;Общее разрешение прерываний
Основная программа:
LOOP: ;анализ кода в ячейке ОЗУ 1FH
SJMP LOOP
Подпрограмма обслуживания прерывания:
RC5: PUSH PSW ;Сохранение PSW
PUSH ACC ;Сохранение аккумулятора
PUSH B ;Сохранение регистра B
SETB RS0 ;Включение регистрового банка 3
SETB RS1
MOV R6,DPH ;Сохранение DPTR
MOV R5,DPL
MOV B,#2 ;Установка флагов
MOV R2,#2 ;Инициализация байта системы для принятия 7 бит
MOV R3,#4 ;Инициализация байта команды для принятия 6 бит
MOV R0,#R32 ;Загруска адреса регистра R2 в банке 3
MOV R1,#RC5_N ;Загрузка величины тайм-аута 2362 мкс
WLOW: JB SER,WHIGH ;Ожидание единицы на входе
MOV R4,#16
DJNZ R4,$
DJNZ R1,WLOW
SJMP NORC5 ;Ошибка, истек тайм-аут
WHIGH: MOV R1,#RC5_N ;Загрузка величины тайм-аута 2362 мкс
SAMPLE: MOV R4,#8 ;Точки входа в цикл SAM1 .. SAM3 предназначены
DJNZ R4,$ ;для выравнивания времени выполнения различных веток
SAM1: MOV R4,#3
DJNZ R4,$
MOV R4,#2
DJNZ R4,$
SAM3: MOV C,SER ;Опрос входа
MOV ACC.0,C
XRL A,B
JNB ACC.0,TRANS ;Ожидание изменения состояния
DJNZ R1,SAMPLE
SJMP NORC5 ;Ошибка, истек тайм-аут
TRANS: CPL RC5_DF ;Изменение состояния входа обнаружено
MOV A,R1
ADD A,#-RC5_N1
JC NORC5 ;Ошибка, время <577.5uS
MOV A,R1
ADD A,#-RC5_N2
JC TRANS1
JB RC5_PF,NORC5 ;Ошибка, время >1200uS
SJMP STDATA
TRANS1: CPL RC5_PF ;Инвертирование флага периода
MOV R1,#RC5_N ;Загрузка величины тайм-аута 2362 мкс
JB RC5_PF,SAM1 ;Прием бита не завершен, переход на опрос
STDATA: MOV C,RC5_DF
MOV A,@R0
RLC A ;Сохранение бита данных
MOV @R0,A
MOV R1,#RC5_N ;Загрузка величины тайм-аута 2362 мкс
JNC SAM2 ;Прием системы не завершен, переход на опрос
INC R0 ;Система принята, начало приема команды
MOV A,R0
MOV R1,#RC5_N ;Загрузка величины тайм-аута 2362 мкс
JNB ACC.2,SAM3 ;Прием команды не завершен, переход на опрос
MOV R1,#RC5_N ;Загрузка величины тайм-аута 2362 мкс
WLW: JB SER,TRM ;Последний бит, ожидание единицы на входе
MOV R4,#16
DJNZ R4,$
DJNZ R1,WLW
SJMP NORC5 ;Ошибка, истек тайм-аут
TRM: MOV R1,#RC5_NT ;Загрузка величины тайм-аута 3000 мкс
TERM: JNB SER,NORC5 ;Ошибка, если на входе обнаружен низкий уровень
MOV R4,#16
DJNZ R4,$
DJNZ R1,TERM
MOV A,R2 ;Номер системы и бит управления в R2
ANL A,#1FH ;Выделение номера системы
CJNE A,#SYS,NORC5 ;Проверка номера системы
MOV DPTR,#RCTAB ;Загрузка адреса таблицы
MOV A,R3 ;Загрузка кода команды
MOVC A,@A+DPTR ;Перекодировка
MOV R3,A ;Сохранение нового кода
MOV A,R2 ;Номер системы и бит управления в R2
ANL A,#20H ;Выделение бита управления
RL A
RL A ;Сдвиг бита управления в разряд D7
ORL A,R3 ;Совмещение кода команды и бита управления
MOV R3,A ;Сохранение результата
MOV A,R7
ANL A,#40H ;Выделение бита управления местной клавиатуры
ORL A,R3 ;Совмещение кода команды и битов управление
MOV R7,A ;Сохранение результата
NORC5: CLR IE0 ;Очистка флага прерывания
MOV DPL,R5 ;Восстановление DPTR
MOV DPH,R6
POP B ;Восстановление регистра B
POP ACC ;Восстановление аккумулятора
POP PSW ;Восстановление PSW
RETI ;Возврат из обработчика прерывания