.TITLE Программа АОН "Panaphone" .Z8REGDEFS ; Назначение символических имен ;---------------------------------------------------------- TIM_BL_H = 10H ; Таймер звонка TIM_BL_L = 11H ; Таймер звонка N_RECORD = 12H ; Номер записи в списке BLC_CLOCK = 13H ; Счетчик блокировки по нажатию клавиши CLOCK CNT_SET = 14H ; Счетчик нажатия SET CNT_CLOCK = 15H ; Счетчик нажатия CLOCK CNT_TWIX = 16H ; Счетчик нажатия обоих клавиш F_KEYS = 17H ; XXXXXXXX Флаги клавиш ; ¦¦¦¦¦¦¦¦ ; ¦¦¦¦¦¦¦+------ F_SET ; ¦¦¦¦¦¦+------- F_CLOCK ; ¦¦¦¦¦+-------- F_TWIX ; ¦¦¦¦+--------- KEY_SET ; ¦¦¦+---------- KEY_CLOCK ; ¦¦+----------- KEY_TWIX ; ¦+------------ ; +------------- ; CONST_KEY = 10 ; Константа минимального количества тактов между нажатиями CONST_BELL = 1000 ; Константа звонка TET1 = 18H ; 1-я ячейка тетрады TET2 = 19H ; 2-я ячейка тетрады TET3 = 1AH ; 3-я ячейка тетрады TET4 = 1BH ; 4-я ячейка тетрады ;---------------------------------- TET1_ = R8 ; 1-я ячейка тетрады TET2_ = R9 ; 2-я ячейка тетрады TET3_ = R10 ; 3-я ячейка тетрады TET4_ = R11 ; 4-я ячейка тетрады ;---------------------------------- CNT_ONL = 18H ; Счетчик низкой линии PRE_N = 1CH ; Предыдущая цифра CNT_REP = 1DH ; Счетчик повторов цифры COND = 1EH ; Состояние линии MASK1 = 1FH ; Маска первой цифры номера BUF_NUM = 20H ; Начало буфера номера BEG_ST = 40H ; Начало стека BEG_COD = 40H ; Начало области записи принятого кода BEG_LST = 59H ; Начало списка END_LST = 7CH ; Конец списка BFLAG = 7FH ; XXXXXXXX ; ¦¦¦¦¦¦¦¦ ; ¦¦¦¦¦¦¦+------ ; ¦¦¦¦¦¦+------- ; ¦¦¦¦¦+-------- Флаг неопределившегося номера ; ¦¦¦¦+--------- флаг блокировки звонка ; ¦¦¦+---------- флаг индикации категории ; ¦¦+----------- Флаг активности своего телефона ; ¦+------------ Флаг 1-й цифры ; +------------- Флаг звонка TESTB = 7EH ; Тест-байт целостности информации CNT_B = 7DH ; Счетчик длительности сигнала звонка ;+------------------------------------------------------------------+ ;¦ Начало программного блока ¦ ;+------------------------------------------------------------------+ .CODE .GLOBAL .ABS .ORG 0 ; Область хранения векторов прерываний .WORD INT_P3_2L ;P3.2 F-edge .WORD INT_P3_3L ;P3.3 F-edge .WORD INT_P3_1L ;P3.1 F-edge .WORD INT_P3_2H ;P3.2 R-edge .WORD INT_T0 ;T0 .WORD Sample ;T1 ; После сброса : Счетчики запрещены ; Прерывания запрещены ; Приоритеты не определены ; Указатель стека не определён ; Регистровый указатель = 0 ; Порт 2 открытый сток ,все входы ; Порт 3 цифровой ; Порт 0 вход INT_P3_2L: INT_P3_3L: INT_P3_1L: INT_P3_2H: START: ; LD RP,#0FH ; Активизация управления по P2.7 ; LD 0BH,#00010100B ; для эмулятора LD RP,#00 LD P01M,#00000100B ; Порт P0 - выход LD P3M,#00000011B ; P2 - Pull-Ups Activ ; P3 - Analog LD P2, #11111111B ; Вывод в порт 2 ; ¦¦¦¦¦¦¦¦ ; ¦¦¦¦¦¦¦+------ Вход клавиши SET ; ¦¦¦¦¦¦+------- Вход клавиши CLOCK ; ¦¦¦¦¦+-------- - ; ¦¦¦¦+--------- - ; ¦¦¦+---------- Датчик активности телефона ; ¦¦+----------- Управление ключом ; ¦+------------ Датчик линии ; +------------- Вход прерываний ; LD P2M,#11001111B ; Определение направления выводов порта P2 LD P0,#00000111B ; LD PRE0,#11001001B ; Коэффицент деления 50 LD TMR,#00001011B ; Разрешение обоих таймеров T0 с загрузкой LD T0,#150 ; Переполнение таймера каждые 5 мс LD IMR,#10010000B ; Разрешение T0 и запрещение T1 BEGIN: LD SPL,#BEG_ST EI CP TESTB,#55H ; Проверка целостности информации JR Z,NOT_CLEAR_RAM ; LD R4,#5 CLEAR_RAM: ; Очистка ОЗУ контроллера LD @R4,#0 INC R4 CP R4,#127 JR C,CLEAR_RAM LD TESTB,#55H LD MASK1,#2 ; Выставить маску первой цифры номера LD CNT_B,#0 NOT_CLEAR_RAM: AND BFLAG,#00000111B ; Сброс флага звонка ,определения ; пульсового набора,набранной цыфры и ; очистки буфера CALL GO_HALT ; ;------------------------------------------------------------------------ ; Основной блок ;------------------------------------------------------------------------ MAIN: TCM P2,#00000011B JP NZ,M1 M2_2: TM P2,#01000000B JR Z,M2 TM P3,#00000100B JR NZ,M2 LD P2M,#11001111B NOP STOP M2: LD R4,#10 LD CNT_ONL,#0 M2_0: CALL GO_HALT INC CNT_ONL ; Счетчик низкой линии TM P2,#01000000B JR Z,M2_1 LD CNT_ONL,#0 M2_1: DJNZ R4,M2_0 CP CNT_ONL,#8 JR UGE,M3 ; Переход если трубку сняли TM BFLAG,#10000000B JR NZ,M2 JR M2_2 M3: AND BFLAG,#10110011B TM BFLAG,#10000000B JR Z,M4 AND P0,#11111110B ; Захват LCD PUSH IMR CALL ID_NUM OR P2,#00100000B POP IMR LD R7,#BUF_NUM ; Вывод номера на LCD LD R6,#0 LD R8,#8 CALL SEND_BYTE CALL SEND_BYTE M3_1: LD R6,@R7 CALL SEND_BYTE INC R7 DJNZ R8,M3_1 TM BFLAG,#00000100B ; Не сохранять номер если он не определился JR NZ,M4 LD R7,#END_LST ; Сдвиг списка на одну запись LD R8,#END_LST-4 M3_2: LD R4,@R8 LD @R7,R4 DEC R7 DEC R8 CP R8,#BEG_LST JR UGE,M3_2 LD R7,#BEG_LST ; Упаковка номера в список LD R8,#BUF_NUM LD R9,#4 M3_3: LD R4,@R8 SWAP R4 AND R4,#0F0H INC R8 AND @R8,#0FH OR R4,@R8 LD @R7,R4 INC R8 INC R7 DJNZ R9,M3_3 OR P0,#00000001B ; Снять захват LCD M4: AND BFLAG,#00110011B LD BLC_CLOCK,#0 TM P2,#00000100B JR NZ,M4_1 AND P0,#11111110B ; Захват LCD M4_1: CALL GO_HALT TM P2,#01000000B ; Проверка тока в линии JR Z,M5 ; Переход если нет импульса в линии LD R9,#0 ; Счетчик цыфры MN4_1: LD R4,#20 ; Счетчик импульса MN4_2: CALL GO_HALT TM P2,#01000000B ; Проверка тока в линии JR Z,MN4_3 ; Переход если прервался импульс DJNZ R4,MN4_2 ; Выход если импульс слишком длинный OR P0,#00000001B ; Снять захват LCD LD P2M,#11001111B NOP STOP MN4_3: LD R4,#12 ; Счетчик паузы INC R9 MN4_4: CALL GO_HALT TM P2,#01000000B ; Проверка тока в линии JR NZ,MN4_1 ; Переход если прервалась пауза DJNZ R4,MN4_4 TM P2,#00000100B JR NZ,M5 MN4_6: TM BFLAG,#01000000B ; Проверить флаг первой цифры JR NZ,MN4_7 LD R6,#00 LD R8,#10 MN4_8: CALL SEND_BYTE DJNZ R8,MN4_8 OR BFLAG,#01000000B ; Выставить флаг первой цифры MN4_7: LD R6,R9 CALL SEND_BYTE M5: TM F_KEYS,#00001000B ; Проверка клавиши SET JR Z,M4_1 AND F_KEYS,#11110111B ; CALL LIST JR M4 M1: TM F_KEYS,#00010000B ; Проверка клавиши CLOCK JR Z,M1_1 AND F_KEYS,#11101111B ; Сброс флага клавиши CLOCK CP BLC_CLOCK,#00 ; Пуст ли счетчик нажатий клавиши CLOCK JR NZ,M1_0 LD BLC_CLOCK,#2 JR M1_1 M1_0: DEC BLC_CLOCK M1_1: TM F_KEYS,#00001000B ; Проверка клавиши SET JP Z,MAIN ; ; Режим просмотра списка ; AND F_KEYS,#11110111B CALL LIST JP MAIN ;+----------------------------------------------------------------------+ ;¦ Режим просмотра списка ¦ ;+----------------------------------------------------------------------+ LIST: AND F_KEYS,#11110111B CP BLC_CLOCK,#00 JP Z,LIST1 RET LIST1: AND P0,#11111110B ; Захват LCD LD R4,#10 LIST2: CALL GO_HALT DJNZ R4,LIST2 LIST3: LD N_RECORD,#1 LIST4: LD R6,N_RECORD CALL SEND_BYTE ; Вывод на LCD номера записи LD R6,#0FH ; '-' CALL SEND_BYTE LD R7,N_RECORD ; Вычисление адреса записи DEC R7 RL R7 ; Умножить на 4 (длину записи) RL R7 ADD R7,#BEG_LST ; Получить адрес начала записи LD R8,#2 ; ; Вывод номера ; LIST5: LD R6,@R7 ; Вывод 8-и байтов номера SWAP R6 AND R6,#0FH ; TM BFLAG,#00010000B ; Проверить флаг индикации категории JP NZ,LIST6 LD R6,#0 ; Не показывать категорию если не выставлен LIST6: ; флаг CALL SEND_BYTE LD R6,@R7 ; Вывод первой цифры номера AND R6,#0FH CP R6,MASK1 JP NZ,LIST7 LD R6,#0 LIST7: CALL SEND_BYTE INC R7 ; Вывод второй цифры номера LD R6,@R7 SWAP R6 CALL SEND_BYTE SWAP R6 ; Вывод третьей цифры номера CALL SEND_BYTE LIST8: INC R7 ; Вывод остальных цифр номера LD R6,@R7 SWAP R6 CALL SEND_BYTE SWAP R6 CALL SEND_BYTE DJNZ R8,LIST8 LIST9: TM F_KEYS,#00100000B ; Проверка одновременного нажатия CLOCK,SET JR Z,LIST10 AND F_KEYS,#11000111B ; JR LIST12 LIST10: TM F_KEYS,#00010000B ; Проверка клавиши CLOCK JR Z,LIST11 AND F_KEYS,#11101111B ; INC N_RECORD CP N_RECORD,#9 JR UGT,LIST3 JR LIST4 LIST11: TM F_KEYS,#00001000B ; Проверка клавиши SET JP Z,LIST23 AND F_KEYS,#11110111B ; OR P0,#00000001B CALL GO_HALT CALL SEND_BYTE RET ; ; Режим установок ; LIST12: ; Установка флага показа категории LD R6,#0CH CALL SEND_BYTE TM BFLAG,#00010000B ; Проверить флаг индикации категории LD R6,#0AH JP Z,LIST13 ; Показать флаг индикации категории LD R6,#01H LIST13: CALL SEND_BYTE LD R6,#0DH CALL SEND_BYTE LD R6,#0 CALL SEND_BYTE CALL SEND_BYTE LD R6,MASK1 CALL SEND_BYTE LD R6,#0 CALL SEND_BYTE CALL SEND_BYTE CALL SEND_BYTE CALL SEND_BYTE LIST14: TM F_KEYS,#00001000B ; Проверка клавиши SET JR Z,LIST15 AND F_KEYS,#11110111B ; JP LIST17 LIST15: TM F_KEYS,#00010000B ; Проверка клавиши CLOCK JR Z,LIST16 AND F_KEYS,#11101111B ; XOR BFLAG,#00010000B ; JP LIST12 LIST16: CALL GO_HALT JP NZ,BEGIN JR LIST14 LIST17: ; Установка маски первой цифры LD R6,#00H CALL SEND_BYTE TM BFLAG,#00010000B ; Проверить флаг индикации категории LD R6,#0AH JP Z,LIST18 ; Показать флаг индикации категории LD R6,#01H LIST18: CALL SEND_BYTE LD R6,#00H CALL SEND_BYTE CALL SEND_BYTE LD R6,#0CH CALL SEND_BYTE LD R6,MASK1 CALL SEND_BYTE LD R6,#0DH CALL SEND_BYTE LD R6,#00H CALL SEND_BYTE CALL SEND_BYTE CALL SEND_BYTE LIST19: TM F_KEYS,#00001000B ; Проверка клавиши SET JR Z,LIST20 AND F_KEYS,#11110111B ; JP LIST4 LIST20: TM F_KEYS,#00010000B ; Проверка клавиши CLOCK JR Z,LIST22 AND F_KEYS,#11101111B ; INC MASK1 CP MASK1,#0AH JR ULE,LIST21 LD MASK1,#00 LIST21: JP LIST17 LIST22: CALL GO_HALT JP NZ,BEGIN JR LIST19 ; ; ; LIST23: CALL GO_HALT JP NZ,BEGIN JP LIST9 ; ;---------------------------------------------------------------------- ; END LIST ;+--------------------------------------------+ ;¦ Подпрограмма HALT режима ¦ ;+--------------------------------------------+ GO_HALT: PUSH R4 NOP HALT EXIT_STOP: ; ; Поддержка клавиши SET ; TM P2,#00000001B ; JR NZ,K1 ; TM F_KEYS,#00000001B ; JR NZ,K3 ; OR F_KEYS,#00001001B ; JR K3 ; K1: AND F_KEYS,#11110110B ; ; ; Поддержка клавиши CLOCK ; K3: ; 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 JR K12 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 LD IMR,#10100000B ; Разрешение T1 и запрещение T0 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 POP R4 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 PUSH R5 CALL AON_processor POP R5 POP 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_ JP Z,ID_NUM4 LD 9,TET3_ CP 9,TET4_ JP Z,ID_NUM4 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_: LD R4,#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 ; LD R4,#BUF_NUM LD R5,#8 ID_NUM12: LD @R4,#0FH INC R4 DJNZ R5,ID_NUM12 JP ID_NUM_ERR ID_NUM10: LD R8,R6 LD R9,R7 JR ID_NUM13 ID_NUM11: LD R8,R6 LD R9,R8 ; ADD R9,#9 ID_NUM13: LD R4,#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 LD R6,@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 LD R7,@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: DEC R8 DEC R9 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: LD R5,@R4 INC 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 RET ID_NUM_ERR: OR BFLAG,#00000100B ; Флаг неопределения RET ;+-------------------------------------------------+ ;¦ Подпрограмма инициализации T1 на 500 ¦ ;+-------------------------------------------------+ INIT_T1_500: LD PRE1,#11110011B ; Коэффицент деления 60 LD TMR,#00001110B ; Разрешение обоих таймеров T1 с загрузкой LD T1,#50 ; Переполнение таймера каждые 2 мс RET ;+-------------------------------------------------+ ;¦ Подпрограмма инициализации T1 на 44117 Гц ¦ ;+-------------------------------------------------+ INIT_T1_44117: LD PRE1,#01000111B ; Коэффицент деления 17 LD TMR,#00001110B ; Разрешение обоих таймеров T1 с загрузкой LD T1,#2 ; Переполнение таймера каждую RET ;+-------------------------------------------------+ ;¦ Подпрограмма вывода байта на ЖКИ '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 ; Передача строба LD R4,#15 DJNZ R4,$ OR P0,#00000010B LD R4,#15 DJNZ R4,$ OR P0,#00000100B ; Снятие сигнала LD R4,#15 DJNZ R4,$ DJNZ R5,SB1 RET ;+-------------------------------------------------------------------------+ ;¦ Подпрограмма ввода информации АОН ¦ ;+-------------------------------------------------------------------------+ 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 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 SCF ;6 TM P3,#00000010B ;10 JR NZ,AONp6 ;10 CCF ;6 AONp6: 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 INC R4 ;6 LDC R13,@RR14 ;12 XOR R13,R9 ;6 LDC R10,@RR12 ;12 ADD R10,@R4 ;6 LD @R4,R10 ;10 INCW RR14 ;10 INC R4 ;6 DEC R7 ;6 AONp3: DJNZ R8,AONp4 ;12 ->207 Продолжение цикла ввода байта ; отсчетов DJNZ R11,AONp5 ;12 ->275 Продолжение ввода байтов отсчетов ; Приведение массива идентификаторов к нормальной форме LD R13,#01 LD R14,#00 LD R15,#00 LD R4,#Fr1_1 ;10 Адрес буфера идентификаторов LD R6,#6 ;10 Счетчик нормальных идентификаторов LD R7,#00 AONp11: SUB @R4,#101 JR NC,AONp7 COM @R4 AONp7: LD R5,@R4 INC R4 SUB @R4,#101 JR NC,AONp8 COM @R4 AONp8: ADD R5,@R4 ; Получение нормального идентификатора INC 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 RET ;Выход ***************************** ; R8 - величина первого идентификатора ; R7 - величина второго идентификатора ; R9 - принятая цифра {0..Bh} , если R9=FFh то цифра не определена ;*********************************** ; ; Последовательность цифр в посылке: ; 1. Категория абонента ; 2. Единицы номера ; 3. Десятки номера ; 4. Сотни номера ; 5. Тысячи номера ; 6. 3-я цифра индекса станции ; 7. 2-я цифра индекса станции ; 8. 1-я цифра индекса станции ; 9. Начало/конец передачи ; 10. Категория абонента ;---------------------------- ; Подпрограмма ввода выборки ;---------------------------- Sample: IRET INT_T0: IRET ;---------------------------- 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 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 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 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 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 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 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 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 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