Перейти к содержанию

Алгоритм Работы Частотомера


Рекомендуемые сообщения

Помогите пожалуйста зделать минимальный алгоритм работы частотомера..

За ранее благодарен...Искал не как не могу найти

Вот на подобе этого:

Алгоритм:

1. Отобразить содержимое (что насчитало)

2. Сбросить счётчик

3. Разрешить счётчику считать определённое количество времени

4. Запретить считать

5. И на пункт 1

Только к этому Частотомер - цифровая шкала с LCD

02546aff45.jpg

Вот программа..

;******* Частотомер с ЖКИ на PIC16F84 **************

; Распределение памяти ЭППЗУ
; 00: 111111xx - предел: FD-1s FC-0,1s FE,FF-10s
; 01: Kд
; 02: Ст. б. задержки
; 03: Мл. б. задержки
; 04: б. точной задержки
; номер ПЧ
; /
; 05 06 07 - 1-я ПЧ 0001xxxx
; 08 09 0A - 2-я ПЧ 0010xxxx
; 0B 0C 0D 0011xxxx
; 0E 0F 10 0100xxxx
; 11 12 13 0101xxxx
; 14 15 16 0110xxxx
; 17 18 19 0111xxxx
; 1A 1B 1C 1000xxxx
; 1D 1E 1F 1001xxxx
; 20 21 22 1010xxxx
; 23 24 25 1011xxxx
; 26 27 28 1100xxxx
; 29 2A 2B - 13-я ПЧ 1101xxxx
; 2C 2D 2E 1110xxxx
; 2F 30 31 - 15-я ПЧ 1111xxxx
;
; Подключение к PB
; B0 - B3 номер ПЧ
; B4 - 0,1 B5 - 1 B6 - 10 B7 - дел
; Подключение к PA
; B0 - DI B1 - SK B2 - LED B3, B4 - IN
CONZAD EQU 20H ; конст. зад. изменения цифр
DOPCON EQU 2EH ; 46 - дополнение к задержке инт.
MEMSZ EQU 0CH ;* (0-255) ст. б. задержки
MEMLZ EQU MEMSZ+1 ;* (0-255) мл. б. задержки
MEMTZ EQU MEMSZ+2 ;* (0-31) б. точн. задержки
MEMTIME EQU MEMSZ+3 ;* (1, 10, 100) кол-во зад. по 0,1с
MEMZ1 EQU MEMSZ+4 ; счетчик и др.
MEMZ2 EQU MEMSZ+5 ; /
MEMZ3 EQU MEMSZ+6 ; /
MEML0 EQU MEMZ3+1 ; ст. цифра на индикатор
MEML1 EQU MEML0+1
MEML2 EQU MEML0+2
MEML3 EQU MEML0+3
MEML4 EQU MEML0+4
MEML5 EQU MEML0+5
MEML6 EQU MEML0+6
MEML7 EQU MEML0+7
MEML8 EQU MEML0+8
MEML9 EQU MEML0+9 ; мл. цифра на индикатор
MEMRZD EQU MEML9+1 ; байт разделителя герц и кгц
MEM10 EQU MEMRZD+1 ;* Яч. битов
BT0 EQU 0 ; =0 --> 0,1сек, =1 --> 1сек
BT1 EQU 1 ; =0 --> 0,1сек или 1сек, =1 --> 10сек
BT2 EQU 2 ; =0 --> без делит., =1 --> с делит.
MEM12 EQU MEM10+1 ;* Яч. предыд. сост. кн. и перекл.
MEM13 EQU MEM10+2 ;* Яч. текущ. сост. кнопок и перекл.
MEM19 EQU MEM13+1 ; Остаток при дел., ст. байт при умнож., счетч.
MEM20 EQU MEM19+1 ; Ст. байт 1-го числа и рез-та, 2-ичн. знач. F
MEM21 EQU MEM19+2 ; 1-е число
MEM22 EQU MEM19+3 ; /
MEM23 EQU MEM19+4 ; Мл. байт 1-го числа и рез-та, 2-ичн. знач. F
MEM28 EQU MEM19+5 ;* Множитель (Кд)
MEM29 EQU MEM28+1 ;* Исп. при вводе ПЧ и сохр. const F
MEM30 EQU MEM28+2 ;* /
MEM31 EQU MEM28+3 ;* /
MEM32 EQU MEM31+1 ;* Ст. байт ПЧ, если B7=0 --> +ПЧ
; если B7=1 --> -ПЧ
MEM33 EQU MEM31+2 ;* /
MEM34 EQU MEM31+3 ;* /
MEM35 EQU MEM31+4 ;* Сохр. const F
MEM36 EQU MEM31+5 ;* /
;
INDF EQU 00H
STATUS EQU 03H
C EQU 00H; STATUS,C
Z EQU 02H; STATUS,Z
RP0 EQU 05H; STATUS,RP0
FSR EQU 04H
PA EQU 05H; PORT A
LED EQU 02H; PA,LED
SK EQU 01H; PA,SK
DI EQU 00H; PA,DI
PB EQU 06H; PORT B
B0 EQU 00H; Биты
B1 EQU 01H; /
B2 EQU 02H; /
B3 EQU 03H; /
B4 EQU 04H; /
B5 EQU 05H; /
B6 EQU 06H; /
B7 EQU 07H; /
INTCON EQU 0BH
T0IF EQU 02H; INTCON,T0IF
T0IE EQU 05H; INTCON,T0IE
TMR0 EQU 01H; Таймер
PCL EQU 02H
EEDATA EQU 08H
EEADR EQU 09H
PCLATH EQU 0AH
TRISA EQU 85H
TRISB EQU 86H
EECON1 EQU 88H
RD EQU 00H; EECON1,RD
WR EQU 01H; EECON1,WR
WREN EQU 02H; EECON1,WREN
EEIF EQU 04H; EECON1,EEIF
EECON2 EQU 89H
OPT EQU 81H; OPTION
TOCS EQU 05H; OPTION,TOCS
;
LIST P=16F84

