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; Счетчик низкой линии
JR Z,M2_1
M2_1:
DJNZ R4,M2_0
CP CNT_ONL,#8
JR UGE,M3; Переход если трубку сняли
TM BFLAG,#10000000B
JR M2_2
M3:
AND BFLAG,#10110011B
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
M3_1: LD R6,@R7
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
DJNZ R9,M3_3
OR P0,#00000001B; Снять захват LCD
M4: AND BFLAG,#00110011B
LD BLC_CLOCK,#0
TM P2,#00000100B
JR NZ,M4_1
M4_1:
TM P2,#01000000B; Проверка тока в линии
JR Z,M5; Переход если нет импульса в линии
LD R9,#0; Счетчик цыфры
MN4_1: LD R4,#20; Счетчик импульса
MN4_2: CALL GO_HALT
JR Z,MN4_3; Переход если прервался импульс
DJNZ R4,MN4_2
; Выход если импульс слишком длинный
MN4_3:
LD R4,#12; Счетчик паузы
INC R9
MN4_4: CALL GO_HALT
JR NZ,MN4_1; Переход если прервалась пауза
DJNZ R4,MN4_4
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
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
JP MAIN
;+----------------------------------------------------------------------+
;¦ Режим просмотра списка ¦
LIST:
CP BLC_CLOCK,#00
JP Z,LIST1
RET
LIST1: AND P0,#11111110B; Захват LCD
LIST2: CALL GO_HALT
DJNZ R4,LIST2
LIST3: LD N_RECORD,#1
LIST4: LD R6,N_RECORD
CALL SEND_BYTE; Вывод на LCD номера записи
LD R6,#0FH; '-'
LD R7,N_RECORD; Вычисление адреса записи
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:; флаг
LD R6,@R7; Вывод первой цифры номера
AND R6,#0FH
CP R6,MASK1
JP NZ,LIST7
LIST7:
INC R7; Вывод второй цифры номера
LD R6,@R7
SWAP R6; Вывод третьей цифры номера
LIST8:
INC R7; Вывод остальных цифр номера
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
OR P0,#00000001B
; Режим установок
LIST12:
; Установка флага показа категории
LD R6,#0CH
LD R6,#0AH
JP Z,LIST13; Показать флаг индикации категории
LD R6,#01H
LIST13:
LD R6,#0DH
LD R6,MASK1
LIST14:
JR Z,LIST15
JP LIST17
LIST15:
JR Z,LIST16
XOR BFLAG,#00010000B;
JP LIST12
LIST16: CALL GO_HALT
JP NZ,BEGIN
JR LIST14
LIST17:; Установка маски первой цифры
LD R6,#00H
JP Z,LIST18; Показать флаг индикации категории
LIST18:
LIST19:
JR Z,LIST20
JP LIST4
LIST20:
JR Z,LIST22
INC MASK1
CP MASK1,#0AH
JR ULE,LIST21
LD MASK1,#00
LIST21:
LIST22: CALL GO_HALT
JR LIST19
LIST23: CALL GO_HALT
JP LIST9
;----------------------------------------------------------------------
; END LIST
;+--------------------------------------------+
;¦ Подпрограмма HALT режима ¦
GO_HALT:
PUSH R4
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
Страницы: 1, 2, 3, 4