TM P2,#00000010B;
JR NZ,K4;
TM F_KEYS,#00000010B;
JR NZ,K5;
OR F_KEYS,#00010010B;
JR K5;
K4: AND F_KEYS,#11101101B;
;
; Поддержка клавиш CLOCK+SET
K5:;
TCM F_KEYS,#00000011B;
JR NZ,K6;
TM F_KEYS,#00000100B;
JR NZ,K7;
OR F_KEYS,#00100100B;
JR K7;
K6: AND F_KEYS,#11011011B;
K7:;
; Отслеживание звонка
TM BFLAG,#00001000B; Проверить блокировку звонка
JR NZ,K12
TM P3,#00000100B
JR Z,K10
INC CNT_B
CP CNT_B,#60; 0.3 сек для звонка
JP ULT,K12
OR BFLAG,#10000000B
LD TIM_BL_H,#^hb(CONST_BELL)
LD TIM_BL_L,#^lb(CONST_BELL)
JR K12
K10:
CLR CNT_B
LD R4,TIM_BL_H
OR R4,TIM_BL_L
JR NZ,K11
AND BFLAG,#01111111B
K11: DECW TIM_BL_H
K12:
LD R4,COND; Сравнить предыдущее и настоящее состояния
LD COND,P2; линии
XOR R4,COND; Z - если состояния одинаковы
AND R4,#01000000B; NZ - если состояния разные
POP R4
RET
;+----------------------------------------------------------------------+
;¦ Определение номера звонящего абонента ¦
;+----------------------------------------------------------------------¦
;¦ Выход: флаг C = 0 - определение произведено ¦
;¦ C = 1 - сбой определения ¦
;¦ ¦
ID_NUM:
LD TET1,0FFH; Заполнение тетрады
LD TET2,0FFH; кодом неопределенности
LD TET3,0FFH
LD TET4,0FFH
CALL INIT_T1_500
LD IMR,#10100000B; Разрешение T1 и запрещение T0
LD R5,#4; Число запросов 3
AND BFLAG,#01111111B; Сброс звонка
LD TIM_BL_H,#0; Сбросить таймер звонка
LD TIM_BL_L,#0; Сбросить таймер звонка
AND P2,#11011111B; Занять линию
;---------------------------------------------------------------------------
; Запрос 500 Гц
REQ0:
CALL INIT_T1_44117
EI
LOOP1:
LD R9,#0; 6
LD R11,#BEG_COD
LOOP1_0:
LD R12,#^hb(BIT_MAP); 6
LD R13,#^lb(BIT_MAP); 6
ADD R13,R9; 6
ADC R12,#0; 10
LDC R10,@RR12; 12
LD @R11,R10
INC R11
INC R9; 6
CP R9,#11; 10
JP ULT,LOOP1_0; 12/10 MAX = 131
LD R10,#100
LOOP4:
LD R11,#BEG_COD; 6
LOOP4_0:
LD R8,#8; 6
LOOP3:
LD R12,@R11; 10
AND R12,#11011111B
LD R2,R12
RL @R11; 10
NOP; 6
HALT; 7
LOOP2: DJNZ R8,LOOP3; 12/10
INC R11; 6
CP R11,#BEG_COD+11; 10
JP ULT,LOOP4_0; 12/10 MAX = 131
; JP LOOP4
DJNZ R10,LOOP4; 12
;----------------------------------------------------------------------------
TM P2,#00000100B; Снять захват линии если активен свой телефон
JR Z,ID_NUM0;
OR P2,#00100000B;
ID_NUM0:
LD R4,#20
ID_NUM1:
PUSH R4; Ожидать ответа 0.2 сек
PUSH R5
CALL AON_processor
POP R5
CP R8,#30
JP NC,ID_NUM2
DJNZ R4,ID_NUM1
DJNZ R5,REQ0
ID_NUM2:
LD CNT_REP,#0; Обнулить счетчик повторов
LD PRE_N,#0FFH; Предыдущая цифра не определена
LD R4,#25; Количество принимаемых кодов
LD R5,#BEG_COD; Адрес буфера принимаемых цифр
LD TET1,R9; Запись в тетраду первого кода
ID_NUM3:
PUSH R4
; Вписать цифру в тетраду
LD RP,#10H; Сменить банк регистров
LD TET4_,TET3_; Сместить цыфры в тетраде
LD TET3_,TET2_;
LD TET2_,TET1_;
LD TET1_,9; Записать текущую цифру
; Обработка тетрады
LD 9,TET1_
CP 9,TET2_
JP Z,ID_NUM4
LD 9,TET2_
CP 9,TET3_
LD 9,TET3_
CP 9,TET4_
LD 9,#0FFH
ID_NUM4:
LD RP,#00
CP PRE_N,R9; Цифра равна предыдущей ?
JP Z,ID_NUM6
CP CNT_REP,#00; Записывать цифру только после второго
JP Z,ID_NUM6; повтора
ID_NUM5:
LD @R5,R9
LD PRE_N,R9; Сохранить текущую цифру
INC R5
LD CNT_REP,#00; Обнулить счетчик повторов
DJNZ R4,ID_NUM3; Продолжать ввод пока не будет записано
JR ID_NUM8_; 25 цифр
ID_NUM6:
INC CNT_REP;
; CP R9,#0FFH; Не повторять запись цифр отличных от 0FFH
; JR NZ,ID_NUM3;
CP CNT_REP,#7;
JP UGT,ID_NUM5;
JR ID_NUM3
; Сборка номера
ID_NUM8_:
LDR4,#BEG_COD
LD R5,#6; Поиск двух кодов 0AH в области принятых
ID_NUM9:; кодов
CP @R4,#0AH; Адрес первого хранится в рег. R6
JR NZ,ID_NUM7; второго в рег. R7
LD @R5,R4;
INC R5;
CP R5,#8;
JR UGE,ID_NUM8;
ID_NUM7:;
INC R4;
CP R4,#BEG_COD+25
JR ULT,ID_NUM9
ID_NUM8:
CP R5,#8
JR Z,ID_NUM10
CP R5,#7
JR Z,ID_NUM11
; Заполнение буфера кодом неопределенности если не найдено ни одного
; кода 0AH
LDR4,#BUF_NUM
LDR5,#8
ID_NUM12:
LD @R4,#0FH
INC R4
DJNZ R5,ID_NUM12
JP ID_NUM_ERR
ID_NUM10:
LDR8,R6
LD R9,R7
JR ID_NUM13
ID_NUM11:
LD R8,R6
LD R9,R8
; ADD R9,#9
ID_NUM13:
LDR4,#8
LD R10,#BUF_NUM
DEC R8
DEC R9
ID_NUM20:
CP R8,#BEG_COD
JR ULT,ID_NUM14
CP R8,#BEG_COD+24
JR UGE,ID_NUM14
LDR6,@R8
JR ID_NUM15
ID_NUM14:
LD R6,#0FFH
ID_NUM15:
CP R9,#BEG_COD
JR ULT,ID_NUM16
CP R9,#BEG_COD+24
JR UGE,ID_NUM16
LDR7,@R9
JR ID_NUM17
ID_NUM16:
LD R7,#0FFH
ID_NUM17:
CP R7,#0FFH
JR Z,ID_NUM18
LD @R10,R7
JR ID_NUM19
ID_NUM18:
LD @R10,R6
ID_NUM19:
INC R10
DJNZ R4,ID_NUM20
; Удаление повторов и нулей
LD R4,#BUF_NUM
LD R5,@R4
LD R6,#8
ID_NUM22:
CP @R4,#0BH
JR NZ,ID_NUM21
LD @R4,R5
ID_NUM21:
CP @R4,#0
JR NZ,ID_NUM23
LD @R4,#10
ID_NUM23:
LDR5,@R4
DJNZ R6,ID_NUM22
; Циклический сдвиг на одну позицию вправо
LD R4,#BUF_NUM+7
LD R5,#BUF_NUM+6
LD R8,@R4
LD R7,#7
ID_NUM24:
LD R6,@R5
LD @R4,R6
DEC R4
DEC R5
DJNZ R7,ID_NUM24
LD @R4,R8
RCF
ID_NUM_ERR:
OR BFLAG,#00000100B; Флаг неопределения
;+-------------------------------------------------+
;¦ Подпрограмма инициализации T1 на 500 ¦
INIT_T1_500:
LD PRE1,#11110011B; Коэффицент деления 60
LD TMR,#00001110B; Разрешение обоих таймеров T1 с загрузкой
LD T1,#50; Переполнение таймера каждые 2 мс
;¦ Подпрограмма инициализации T1 на 44117 Гц ¦
INIT_T1_44117:
LD PRE1,#01000111B; Коэффицент деления 17
LD T1,#2; Переполнение таймера каждую
;¦ Подпрограмма вывода байта на ЖКИ 'Panasoanic' ¦
;¦ Ввод: R6 - выводимый байт ¦
;¦ Изменяются R4,R5 ¦
SEND_BYTE:
SWAP R6
LD R5,#4
SB1: RL R6
JP C,SB2; Передача 1
AND P0,#11111011B; Передача 0
JR SB3
SB2: OR P0,#00000100B
SB3:
LD R4,#15
DJNZ R4,$
AND P0,#11111101B; Передача строба
OR P0,#00000010B
OR P0,#00000100B; Снятие сигнала
DJNZ R5,SB1
;+-------------------------------------------------------------------------+
;¦ Подпрограмма ввода информации АОН ¦
Fr1_1 = 20H
Fr1_2 = 21H
Fr2_1 = 22H
Fr2_2 = 23H
Fr3_1 = 24H
Fr3_2 = 25H
Fr4_1 = 26H
Fr4_2 = 27H
Fr5_1 = 28H
Fr5_2 = 29H
Fr6_1 = 2AH
Fr6_2 = 2BH
AON_processor:
LD PRE1,#00010111B; Коэфф. дел. =5
LD TMR,#00001110B
LD T1,#15; Коэфф. дел. =15
; При частоте 12 МГц период счетчика 50 мкс
LD IMR,#10100000B; Разрешение T1 запрещение T0
; Производится 200 отсчетов
; На каждую эпюру отводится в таблице 25 байт
LD R4,#Fr1_1
LD R6,#0
LD R7,#6
LD R8,#8
LD R14,#^hb(TABLE); @RR14 - Адрес таблицы эпюр
LD R15,#^lb(TABLE);
LD R12,#^hb(NUM_TABLE); @RR12 - Адрес таблицы сумм
; Формирование первого байта отсчетов
AONp2: NOP
HALT;7 Ожидание времени отсчета
SCF;6
TM P3,#00000010B;10
JR NZ,AONp0;10
CCF;6
AONp0: RLC R6;6 Формирование байта отсчетов
CP R7,#0;10
JR Z,AONp1;10
LD @R4,#0;10
INC R4;6
DEC R7;6
AONp1:
DJNZ R8,AONp2;12 -> 103 T. 17.17 мкс
; Прием и обработка следующих байтов отсчетов
LD R11,#25;10
AONp5:
LD R4,#Fr1_1;10 Адрес буфера идентификаторов
LD R7,#6;10 Счетчик принимаемых бит
LD R8,#8;10 Счетчик циклов ввода
LD R9,R6;6 Сохранить предыдущий байт отсчетов
LD R6,#0;10 Байт отсчетов
AONp4: NOP
HALT;7
JR NZ,AONp6;10
ONp6: RLC R6;6 Формирование байта отсчетов
CP R7,#00;10
JR Z,AONp3;10
LDC R13,@RR14;12
XOR R13,R9;6
LDC R10,@RR12;12
ADD R10,@R4;6
LD @R4,R10;10
INCW RR14;10
AONp3:
DJNZ R8,AONp4;12 ->207 Продолжение цикла ввода байта
; отсчетов
DJNZ R11,AONp5;12 ->275 Продолжение ввода байтов отсчетов
; Приведение массива идентификаторов к нормальной форме
LD R13,#01
LD R14,#00
LD R15,#00
LD R6,#6;10 Счетчик нормальных идентификаторов
LD R7,#00
AONp11:
SUB @R4,#101
JR NC,AONp7
COM @R4
AONp7: LD R5,@R4
JR NC,AONp8
AONp8: ADD R5,@R4; Получение нормального идентификатора
; Определение пары максимальных идентификаторов
CP R8,R5
JR NC,AONp9
LD R7,R8
LD R8,R5
LD R14,R15
LD R15,R13
JR AONp10
AONp9: CP R7,R5
JR NC,AONp10
LD R7,R5
LD R14,R13
AONp10: RL R13
DJNZ R6,AONp11
; Вычисление цифры
OR R14,R15
LD R9,#12
AONp13:
LD R12,#^hb(TABLE_NUM_AON-1)
LD R13,#^lb(TABLE_NUM_AON-1)
ADD R13,R9
ADC R12,#0
LDC R10,@RR12
CP R14,R10
JR Z,AONp12
DJNZ R9,AONp13
AONp12: DEC R9
DI
;Выход *****************************
; R8 - величина первого идентификатора
; R7 - величина второго идентификатора
; R9 - принятая цифра {0..Bh}, если R9=FFh то цифра не определена
;***********************************
; Последовательность цифр в посылке:
; 1. Категория абонента
; 2. Единицы номера
; 3. Десятки номера
; 4. Сотни номера
; 5. Тысячи номера
; 6. 3-я цифра индекса станции
; 7. 2-я цифра индекса станции
; 8. 1-я цифра индекса станции
; 9. Начало/конец передачи
; 10. Категория абонента
;----------------------------
; Подпрограмма ввода выборки
Sample:
IRET
INT_T0:
TABLE_NUM_AON:;усл.номер цифра
.BYTE 18H; 0
.BYTE 03H; 1
.BYTE 05H; 2
.BYTE 06H; 3
.BYTE 09H; 4
.BYTE 0AH; 5
.BYTE 0CH; 6
.BYTE 11H; 7
.BYTE 12H; 8
.BYTE 14H; 9
.BYTE 24H; 0AH - код начала/конца
.BYTE 28H; 0BH - код повтора
BIT_MAP:
.BYTE 11111111B
.BYTE 01111111B
.BYTE 01111101B
.BYTE 00101010B
.BYTE 00001000B
.BYTE 00000000B
.BYTE 00000010B
.BYTE 01110100B
.BYTE 11110110B
.BYTE 11111110B
.ORG 05D4H
; Таблица АОН
TABLE:
.BYTE 0FFH,0FFH,0FFH,0FCH,0FFH,0F8H,0FFH,0F0H,0FEH,0F0H,0FCH,0E0H
.BYTE 0FEH,000H,0F0H,000H,0C0H,003H,000H,00FH,003H,01FH,00FH,07EH
.BYTE 000H,003H,001H,07FH,01FH,0FEH,0FFH,0F0H,0F8H,080H,0C0H,007H
.BYTE 007H,0FFH,0FFH,0F0H,0F0H,000H,001H,01FH,01FH,0FEH,0FCH,0E0H
.BYTE 0FFH,0F0H,0C0H,001H,007H,0FFH,0FEH,0E0H,0C0H,007H,00FH,07EH
.BYTE 0E0H,000H,007H,0FFH,0FCH,080H,001H,01FH,07EH,0F0H,0C0H,007H
.BYTE 000H,01FH,0FFH,0E0H,001H,01FH,0FCH,0E0H,003H,01FH,0F8H,0E0H
.BYTE 03FH,0FFH,000H,003H,0FFH,0F0H,003H,03FH,0F8H,080H,01FH,0FCH
.BYTE 0FFH,080H,01FH,0FFH,000H,007H,0FCH,0C0H,01FH,0FEH,081H,00FH
.BYTE 000H,001H,0FCH,080H,07FH,0FCH,007H,03FH,0C0H,007H,0F8H,0C0H
.BYTE 003H,0FFH,000H,00FH,0C0H,001H,0F8H,080H,07EH,0F0H,01FH,0FCH
.BYTE 0FFH,0F8H,07FH,0FEH,01FH,0FFH,007H,07FH,003H,01FH,081H,00FH
.BYTE 0F8H,000H,0F8H,000H,0F8H,000H,0F8H,080H,0F8H,080H,0F8H,0C1H
.BYTE 000H,00FH,000H,03FH,003H,07FH,00FH,0FFH,01FH,0FEH,03FH,0F8H
.BYTE 01FH,0FFH,0FFH,0F8H,0FEH,0C0H,0F0H,000H,0C0H,007H,003H,01FH
.BYTE 0FFH,0C0H,0E0H,000H,000H,01FH,00FH,0FEH,07EH,0F0H,0F0H,081H
.BYTE 080H,000H,003H,0FFH,0FFH,0F0H,0E0H,001H,003H,01FH,03FH,0F8H
.BYTE 001H,0FFH,0FFH,0E0H,080H,007H,01FH,0FEH,0F8H,080H,003H,01FH
.BYTE 0FFH,0FEH,080H,001H,03FH,0FEH,0E0H,001H,01FH,0FEH,0F0H,081H
.BYTE 0FCH,000H,00FH,0FFH,0E0H,000H,03FH,0FCH,0C0H,007H,03EH,0F0H
.BYTE 000H,007H,0FEH,0C0H,00FH,0FFH,0C0H,003H,07EH,0F0H,007H,03FH
.BYTE 00FH,0FFH,000H,007H,0F8H,080H,03FH,0FCH,003H,01FH,0E0H,003H
.BYTE 0FFH,0E0H,03FH,0FFH,003H,03FH,0C0H,007H,0F8H,080H,07EH,0F0H
.BYTE 0C0H,000H,0F8H,000H,0FFH,0E0H,07FH,0F8H,01FH,0FEH,007H,03FH
.BYTE 000H,07FH,000H,01FH,000H,00FH,080H,007H,0C0H,007H,0E0H,003H
.ORG 700H
; ТАБЛИЦА СООТВЕТСТВИЯ БАЙТА И КОЛИЧЕСТВА
; ЕДИНИЦ В НЕМ
NUM_TABLE:
.BYTE 00H,01H,01H,02H,01H,02H,02H,03H,01H,02H,02H,03H,02H,03H,03H,04H
.BYTE 01H,02H,02H,03H,02H,03H,03H,04H,02H,03H,03H,04H,03H,04H,04H,05H
.BYTE 02H,03H,03H,04H,03H,04H,04H,05H,03H,04H,04H,05H,04H,05H,05H,06H
.BYTE 03H,04H,04H,05H,04H,05H,05H,06H,04H,05H,05H,06H,05H,06H,06H,07H
.BYTE 04H,05H,05H,06H,05H,06H,06H,07H,05H,06H,06H,07H,06H,07H,07H,08H
.END
Приложение Б
Схема принципиальная электрическая АОН
Страницы: 1, 2, 3, 4