ORG 0000
;****************** Начало программы ********************
;
INIT: MOVLW 0FFH
MOVWF PA
INIT1: BSF STATUS,RP0; 1 стр.
MOVLW 0FCH; 11111100B: PA0-PA1-вывод, PA2-PA4-ввод
MOVWF TRISA
MOVLW 0FFH
MOVWF TRISB; PB - ввод
MOVLW 077H; 0111.0111B
MOVWF OPT; OPTION
BCF STATUS,RP0; 0 стр.
MOVLW 55H ; стар. значен. разделителя
MOVWF MEM29 ; надо выводить на индик.
; Чтение ЭППЗУ по умолчанию
CALL RDB1; Чтение байт интервала
CLRW; Адрес
CALL RD01; Чтение
ANDLW 03H; 00000011B - выделение предела
MOVWF MEML0 ; Временно сохранить
BTFSC MEML0,B1 ; 1 или 0,1сек
GOTO BGN0 ; 10сек
CALL ZAD1000 ; Зад. для индик. 1сек
BTFSS MEML0,B0 ; 1сек
CALL ZAD1000 ; Еще 1сек для пред. 0,1сек
MOVF MEML0,W
BGN0: MOVWF MEM10
CALL INDPRD ; индикация предела
MOVLW 64H ; 100, предел 10сек
BTFSC MEM10,B1 ; Предел 1 или 0,1сек
GOTO BGN3 ; Предел 10сек
MOVLW 0AH ; Предел 1сек
BTFSS MEM10,B0 ; Предел 1сек
MOVLW 01 ; Предел 0,1сек
BGN3: MOVWF MEMTIME ; кол-во по 0,1сек
MOVLW 01
CALL RD01
MOVWF MEM28; Кд
CLRF MEM12; Предыд. сост. кн. и перекл.
BEGN: COMF PB,W ; сост. кн. 0-раз., 1-замкн.
MOVWF MEM13
BGN1: MOVWF MEMZ1
IORLW 8FH; 1000.1111B - выделение 3-х кнопок
ADDLW 01; W+1-->W
BTFSC STATUS,Z; Пропустить, если W не 0
GOTO NSTR; Нажаты 3 кн., переход на настр.
MOVF MEMZ1,W
ANDLW 70H; 0111.0000B - выделение 3-х кнопок
BTFSC STATUS,Z; Нажаты кнопки
GOTO BGN2; Не нажаты кнопки
COMF PB,W; Чтение кнопок
GOTO BGN1; Ожидание отпускания кнопок
BGN2: BCF MEM10,BT2; Признак без делителя
BTFSC MEM13,B7; Без делителя
BSF MEM10,BT2; С делителем
MOVF MEM13,W
ANDLW 70H; 0111.0000B - выдел. кнопок
BTFSC STATUS,Z; Нажимались кнопки
GOTO LIM1; Не нажимались кнопки
BCF MEM10,BT0; Предел 0,1сек
BCF MEM10,BT1; /
MOVLW 01 ; /
BTFSC MEM13,B4 ; Предел 1 или 10сек
GOTO LIM2 ; Предел 0,1сек, нажата кн.0
BSF MEM10,BT0; Предел 1сек
MOVLW 0AH ; 10
BTFSC MEM13,B6 ; 1сек
GOTO LIM10 ; 10сек
GOTO LIM2
LIM10: BSF MEM10,BT1; Предел 10сек
MOVLW 64H ; 100
LIM2: MOVWF MEMTIME ; кол-во по 0,1сек
CALL INDPRD ; индикация предела
LIM1: MOVF MEM13,W; Кнопки
ANDLW 0FH ; 0000.1111B - выделение номера ПЧ
BTFSC STATUS,Z
GOTO ZDR0; Без ПЧ
XORWF MEM12,W; Если равны, то 0
ANDLW 0FH ; 0000.1111B - выдел. измен. номера ПЧ
BTFSS STATUS,Z; =0, не изменилось
CALL RDP1; Чтение ПЧ
ZDR0: CALL ZAD10 ; Задержка на дребезг 10ms
;********************** Измерение ************************
;Вход: MEMSZ (0-255) ст. б. задержки
; MEMLZ (0-255) мл. б. задержки
; MEMTZ (0-31) б. точн. задержки
; MEMTIME (1, 10, 100) кол-во зад. по 0,1с
;
MOVF MEM13,W
MOVWF MEM12; Новое сост. кн. и пер.на место стар.
MOVLW 8FH; Маска 3-х кнопок
ANDWF MEM13,F; x000.xxxx Маскировка кнопок
CLRF MEM20; Сброс ячеек ст. разр. счетч.
CLRF MEM21; /
BCF PA,B3; PA,RA3=0
BSF STATUS,RP0; 1-я страница
BCF TRISA,B3; PA3- вывод
BCF STATUS,RP0; 0 стр.
CLRF TMR0; Сброс таймера
BCF INTCON,T0IF; Сброс призн. переп., если было

; ****** Формир. интервала измерения *******
; от IZMBEG до IZMEND =(46+MEMSZ*8192+MEMLZ*32+MEMTZ)*MEMTIME
CLRF PCLATH ; 0 стр.
MOVF MEMTIME,W ; сч. кол-ва зад. по 0,1с
MOVWF MEMZ1
BSF STATUS,RP0; 1 стр.
IZMBEG: BSF TRISA,B3; Пуск счетчика
BCF STATUS,RP0; 0 стр.
GOTO ZAD01
ZAD00: GOTO $+1
GOTO $+1
NOP ; дополненеи для 1 и 10 сек
ZAD01: INCF MEMSZ,W
MOVWF MEMZ2 ; ст. б. зад.+1
INCF MEMLZ,W
MOVWF MEMZ3 ; мл, б. зад.+1
GOTO ZAD02
ZAD04: GOTO $+1
ZAD03: GOTO $+1
GOTO $+1
ZAD02: CALL IZM5 ; корр. при переп. счетчика (10ц.)
COMF PB,W ; сост. кн. 0-раз., 1-замкн.
XORWF MEM13,W ; если не измен., W=0
BTFSS STATUS,Z ; не изменилось
GOTO BEGN ; изменилось, новый цикл
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
NOP ; дополнение до 32 циклов
DECFSZ MEMZ3,F ; мл. б. задержки
GOTO ZAD04 ; не все циклы
DECFSZ MEMZ2,F ; ст. б. задержки
GOTO ZAD03 ; не все циклы
MOVF MEMTZ,W ; байт точн. задержки
ANDLW 1FH ; 0001 1111 W=<31
SUBLW 1FH ; 31-W-->W
ADDWF PCL,F ; PCL+W-->PCL
ADDLW 0FFH ; задержка 31 раз
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
ADDLW 0FFH
DECFSZ MEMZ1,F ; сч. кол-ва зад. по 0,1с
GOTO ZAD00
BSF PA,B3; PA,B3=1
BSF STATUS,RP0; 1 стр.
BCF TRISA,B3; Стоп счетчика
; ****** не должно пересекать 0100H *******
IZMEND: BCF STATUS,RP0; 0 стр.
CALL IZM5 ; корр. при переп. счетчика
COMF PB,W ; сост. кн. 0-раз., 1-замкн.
XORWF MEM13,W ; если не измен., W=0
BTFSS STATUS,Z ; не изменилось
GOTO BEGN ; изменилось, новый цикл
; Перенос сост. делителя и счетчика
MOVF TMR0,W
MOVWF MEM22; Сост.счетчика
CLRF MEM23; Яч. делителя
TGLE: DECF MEM23,F
BCF PA,B3
BSF PA,B3; Импульс на вход делителя
MOVF MEM22,W; Пров. изменен. сост. счетч.
SUBWF TMR0,W
BTFSC STATUS,Z
GOTO TGLE; Сост. не изменилось
BCF INTCON,T0IF; Сброс призн. переп., если было
; Обработка результатов
MOVF MEM28,W
MOVWF MEMZ3; Сохранение Кд
BTFSS MEM10,BT2
GOTO BDL1; Без делителя, BT2=0
CALL MUL1; Умножение на Кд
MOVF MEM19,F; Проверка на 0
BTFSS STATUS,Z
GOTO ERR1; MEM19 не равно 0, переполнен., ошибка
BDL1: BTFSC MEM10,BT1
GOTO BPCH; Tи=10сек, поэтому без ПЧ
MOVF MEM13,W; Сост. кнопок
ANDLW 0FH; Выделение номера ПЧ
BTFSC STATUS,Z
GOTO BPCH; Z=1, W=0, ПЧ=0
CALL PER1; Перенос MEM20-MEM23 на MEML6-MEML9
CLRF MEM20
CALL PER2; Перенос MEM32-MEM34 на MEM21-MEM23
BCF MEM21,B7; Сброс знака ПЧ
MOVLW 64H ; 100 - Множитель ПЧ для 1сек
BTFSS MEM10,BT0; 1сек
MOVLW 0AH ; 10 - Множитель ПЧ для 0,1сек
MOVWF MEM28 ; Множитель
CALL MUL1; Умножение ПЧ на 100 или 10
MOVF MEML6,W ; Перенос изм. значения с
MOVWF MEML2 ; MEML6-MEML9 на MEML2-MEML5
MOVF MEML7,W ; /
MOVWF MEML3 ; /
MOVF MEML8,W ; /
MOVWF MEML4 ; /
MOVF MEML9,W ; /
MOVWF MEML5 ; /
BTFSC MEM32,B7
GOTO VICH; Вычитание ПЧ
CALL ADD1; Сложение ПЧ
BTFSS STATUS,C; Переполнение, ошибка
GOTO BPCH
ERR1: CLRW; Включ. предела 0,1сек
GOTO BGN0; Новый цикл, чтен. Кд
VICH: CALL SUB1; Вычитание ПЧ
BPCH: MOVF MEMZ3,W
MOVWF MEM28; Восстановление Кд
CALL TTCH; Рассчет точек и деление F
MOVWF MEMRZD; Точки
CALL NEWIND ; Нужен ли вывод на инд.?
SWAPF MEMRZD,W ; Новая инф. на инд. на место
MOVWF MEM29 ; старой без измен. STATUS,Z
SWAPF MEM29,F
SWAPF MEM20,W
MOVWF MEM30
SWAPF MEM30,F
SWAPF MEM21,W
MOVWF MEM31
SWAPF MEM31,F
SWAPF MEM22,W
MOVWF MEM35
SWAPF MEM35,F
SWAPF MEM23,W
MOVWF MEM36
SWAPF MEM36,F
BTFSC STATUS,Z ; Значен. изменилось, вывод
GOTO BEGN ; Не измен., вывод не нужен
CALL TRN1 ; Перевод в 2-10 форму
CALL ZMN0 ; Замена 00 на 0A и ввод раздела
CALL OUTIN ; Вывод на индикатор
MOVF MEM10,W
ANDLW 03 ; Выделение предела
BTFSS STATUS,Z ; =0, предел 0,1сек
GOTO BEGN ; 1 или 10сек, новый цикл
MOVLW CONZAD
MOVWF MEMZ3 ; доп. задержка для 0,1сек
DOPZAD: COMF PB,W ; сост. кн. 0-раз., 1-замкн.
XORWF MEM13,W ; если не измен., W=0
BTFSS STATUS,Z ; не изменилось
GOTO BEGN ; изменилось, новый цикл
CALL ZAD10 ; 10ms
DECFSZ MEMZ3,F
GOTO DOPZAD
GOTO BEGN ; Новый цикл
;
;******** п/п проверки измен. инф. на инд. ****
; Вход: MEMRZD, MEM20-MEM23 -текущ. значения
; MEM29, 30, 31, 35, 36 - предыд. значения
; Выход: STATUS,Z=1, если значения не изменились
;
NEWIND: MOVF MEMRZD,W
SUBWF MEM29,W
BTFSS STATUS,Z ; =
RETURN ; <>
MOVF MEM20,W
SUBWF MEM30,W
BTFSS STATUS,Z ; =
RETURN ; <>
MOVF MEM21,W
SUBWF MEM31,W
BTFSS STATUS,Z ; =
RETURN ; <>
MOVF MEM22,W
SUBWF MEM35,W
BTFSS STATUS,Z ; =
RETURN ; <>
MOVF MEM23,W
SUBWF MEM36,W
RETURN
;
;******** п/п вывода на индикатор **********
; Вход: MEML0 - MEML9 цифры
; Используется MEMZ1, MEMZ2
;
OUTIN: MOVLW 0AH ; 10 цифр
MOVWF MEMZ1 ; счетчик цифр
MOVLW MEML0 ; адр. ст. цифры
MOVWF FSR
OUTIN2: GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
SWAPF INDF,W
MOVWF INDF ; мл. тетрада на место старшей
MOVLW 4
MOVWF MEMZ2 ; счетчик бит
OUTIN1: RLF INDF,F ; ст. бит -->C
BTFSC STATUS,C ; C=0
BSF PA,DI ; DI=1
BTFSS STATUS,C ; C=1
BCF PA,DI ; DI=0
BSF PA,SK ; SK=1
GOTO $+1
GOTO $+1 ; 1mks при 20мгц
BCF PA,SK ; SK=0, импульс
GOTO $+1
GOTO $+1
DECFSZ MEMZ2,F ; счетчик бит
GOTO OUTIN1
RLF INDF,F ; восстановить цифру
INCF FSR,F ; след. цифра
DECFSZ MEMZ1,F
GOTO OUTIN2
BCF PA,DI ; DI=0
RETURN
;
;П/П коррекции ячеек при переполнении счетчика
;Вход: MEM20 - MEM21 - Старшие разряды счетчика
; ст.б мл.б
IZM5: BTFSS INTCON,T0IF
GOTO IZM2; Нет переполнения
BCF INTCON,T0IF; Сброс призн. переполнения
INCFSZ MEM21,F
GOTO IZM3; Нет переполнения MEM21
INCF MEM20,F
IZM3: RETURN
IZM2: NOP
GOTO IZM3
;
;******** п/п задержки примерно 10мс **********
;
ZAD10: INCF MEMSZ,W
MOVWF MEMZ1
ZAD101: CLRF MEMZ2
DECFSZ MEMZ2,F
GOTO $-1
DECFSZ MEMZ1,F
GOTO ZAD101
RETURN
;
;******** П/П индикации предела ************
; Вход: MEM10 xxxxxx00 - 0,1 сек
; xxxxxx01 - 1 сек
; xxxxxx1x - 10 сек
; Выход: PA2 =0 - 0,1 сек
; =1 - 1 сек
; =Z - 10 сек
INDPRD: BTFSC MEM10,BT1 ; 0,1 или 1сек
GOTO INDP10 ; 10сек
BTFSC MEM10,BT0 ; 0,1сек
GOTO INDP1 ; 1сек
BCF PA,LED ; 0,1сек
INDP2: BSF STATUS,RP0 ; 1 стр.
BCF TRISA,LED ; PA2 - вывод
INDP3: BCF STATUS,RP0 ; 0 стр.
RETURN
INDP1: BSF PA,LED ; 1сек
GOTO INDP2
INDP10: BSF STATUS,RP0
BSF TRISA,LED ; PA2 - ввод
GOTO INDP3
;
; ******** П/П рассчета разделителя и деления F ************
;
TTCH: BTFSS MEM10,BT1
GOTO TTC1; Tи=1 или 0,1сек, BT1=0
BTFSS MEM10,BT2; Tи=10сек
GOTO T10B; Без делителя
MOVLW 03H
SUBWF MEM28,W; MEM28-03-->W
BTFSS STATUS,C; Не было заема, Кд>2
T10B: RETLW 0F8H; Kд=1,2, без дел. Tи=10сек
CALL DL10
MOVLW 15H; 21
SUBWF MEM28,W
BTFSS STATUS,C
RETLW 0FCH; Kд=3-20, Tи=10сек
CALL DL10
RETLW 0FEH; Kд>20, Tи=10сек
TTC1: BTFSS MEM10,BT0
GOTO TTC2; Tи=0,1сек, BT0=0
BTFSS MEM10,BT2; Tи=1сек
GOTO T11B; Без делителя
MOVLW 03H
SUBWF MEM28,W
BTFSS STATUS,C
T11B: RETLW 0FCH; Kд=1,2, без делит. Tи=1сек
CALL DL10
MOVLW 15H
SUBWF MEM28,W
BTFSS STATUS,C
RETLW 0FEH; Kд=3-20, Tи=1сек
CALL DL10
RETLW 0FFH; Kд>20, Tи=1сек
TTC2: BTFSS MEM10,BT2; Tи=0,1сек
GOTO T01B; Без делителя
MOVLW 03H
SUBWF MEM28,W
BTFSS STATUS,C
T01B: GOTO T02B; Kд=1,2, без дел. Tи=0,1сек
CALL DL10
MOVLW 15H
SUBWF MEM28,W
BTFSS STATUS,C
RETLW 0FFH; Kд=3-20, Tи=0,1сек
CALL DL10
RETLW 00H; Kд>20, Tи=0,1сек
T02B: CALL DL10
RETLW 0FFH; Кд=1,2, без дел. Ти=0,1сек
;
;******** П/П замены 00 на 0A (0) и ввода раздела **********
;Вход: MEML0...MEML9 2-10 цифры для индикации
; ст. мл.
;Используется: MEMZ1
;
ZMN0: MOVLW 0AH ; кол-во цифр
MOVWF MEMZ1 ; счетчик
MOVLW MEML0-1 ; адр. ст. цифры -1
MOVWF FSR
MOVLW 0AH ; код 0
ZMN2: INCF FSR,F
MOVF INDF,F ; поиск не 0 цифры
BTFSS STATUS,Z ; =0
GOTO ZMN1 ; 1-я не 0 цифра
DECFSZ MEMZ1,F
GOTO ZMN2
MOVWF INDF ; все 0, зажечь младший
GOTO VRZ0 ; конец
ZMN1: MOVF INDF,F ; проверим
BTFSC STATUS,Z ; не 0
MOVWF INDF ; замена
INCF FSR,F
DECFSZ MEMZ1,F
GOTO ZMN1
; Ввод разделителя
;Вход: MEMRZD - байт разделителя герц и кгц
; без дел. 3...20 >20
; 0,1 XXXXXXXX X XXXXXXXX X XXXXXXXXXX
; 1 XXXXXX XXX XXXXXXX XX XXXXXXXX X
; 10 XXXXX XXXX XXXXXX XXX XXXXXXX XX
; без дел. 3...20 >20
; 0,1 1111.1111=FF 1111.1111=FF 0000.0000=00
; 1 1111.1100=FC 1111.1110=FE 1111.1111=FF
; 10 1111.1000=F8 1111.1100=FC 1111.1110=FE
; 0 - нет, 1 - сдвиг
; MEML0...MEML9 - цифры
; ст. мл.
;Используется: MEMZ1
;
VRZ0: MOVLW 08H ; кол-во бит сдвига
MOVWF MEMZ1 ; счетчик
VRZ1: BCF STATUS,C ; C=0
BTFSC MEMRZD,0 ; для 2-й справа цифры
RLF MEML8,F ; сдвиг 2-й цифры
BTFSC MEMRZD,1
RLF MEML7,F
BTFSC MEMRZD,2
RLF MEML6,F
BTFSC MEMRZD,3
RLF MEML5,F
BTFSC MEMRZD,4
RLF MEML4,F
BTFSC MEMRZD,5
RLF MEML3,F
BTFSC MEMRZD,6
RLF MEML2,F
BTFSC MEMRZD,7 ; для 9-й цифры
RLF MEML1,F ; сдвиг 9-й цифры
BTFSC MEMRZD,7 ; для 9-й цифры
RLF MEML0,F ; сдвиг 10-й цифры
DECFSZ MEMZ1,F
GOTO VRZ1 ; повтор 8 раз
RETURN
;
;************** П/П арифметических операций *************
;П/П перевода 4-х байтного числа из 2-ичн. в 2-10 форму
;Вход: MEM20-MEM23 Выход:MEML1-MEML9
; ст.б мл.б ст.б мл.б
;Ячейки: MEMZ1 - счетч. при делении Если не было переполн.
; MEMZ2 - счетчик байт 9-и цифр, то MEM19=0
; MEM19 - остаток при делении
; MEML1 - MEML2 ... MEML8 - MEML9
TRN1: CLRF MEML0 ; сброс ст. цифры
BCF STATUS,C; C=0
MOVLW 09; Кол-во байт рез-та
MOVWF MEMZ2; Счетчик байт
MOVLW MEML9; Адр. мл. байта рез-та
MOVWF FSR
TRN2: CALL DL10; Деление на 10
MOVF MEM19,W; Остаток-->W
MOVWF INDF
DECF FSR,F; FSR-1-->FSR
DECFSZ MEMZ2,F; Счетчик байт
GOTO TRN2
RETURN
;
;П/П деления 4-х байтного числа на 10
;Вход: MEM20-MEM23 - Делимое Выход:MEM20-MEM23 - Частное
; ст.б мл.б ст.б мл.б
; MEMZ1 - Счетчик бит MEM19 - Остаток
DL10: CLRF MEM19; Нулевой ст. байт делимого
MOVLW 20H; Кол-во разр.
MOVWF MEMZ1; Счетчик бит сдвига
DEL3: CALL SDV2; Сдвиг 4-х бит на разряд влево
RLF MEM19,F
MOVLW 0AH; Делитель-->W
SUBWF MEM19,W; MEM19-W-->W, если заем, С=0
BTFSC STATUS,C; Если С=0, пропустить (заем)
MOVWF MEM19; Разность
DECFSZ MEMZ1,F; Счетчик бит
GOTO DEL3; Повтор 32 раза
CALL SDV2; Сдвиг 4 бит на 1 разр. влево и занес. посл. цифры
RETURN
SDV2: RLF MEM23,F
RLF MEM22,F
RLF MEM21,F
RLF MEM20,F
RETURN
;
;П/П вычитания 4-х байтных чисел
;Вход: MEM20 - MEM23 - 1-е число
; MEML2 - MEML5 - 2-е число (не изменяется)
;Выход:MEM20 - MEM23 - разность без знака
; ст.б мл.б
SUB1: MOVF MEML5,W; мл. байт 2-го числа
SUBWF MEM23,F; вычитание мл. байтов
MOVF MEML4,W; след. 2 байта
BTFSS STATUS,C
INCFSZ MEML4,W; заем был (С=0)
SUBWF MEM22,F; заема не было (С=1)
MOVF MEML3,W
BTFSS STATUS,C
INCFSZ MEML3,W
SUBWF MEM21,F
MOVF MEML2,W
BTFSS STATUS,C
INCFSZ MEML2,W
SUBWF MEM20,F; при заеме С=0
BTFSC STATUS,C; пропустить при заеме
GOTO SUB2; 2-е число < 1-го
COMF MEM23,F; 2-е число > 1-го
COMF MEM22,F
COMF MEM21,F
COMF MEM20,F
MOVLW 01
ADDWF MEM23,F; +1
BTFSC STATUS,C; пропустить, если С=0
ADDWF MEM22,F; был перенос
BTFSC STATUS,C
ADDWF MEM21,F
BTFSC STATUS,C
ADDWF MEM20,F
SUB2: RETURN
;
;П/П Сложения 4-х байтных чисел
;Вход: MEM20 - MEM23 - 1-е число
; MEML2 - MEML5 - 2-е число (не изменяется)
;Выход:MEM20 - MEM23 - сумма, С=1 при переполнении
; ст.б мл.б
ADD1: MOVF MEML5,W; мл. байт 2-го числа
ADDWF MEM23,F; сложение мл. байтов
MOVF MEML4,W; след. байт 2-го числа
BTFSC STATUS,C
INCFSZ MEML4,W; был перенос
ADDWF MEM22,F; переноса не было
MOVF MEML3,W
BTFSC STATUS,C
INCFSZ MEML3,W
ADDWF MEM21,F
MOVF MEML2,W
BTFSC STATUS,C
INCFSZ MEML2,W
ADDWF MEM20,F
RETURN
;
;П/П умножения 4-х байтного числа на однобайтное
;Вход: MEM20 - MEM23 - число
; MEM28 - множитель
;Выход:MEM20 - MEM23 - произведение
; ст.б мл.б
; MEM19 - ст. байт =0, если не было переп. 4 байт
; MEML2 - MEML5 - исходное число
; MEMZ1 - счетчик
MUL1: CLRF MEM19; мл. байт=0
CALL PER3; перенос числа на MEML2 - MEML5
MOVLW 08; счетчик бит множителя
MOVWF MEMZ1
MUL2: RRF MEM28,F; множитель
BTFSC STATUS,C
GOTO MUL3; C=1
DECFSZ MEMZ1,F; счетчик
GOTO MUL2; не все биты множителя
CLRF MEM20; результат=0
CLRF MEM21; /
CLRF MEM22; /
CLRF MEM23; /
RETURN
MUL3: BCF STATUS,C; C=0
GOTO MUL5
MUL4: RRF MEM28,F; сдвиг множителя
BTFSC STATUS,C
CALL ADD1; C=1, сложение 4-х байтн. чисел
MUL5: RRF MEM20,F
RRF MEM21,F
RRF MEM22,F
RRF MEM23,F
RRF MEM19,F
DECFSZ MEMZ1,F; счетчик
GOTO MUL4; не все биты множителя
MOVLW 08; сдвиг MEM20<-MEM21<-MEM22<-MEM23<-MEM19
MOVWF MEMZ1;счет \---------------------------^
MUL6: RLF MEM19,F
CALL SDV2; сдвиг 4-х байт влево
DECFSZ MEMZ1,F
GOTO MUL6
RLF MEM19,F
RETURN
;П/П переноса МЕМ20 - МЕМ23 на МЕМL6 - МЕМL9
PER1: MOVF MEM20,W
MOVWF MEML6
MOVF MEM21,W
MOVWF MEML7
MOVF MEM22,W
MOVWF MEML8
MOVF MEM23,W
MOVWF MEML9
RETURN
;П/П переноса MEM32-MEM34 на MEM21-MEM23
PER2: MOVF MEM32,W
MOVWF MEM21
MOVF MEM33,W
MOVWF MEM22
MOVF MEM34,W
MOVWF MEM23
RETURN
;П/П переноса МЕМ20 - МЕМ23 на МЕМL2 - МЕМL5
PER3: MOVF MEM20,W
MOVWF MEML2
MOVF MEM21,W
MOVWF MEML3
MOVF MEM22,W
MOVWF MEML4
MOVF MEM23,W
MOVWF MEML5
RETURN
; ************* П/П работы с ЭППЗУ *****************
; П/П чтения ячейки ЭППЗУ
; Вход: W - адрес, 0 стр.
; Выход: W - данные
RD01: MOVWF EEADR; Адрес
BSF STATUS,RP0; 1-я стр.
BSF EECON1,RD; Чтение
BCF STATUS,RP0; 0 стр.
MOVF EEDATA,W; Данные
RETURN
;
; П/П чтения байт интервала
; Выход: MEMSZ (0-255) ст. б. задержки
; MEMLZ (0-255) мл. б. задержки
; MEMTZ (0-31) б. точн. задержки
RDB1: MOVLW 02; адр. ст. б.
CALL RD01
MOVWF MEMSZ
MOVLW 03
CALL RD01
MOVWF MEMLZ
MOVLW 04
CALL RD01
MOVWF MEMTZ
RETURN
;
; П/П чтения ПЧ из ЭППЗУ
; Вход: MEM13 - мл. тетрада - номер ПЧ
; Выход: MEM32 - MEM34 - ПЧ
; Используется: MEMZ1
; ст. мл.
RDP1: CALL RSAD
CALL RD01
MOVWF MEM32
INCF MEMZ1,F
MOVF MEMZ1,W
CALL RD01
MOVWF MEM33
INCF MEMZ1,F
MOVF MEMZ1,W
CALL RD01
MOVWF MEM34
RETURN
;
; П/П рассчета адреса ПЧ в ЭППЗУ
; Вход: MEM13 - мл. тетрада - номер ПЧ
; Выход: MEMZ1 - адрес ст. байта
RSAD: BCF STATUS,C; C=0
MOVF MEM13,W
ANDLW 0FH; Выделение номера ПЧ
MOVWF MEMZ1; Номер ПЧ
MOVLW 02
ADDWF MEMZ1,W
ADDWF MEMZ1,W
ADDWF MEMZ1,W; Нач. адр. ПЧ
MOVWF MEMZ1
RETURN
;************ Настройка ********************
;
; П/П проверки-записи-проверки яч. ЭППЗУ
; Вход: MEMZ3 - данные
; W - адрес
; 0 стр., прер. запрещены
; Чтение
RWR1: CALL RD01; Чтение, W - данные
SUBWF MEMZ3,W
BTFSC STATUS,Z; Данные не совпадают
RETURN; Совпадают, выход
; Запись
MOVF MEMZ3,W
MOVWF EEDATA; Данные для записи
BSF STATUS,RP0; 1 стр.
BSF EECON1,WREN; Разреш. записи
MOVLW 55H
MOVWF EECON2
MOVLW 0AAH
MOVWF EECON2
BSF EECON1,WR; Начало записи
WR01: BTFSS EECON1,EEIF; =1, запись закончена
GOTO WR01; Ожид. заверш. записи
BCF EECON1,WREN; Запрет записи
BCF EECON1,EEIF; Сброс бита оконч. зап.
;Проверка
BSF EECON1,RD; чтение
BCF STATUS,RP0; 0 стр.
MOVF MEMZ3,W
SUBWF EEDATA,W; Запис. (W) и счит. совпали ?
BTFSC STATUS,Z
RETURN; Совпали, выход
; Вывод LLLLLLLLLL в течение 1 сек
MOVLW 0DH
CALL ZAGSCR
CALL OUTIN
ZAD1000: MOVLW 64H ; 100
ZADN10: MOVWF MEMZ3
CALL ZAD10
DECFSZ MEMZ3,F
GOTO $-2
RETURN

; П/П загрузки в экр. обл.
;Вход: W - символ
;
ZAGSCR: MOVWF MEML0
MOVWF MEML1
MOVWF MEML2
MOVWF MEML3
MOVWF MEML4
MOVWF MEML5
MOVWF MEML6
MOVWF MEML7
MOVWF MEML8
MOVWF MEML9
RETURN
;
; П/П записи ячеек ЭППЗУ
; Вход: MEM19- нач. адр. ЭППЗУ
; МЕМ20- кол-во ячеек
; МЕМ32- и дальше - данные
; Используются: MEMZ1, MEMZ2, MEMZ3
;
WRT1: MOVLW MEM32; Нач. адрес ОЗУ
MOVWF FSR
WRT2: MOVF INDF,W; Данные
MOVWF MEMZ3
MOVF MEM19,W; Адрес ЭППЗУ
CALL RWR1; Запись ячейки
INCF MEM19,F; След. адр. ЭППЗУ
INCF FSR,F ; След. адр. ОЗУ
DECFSZ MEM20,F; Счетчик
GOTO WRT2
RETURN
;
; П/П вывода предела 1, 0.1 или 10
; Вход: MEM10 - предел
INPR: MOVLW 0FDH; 1сек
SUBWF MEM10,W
BTFSS STATUS,Z; 1сек
GOTO PR01; не 1сек
MOVLW 01
MOVWF MEML8; Запись на индик. 1
MOVLW 00
MOVWF MEML9
RETURN
PR01: MOVLW 0FCH; 0.1сек
SUBWF MEM10,W
BTFSS STATUS,Z; 0.1сек
GOTO PR10; не 1, не 0.1, значит 10сек
MOVLW 0AH ; 0
MOVWF MEML8; Запись на индик. 01
MOVLW 01
MOVWF MEML9
RETURN
PR10: MOVLW 01; Запись на индик. 10
MOVWF MEML8
MOVLW 0AH
MOVWF MEML9
RETURN
; П/П вывода и индикации Кд
; Вход: W - Кд
VE01: MOVWF MEM23
CLRF MEM22
CLRF MEM21
CLRF MEM20
CALL TRN1
CLRF MEMRZD
CALL ZMN0 ; Замена 00 на 0A
RETURN
; П/П ожидания отпускания кнопок
;
OKN1: MOVLW 00 ; Кол-во раз чтен. кнопок
MOVWF MEMRZD; Счетчик
OKN2: COMF PB,W
ANDLW 70H; Выделение 3-х кнопок
BTFSS STATUS,Z; Не нажаты кнопки
GOTO OKN1; Нажаты кнопки
DECFSZ MEMRZD,F
GOTO OKN2; Повтор 256 раз
RETURN; Выход, кнопки не нажаты
;
; ************* Начало программы настройки *********
; Выбор предела
NSTR: CLRW; Адрес предела по умолчанию
CALL RD01; Чтение, W- предел
IORLW 0FCH; 11111100B, выделение предела
MOVWF MEM10; Сохранить
CLRW
CALL ZAGSCR ; Гашение инд.
CALL INPR; Вывод на индик. предела
MOVLW 0EH; P
MOVWF MEML5
MOVLW 0FH; -
MOVWF MEML6
CALL OUTIN
CALL INDPRD ; Индикация предела
CALL OKN1 ; Ожид. отпуск. кнопок
PRS4: CALL ZADKN; Задержка и кнопки
BTFSC MEM13,B6 ; SEL не нажата
GOTO ZAP1; Запись
BTFSS MEM13,B5; Нажата UP
GOTO PR20; Не нажата UP
CLRW; Если 10с =FF
INCFSZ MEM10,F
MOVLW 0FFH; Если 10с =FE
SUBWF MEM10,W
MOVLW 0FCH
BTFSC STATUS,Z; (MEM10) не FE или FF
MOVWF MEM10; (MEM10) = FC
PR22: CALL INPR; Вывод предела
CALL OUTIN
CALL INDPRD; Индикация предела
GOTO PRS4; Повтор
PR20: BTFSS MEM13,B4; Нажата DWN
GOTO PRS4; Не нажата DWN
DECF MEM10,F
MOVLW 0FCH
SUBWF MEM10,W
MOVLW 0FEH
BTFSS STATUS,C; Нет переноса
MOVWF MEM10; Перенос, (МЕМ10)=FE
GOTO PR22
; Запись предела
ZAP1: MOVF MEM10,W
IORLW 0FCH; Выделение предела
MOVWF MEMZ3; Данные
CLRW; Адрес
CALL RWR1; Запись яч.
CALL OKN1; Ожид. отпуск. кнопок
;
; Выбор Кд
MOVLW 01; Адрес
CALL RD01; Чтение Кд
MOVWF MEM28; Кд
KD01: CLRW
CALL ZAGSCR ; гашение инд.
MOVF MEM28,W
CALL VE01; Вывод Кд в экр. обл.
MOVLW 0BH ; F
MOVWF MEML0
MOVWF MEML2
MOVLW 01 ; 1
MOVWF MEML1
MOVLW 0AH ; 0
MOVWF MEML3
MOVLW 0FH ; -
MOVWF MEML4
MOVWF MEML5
CALL OUTIN
KD02: CALL ZADKN; Задержка и кнопки
BTFSC MEM13,B6; SEL не нажата
GOTO ZAP2; Запись
BTFSS MEM13,B5; Нажата UP
GOTO KDDN; Не наж. UP
INCF MEM28,F
BTFSC STATUS,Z; (MEM28) не 0
INCF MEM28,F; Исключение Кд=0
GOTO KD01; Повтор
KDDN: BTFSS MEM13,B4; Нажата DWN
GOTO KD02; Не наж. кнопки
DECF MEM28,F
BTFSC STATUS,Z; (MEM28) не 0
DECF MEM28,F; Исключение Кд=0
GOTO KD01
ZAP2: MOVF MEM28,W
MOVWF MEMZ3; Кд
MOVLW 01; Адрес
CALL RWR1; Запись
CALL OKN1
; Выбор знака ПЧ
COMF PB,W
ANDLW 0FH ; Выделение N ПЧ
BTFSC STATUS,Z; N ПЧ не 0
GOTO TEST; N ПЧ = 0, выход
MOVWF MEM13
CALL RDP1; Чтение ПЧ на MEM32-MEM34
MOVF MEM13,W; N ПЧ
CALL VE01; Вывод N ПЧ в экр. обл.
MOVLW 0BH; F
MOVWF MEML5
MOVLW 0EH; P
MOVWF MEML6
VVZN: MOVLW 0CH; +
BTFSC MEM32,B7; B7=0, +ПЧ
MOVLW 0FH; -, B7=1, -ПЧ
MOVWF MEML4
CALL OUTIN
VVZN1: CALL ZADKN; Задержка и кнопки
BTFSC MEM13,B6; SEL не нажата
GOTO VPCH; Ввод ПЧ
BTFSC MEM13,B5; Не нажата UP
BCF MEM32,B7; Наж. UP, уст-ка +ПЧ
BTFSC MEM13,B4; Не наж. DWN
BSF MEM32,B7
ANDLW 70H ; 0111.0000B Выделение кнопок
BTFSC STATUS,Z ; Нажата кнопка
GOTO VVZN1 ; Кнопки не нажаты
GOTO VVZN
; Ввод ПЧ
VPCH: MOVWF MEM12 ; сохранить номер ПЧ
CALL OKN1
CLRF MEM13 ; Кнопки не нажаты
VPH1: CLRF MEM29; CONST изменения ПЧ
CLRF MEM30
MOVLW 01 ; 100гц
MOVWF MEM31
VPH4: MOVLW 05H; Кол-во раз до удвоения CONST
MOVWF MEM28
VPH3: CLRF MEML2; Ст. байт
MOVF MEM29,W; Перенос CONST на MEML2-MEML5
MOVWF MEML3
MOVF MEM30,W
MOVWF MEML4
MOVF MEM31,W
MOVWF MEML5
CLRF MEM20 ; Ст. байт ПЧ
CALL PER2; Перенос ПЧ на MEM21-MEM23
BCF MEM21,B7; Сброс знака ПЧ
BTFSC MEM13,B6; SEL не нажата
GOTO ZAP3; Нажата SEL
BTFSC MEM13,B5; Не нажата UP
CALL ADD1; Наж. UP, сложение ПЧ с CONST
BTFSC MEM13,B4; Не нажата DWN
CALL SUB1; Наж. DWN, вычитание CONST
MOVF MEM32,W; Ст. байт ПЧ
ANDLW 80H; Маска знака
BCF MEM21,B7; Сброс ст. бита ПЧ
IORWF MEM21,W; Сохранить ПЧ
MOVWF MEM32
MOVF MEM22,W
MOVWF MEM33
MOVF MEM23,W
MOVWF MEM34
CALL TRN1
MOVLW 0FFH
MOVWF MEMRZD ; Разделить гц
CALL ZMN0 ; Замена 00 на 0A и отделен. герц
MOVLW 0BH ; F
MOVWF MEML0
MOVLW 0EH ; P
MOVWF MEML1
CALL OUTIN
CALL ZADKN; Задержка и кнопки
MOVLW 70H; 0111.0000B, выдел. кнопок
ANDWF MEM13,W
BTFSC STATUS,Z; W не 0, кнопки нажаты
GOTO VPH1; Кнопки не нажаты
BTFSC MEM13,B6; SEL не нажата
GOTO ZAP3; Нажата SEL
DECFSZ MEM28,F; Счетчик обнулился
GOTO VPH3; Не обнулился
BCF STATUS,C
RLF MEM31,F; Удвоение CONST
RLF MEM30,F
BTFSS STATUS,C; C=1, предел CONST
GOTO VPH4; Повтор, перезагр. счетч.
RRF MEM30,F
RRF MEM31,F
GOTO VPH4
; Запись ПЧ
ZAP3: MOVF MEM12,W
MOVWF MEM13 ; Восстан. номер ПЧ, если измен.
CALL RSAD; Рассчет адреса
MOVWF MEM19; Сохранить адрес
MOVLW 03
MOVWF MEM20; Кол-во ячеек
CALL WRT1; Запись
CALL OKN1
; Вход в режим ввода констант
TEST: MOVLW 0FH ; -
CALL ZAGSCR
CALL OUTIN
MOVLW 00
MOVWF MEM28 ; Счетчик
TS01: CALL ZAD10 ; 10ms
COMF PB,W ; Кнопки
MOVWF MEM13
BTFSC MEM13,B6; Не наж. SEL
GOTO VPFOP; Наж. SEL
DECFSZ MEM28,F; Задержка
GOTO TS01; Ожидание
KONEC: CALL OKN1
MOVLW 00
CALL ZAGSCR
MOVLW 0AH
MOVWF MEML9 ; 0 в мл. разряде
CALL OUTIN
GOTO INIT; Сброс, не нажата SEL
; Ввод байт интервала
VPFOP: CALL OKN1
CALL RDB1; Чтение байт на MEMSZ, MEMLZ. MEMTZ
MOVF MEMSZ,W ; ст байт интерв
MOVWF MEM32 ; сохранить
MOVF MEMLZ,W
MOVWF MEM33
CLRF MEM34 ; байт точн. зад.
BCF STATUS,C
MOVLW 03
MOVWF MEMZ1 ; счетчик байт
RRF MEM32,F
RRF MEM33,F
RRF MEM34,F
DECFSZ MEMZ1,F
GOTO $-4 ; сдвиг байт на 3 вправо
MOVF MEMTZ,W
ANDLW 1FH ; обнулить 3 ст. бита
IORWF MEM34,F ; получили 3-х байтн. число
CLRF MEM13 ; кнопки не нажаты
VPFOP1: CLRF MEM29; CONST изменения F оп
CLRF MEM30
MOVLW 01H
MOVWF MEM31
VPFOP4: MOVLW 05H; Кол-во раз до удвоения CONST
MOVWF MEM12
VPFOP3: CLRF MEML2; Ст. байт
MOVF MEM29,W; Перенос CONST на MEML2-MEML5
MOVWF MEML3
MOVF MEM30,W
MOVWF MEML4
MOVF MEM31,W
MOVWF MEML5
CLRF MEM20
CALL PER2; Перенос MEM32-MEM34 на MEM21-MEM23
BTFSC MEM13,B6; SEL не нажата
GOTO ZAPFOP; Нажата SEL
BTFSC MEM13,B5; Не нажата UP
CALL ADD1; Наж. UP, сложение с CONST
BTFSC MEM13,B4; Не нажата DWN
CALL SUB1; Наж. DWN, вычитание CONST
CLRF MEM20 ; ст. байт =0
MOVLW 0FH
ANDWF MEM21,F ; Ограничить интервал
CALL PER4 ; Перенос MEM21-MEM23 на MEM32-MEM34
; перевод байт интерв. в F оп и вывод на индикацию
CLRF MEML2
CLRF MEML3
CLRF MEML4
MOVLW DOPCON ; 46 - дополнение к зад. интерв.
MOVWF MEML5
CALL ADD1 ; +46
MOVLW 28H
MOVWF MEM28
CALL MUL1 ; умножить на 40 = такт. частота в ГЦ
CALL TRN1
MOVLW 0FCH
MOVWF MEMRZD ; Разделить гц
CALL ZMN0 ; Замена 00 на 0A и отделен. герц
MOVLW 0CH ; _I
MOVWF MEML0
CALL OUTIN
CALL ZADKN; Задержка и кнопки
COMF PB,W ; Кнопки
MOVWF MEM13
MOVLW 70H; 0111.0000B, выдел. кнопок
ANDWF MEM13,W
BTFSC STATUS,Z; W не 0, кнопки нажаты
GOTO VPFOP1; Кнопки не нажаты
BTFSC MEM13,B6; SEL не нажата
GOTO ZAPFOP; Нажата SEL
DECFSZ MEM12,F; Счетчик обнулился
GOTO VPFOP3; Не обнулился
BCF STATUS,C
RLF MEM31,F; Удвоение CONST
RLF MEM30,F
BTFSS STATUS,C; C=1, предел CONST
GOTO VPFOP4; C=0, Повтор, перезагр. счетч.
RRF MEM30,F
RRF MEM31,F ; восстановить значение
GOTO VPFOP4
ZAPFOP: MOVF MEM34,W ; мл. байт зад.
ANDLW 1FH ; обнулить 3 ст. бита
MOVWF MEMZ2 ; сохранить
BCF STATUS,C
MOVLW 03
MOVWF MEMZ1 ; счетчик байт
RLF MEM34,F
RLF MEM33,F
RLF MEM32,F
DECFSZ MEMZ1,F
GOTO $-4 ; сдвиг байт на 3 влево
MOVF MEMZ2,W
MOVWF MEM34
MOVLW 02 ; адр. ЭППЗУ
MOVWF MEM19
MOVLW 03 ; кол-во байт
MOVWF MEM20
CALL WRT1 ; запись
GOTO KONEC ; выход
;
;П/П переноса MEM21-23 на MEM32-MEM34
PER4: MOVF MEM21,W; Сохранить байты интерв.
MOVWF MEM32
MOVF MEM22,W
MOVWF MEM33
MOVF MEM23,W
MOVWF MEM34
RETURN
;
;П/П задержки для смены цифр
ZADKN: COMF PB,W
MOVWF MEM13 ; сохр. кнопки
MOVLW CONZAD ; конст. задержки
MOVWF MEMZ3
ZADKN2: CALL ZAD10 ; 10ms
COMF PB,W
XORWF MEM13,W
BTFSS STATUS,Z ; не изменилось
GOTO ZADKN1 ; изменилось, выход
DECFSZ MEMZ3,F
GOTO ZADKN2
ZADKN1: CALL ZAD10
COMF PB,W
MOVWF MEM13
RETURN
;
;********************* Слово конфигурации *****************
ORG 2007H
; ***** Для PIC16F84: *****
; bit3 - PWRTE=0 (PWRTE enable)
; bit2 - WDTE=0 (WDTE disable)
; bit1-0 =01 (XT)
; bit4-13 =1 (Защита не установлена)
DW 3FF1H; B'11111111110001'
; bit4-13 =0 (Защита установлена)
; DW 0001H; B'00000000000001'
;
; *********** DATA MEMORY ***************
;
ORG 2100H

DW 00FDH; 1cek
DW 000AH; Кд=10
DW 000CH; Ст. байт зад.
DW 0033H; Мл. байт зад.
DW 0012H; Байт точн. зад.
DW 0001H; Ст. байт 1-ой ПЧ +10700 0
DW 00A1H
DW 00F8H; Мл. байт 1-ой ПЧ
DW 0081H; Ст. байт 2-ой ПЧ
DW 00A1H
DW 00F8H; Мл. байт 2-ой ПЧ -10700 0
DW 00FFH
DW 00FFH
DW 00FFH
DW 0081H; Ст. байт 4-ой ПЧ -10700 0
DW 00A1H
DW 00F8H; Мл. байт 4-ой ПЧ
DW 00FFH
DW 00FFH
DW 00FFH
DW 0001H; Ст. байт 6-ой ПЧ +10700 0
DW 00A1H
DW 00F8H; Мл. байт 6-ой ПЧ
;
END

Изменено пользователем Alex
Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...