;
; ТАЙМЕР 999,9 СЕК.
; ПРЯМОЙ И ОБРАТНЫЙ ОТСЧЕТ, СТОП.
; ВЫКЛЮЧЕНИЕ НАГРУЗКИ, ВКЛЮЧЕНИЕ ЗУММЕРА.
; ИНДИКАЦИЯ - 4 РАЗРЯДА 7-СЕГМЕНТНЫЕ ИНДИКАТОРЫ С ОК.
; РАЗРАБОТАЛ НИКОЛАЙ ЗАЕЦ
; ДЛЯ СВОБОДНОГО ИСПОЛЬЗОВАНИЯ РАДИОЛЮБИТЕЛЯМИ.
; п.ВЕЙДЕЛЕВКА, БЕЛГОРОДСКОЙ.
;
saes@mail.ru
;
; ПРОГРАММА = TAIM99.ASM
; ВЕРСИЯ: 12-04-06.
; АССЕМБЛЕР И ОТЛАДЧИК: MPLAB IDE, ВЕРСИЯ: 5.70.40.
;
LIST P=16F73
#INCLUDE P16F73.INC
__CONFIG 3FB9H
;========================================================
; ИСПОЛЬЗУЕТСЯ КВАРЦ ЧАСТОТОЙ 4,0 MГЦ.
; КОЭФФИЦИЕНТ ДЕЛЕНИЯ 200, 500
; И ЦИКЛОМ, РАВНЫМ 4 ТАКТАМ
; ДАЕТ НА ВЫХОДЕ 0,1 СЕКУНДУ (4х200х500=400000).
;========================================================
; RB0 - RB7 - АНОДЫ.
; RA0 - RA3 - КАТОДЫ.
; RC1 - ПУСК/СТОП.
; RC5 - КНОПКА "УСТАНОВКА".
; RC4 - КНОПКА "РАЗРЯД".
; RA4 - ВЫХОД ПОТЕНЦИАЛ.
; RC0 - СИЛОВОЙ ВЫХОД.
;==============================================
; РЕГИСТРЫ ОБЩЕГО НАЗНАЧЕНИЯ.
;==============================================
CBLOCK H*20*
KATOD ;ПОЗИЦИОННОЕ ЗНАЧЕНИЕ КАТОДА.
KATOD2 ;ДВОИЧНОЕ ЗНАЧЕНИЕ КАТОДА.
MCK ;РЕГИСТРЫ СЧЕТА НА ПЛЮС. МИЛЛИСЕКУНДЫ ДВОИЧНЫЕ.
MCKL ;СОТЫЕ СЕКУНД.
MCKH ;ДЕСЯТЫЕ СЕКУНД.
CEK ;СЕКУНДЫ ДВОИЧНЫЕ.
CEKL ;ЕДИНИЦЫ СЕКУНД.
CEKH ;ДЕСЯТКИ СЕКУНД.
MCKI ;РЕГИСТРЫ СЧЕТА НА МИНУС. МИЛЛИСЕКУНДЫ ДВОИЧНЫЕ.
MCKLI ;СОТЫЕ СЕКУНД.
MCKHI ;ДЕСЯТЫЕ СЕКУНД.
CEKI ;СЕКУНДЫ ДВОИЧНЫЕ.
CEKLI ;ЕДИНИЦЫ СЕКУНД.
CEKHI ;ДЕСЯТКИ СЕКУНД.
MCKY ;РЕГИСТРЫ УСТАНОВКИ. МИЛЛИСЕКУНДЫ ДВОИЧНЫЕ.
MCKLY ;СОТЫЕ СЕКУНД.
MCKHY ;ДЕСЯТЫЕ СЕКУНД.
CEKY ;СЕКУНДЫ ДВОИЧНЫЕ.
CEKLY ;ЕДИНИЦЫ СЕКУНД.
CEKHY ;ДЕСЯТКИ СЕКУНД.
IN0 ;РЕГИСТРЫ ИНДИКАЦИИ. 0 РАЗРЯД.
IN1 ;1 РАЗРЯД.
IN2 ;2 РАЗРЯД.
IN3 ;3 РАЗРЯД.
TEMP ;ВРЕМЕННЫЙ.
COU ;СЧЕТЧИК ПЕРЕСЧЕТА.
WTEMP ;ВРЕМЕННЫЙ.
STEMP ;ВРЕМЕННЫЙ.
FTEMP ;ВРЕМЕННЫЙ.
SEG ;СЕГМЕНТЫ.
ZPTI ;ЗАПЯТАЯ ИНДИКАЦИИ.
MKC ;:20.
ENDC
;==============================================
; ОПРЕДЕЛЕНИЕ БИТОВ СОСТОЯНИЯ РЕГИСТРОВ ФЛАГОВ.
;==============================================
FLAG EQU 50H ;
; 0-> РЕВЕРСИВНЫЙ СЧЕТ.
; 1-> ПУСК/СТОП.
; 2-> КНОПКИ "УСТАНОВКА".
; 4-> КНОПКИ "РАЗРЯД".
; 6-> РАВЕНСТВА.
; 7-> 1 СЕКУНДЫ.
;=======================================
ZY EQU 4 ;ПОТЕНЦИАЛ.
CUL EQU 0 ;СИЛОВОЙ ВЫХОД.
SBR EQU 1 ;ПУСК/СБРОС.
YCT EQU 5 ;УСТАНОВКА.
PAZ EQU 4 ;РАЗРЯД.
;=======================================
; 1. ПУСК.
;======================
ORG 0
GOTO INIT
ORG 4
GOTO PRER
;======================
; 2. ИНИЦИАЛИЗАЦИЯ.
;======================
INIT
BCF STATUS,RP1 ;
BSF STATUS,RP0 ;ПЕРЕХОДИМ В БАНК 1.
MOVLW B*00000000* ;ПРЕДДЕЛИТЕЛЬ ПЕРЕД ТАЙМЕРОМ,
MOVWF OPTION_REG^80H ;
MOVLW B*11000000* ;РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ ПЕРИФЕРИИ.
MOVWF INTCON ;
MOVLW B*00000000* ;ВСЕ - НА ВЫХОД.
MOVWF TRISA^80H
MOVLW B*00000000* ;ВСЕ - НА ВЫХОД.
MOVWF TRISB^80H
MOVLW B*11111010* ;RC0, RC2 - ВЫХОД, ОСТАЛЬНЫЕ - ВХОДЫ.
MOVWF TRISC^80H
MOVLW B*00000100* ;РАЗРЕШЕНО
MOVWF PIE1^80H ;ПРЕРЫВАНИЕ ОТ МОДУЛЯ ССР1.
CLRF PIE2^80H ;
MOVLW 0x07 ;ВСЕ ВХОДЫ ЦИФРОВЫЕ.
MOVWF ADCON1 ;
BCF STATUS,RP0 ;ПЕРЕХОДИМ В БАНК 0.
CLRF CCP2CON ;ВЫКЛЮЧЕН.
CLRF RCSTA ;USART ВЫКЛЮЧЕН.
CLRF T2CON ;ТАЙМЕР 2 ВЫКЛЮЧЕН.
MOVLW .1 ;1H
MOVWF CCPR1H ;ДЕЛИТЕЛЬ НА 500.
MOVLW .244 ;F4H
MOVWF CCPR1L ;
CLRF ADCON0 ;АЦП ВЫКЛЮЧЕНО.
CLRF T1CON ;ТАЙМЕР 1 ОТКЛЮЧЕН.
BSF T1CON,0 ;ВКЛЮЧЕН.
MOVLW B*00001011* ;
MOVWF CCP1CON ;РЕЖИМ СРАВНЕНИЯ.
MOVLW .254 ;УСТАНАВЛИВАЕМ 0 РАЗРЯД В
MOVWF KATOD ;ПОЗИЦИОННОЕ ЗНАЧЕНИЕ КАТОДА.
CLRF TMR0 ;ВСЕ ОБНУЛЯЕМ И УСТАНАВЛИВАЕМ.
CLRF FLAG
CLRF PORTA
CLRF PORTB
CLRF PORTC
BSF PORTA,ZY ;ВЫКЛЮЧИМ СИГНАЛ.
CLRF MCK
CLRF CEKH
CLRF MCK
CLRF MCKL
CLRF MCKH
CLRF CEK
CLRF CEKL
CLRF CEKHI
CLRF MCKI
CLRF MCKLI
CLRF MCKHI
CLRF ZPTI
CLRF CEKY
CLRF CEKLY
CLRF CEKHY
CLRF MCKY
CLRF MCKLY
CLRF MCKHY
CLRF KATOD2
CALL INDYC
GOTO ZDEM
;========================================
; 3. ВЫБОР РАЗРЯДА ИНДИКАЦИИ.
;========================================
WIND
MOVFW KATOD2 ;
ADDWF PCL,1 ;
GOTO IND0 ;
GOTO IND1 ;
GOTO IND2 ;
GOTO IND3 ;
;=======================================
; 4. ТАБЛИЦА СЕГМЕНТОВ ДЛЯ ОБЩЕГО КАТОДА.
;=======================================
SEGDATA ;7, 6, 5, 4, 3, 2, 1, 0.
ADDWF PCL,F ;H, G, F, E, D, C, B, A.
; КАТОД АНОД
RETLW B*00111111* ; 0 B*11000000*
RETLW B*00000110* ; 1 B*11111001*
RETLW B*01011011* ; 2 B*10100100*
RETLW B*01001111* ; 3 B*10110000*
RETLW B*01100110* ; 4 B*10011001*
RETLW B*01101101* ; 5 B*10010010*
RETLW B*01111101* ; 6 B*10000010*
RETLW B*00000111* ; 7 B*11111000*
RETLW B*01111111* ; 8 B*10000000*
RETLW B*01101111* ; 9 B*10010000*
;=======================================
; 5. ВЫБОР РАЗРЯДА УСТАНОВКИ.
;=======================================
YCTA
BTFSS PORTC,YCT ;
RETURN ;
BCF FLAG,2 ;СБРОС ФЛАГА РЕЖИМА.
MOVFW ZPTI ;
ADDWF PCL,1 ;НАХОДИМ РАЗРЯД УСТАНОВКИ.
GOTO YC0 ;
GOTO YC1 ;
GOTO YC2 ;
GOTO YC3 ;
;========================================================
; 6. ТАБЛИЦЫ ПЕРЕВОДА ДЕСЯТКОВ В ДВОИЧНОЕ ЧИСЛО.
;========================================================
DEBIN
ADDWF PCL,1 ;
RETLW .0
RETLW .10
RETLW .20
RETLW .30
RETLW .40
RETLW .50
RETLW .60
RETLW .70
RETLW .80
RETLW .90
;=======================================
; 7. ПРОВЕРКА КНОПОК.
;=======================================
KHOP
BTFSC FLAG,2 ;ЕСЛИ РАНЕЕ БЫЛА НАЖАТА КНОПКА "УСТАНОВКА",
CALL YCTA ;ТО ИДЕМ НА УСТАНОВКУ РАЗРЯДА.
BTFSS PORTC,YCT ;ЕСЛИ КНОПКА "УСТАНОВКА" НАЖАТА,
BSF FLAG,2 ;ПОСТАВИМ ФЛАГ.
BTFSC FLAG,4 ;ЕСЛИ РАНЕЕ БЫЛА НАЖАТА КНОПКА "РАЗРЯД",
CALL YCTPAZ ;ТО ИДЕМ НА УСТАНОВКУ РАЗРЯДА.
BTFSS PORTC,PAZ ;ЕСЛИ КНОПКА "РАЗРЯД" НАЖАТА,
BSF FLAG,4 ;ПОСТАВИМ ФЛАГ.
RETURN ;
;=================================================
; 8. ВЫБОР РАЗРЯДА УСТАНОВКИ.
;=================================================
YCTPAZ
BTFSS PORTC,PAZ ;
RETURN ;
BCF FLAG,4 ;СБРОСИМ ФЛАГ КНОПКИ.
BCF FLAG,0 ;СБРОСИМ РЕВЕРС.
CALL INDYC ;ЗАПОЛНИМ РЕГИСТРЫ ИНДИКАЦИИ.
INCF ZPTI,1 ;ПРИБАВИМ ЕДИНИЦУ В РАЗРЯД.
MOVLW .4 ;НЕ БОЛЕЕ 3.
SUBWF ZPTI,0 ;
SKPNZ ;ЕСЛИ РАВНО 4,
BSF FLAG,0 ;ТО ВКЛЮЧИМ ФЛАГ РЕВЕРСИВНОГО СЧЕТА.
MOVLW .5 ;НЕ БОЛЕЕ 4.
SUBWF ZPTI,0 ;
SKPC ;
RETURN ;
CLRF ZPTI ;ИНАЧЕ ОБНУЛИМ.
RETURN ;
;=======================================
; 9. УСТАНОВКА.
;=======================================
YC0
INCF MCKLY,1 ;УВЕЛИЧИМ ЕДИНИЦЫ МИНУТ.
MOVLW .10 ;НЕ БОЛЕЕ 9.
SUBWF MCKLY,0 ;
SKPNC ;ЕСЛИ БОЛЬШЕ ИЛИ РАВНО 10,
CLRF MCKLY ;ТО ОБНУЛИМ.
MOVFW MCKHY ;ПЕРЕКОДИРУЕМ В ДВОИЧНЫЙ
MOVWF MCKHI ;
CALL DEBIN ;КОД ДЕСЯТКИ.
ADDWF MCKLY,0 ;ПРИБАВИМ ЕДИНИЦЫ И
MOVWF MCKY ;ЗАПИШЕМ В ДВОИЧНОМ КОДЕ.
GOTO INDYC ;ИЗМЕНИМ РЕГИСТРЫ ИНДИКАЦИИ.
YC1
INCF MCKHY,1 ;УВЕЛИЧИМ ДЕСЯТКИ МИНУТ.
MOVLW .10 ;НЕ БОЛЕЕ 9.
SUBWF MCKHY,0 ;
SKPNC ;ЕСЛИ БОЛЬШЕ ИЛИ РАВНО 10,
CLRF MCKHY ;ТО ОБНУЛИМ.
MOVFW MCKHY ;ПЕРЕКОДИРУЕМ В ДВОИЧНЫЙ
CALL DEBIN ;КОД ДЕСЯТКИ.
ADDWF MCKLY,0 ;ПРИБАВИМ ЕДИНИЦЫ И
MOVWF MCKY ;ЗАПИШЕМ В ДВОИЧНОМ КОДЕ.
GOTO INDYC ;ИЗМЕНИМ РЕГИСТРЫ ИНДИКАЦИИ.
YC2
INCF CEKLY,1 ;УВЕЛИЧИМ ЕДИНИЦЫ СЕКУНД.
MOVLW .10 ;НЕ БОЛЕЕ 9.
SUBWF CEKLY,0 ;
SKPNC ;
CLRF CEKLY ;ЕСЛИ БОЛЬШЕ, ТО ОБНУЛИМ.
MOVFW CEKHY ;ПЕРЕКОДИРУЕМ В ДВОИЧНЫЙ
CALL DEBIN ;КОД ДЕСЯТКИ.
ADDWF CEKLY,0 ;ПРИБАВИМ ЕДИНИЦЫ И
MOVWF CEKY ;ЗАПИШЕМ В ДВОИЧНОМ КОДЕ.
GOTO INDYC ;ИЗМЕНИМ РЕГИСТРЫ ИНДИКАЦИИ.
YC3
INCF CEKHY,1 ;УВЕЛИЧИМ ДЕСЯТКИ СЕКУНД.
MOVLW .10 ;НЕ БОЛЕЕ 9.
SUBWF CEKHY,0 ;
SKPNC ;ЕСЛИ БОЛЬШЕ ИЛИ РАВНО 10,
CLRF CEKHY ;ТО ОБНУЛИМ.
MOVFW CEKHY ;ПЕРЕКОДИРУЕМ В ДВОИЧНЫЙ
CALL DEBIN ;КОД ДЕСЯТКИ.
ADDWF CEKLY,0 ;ПРИБАВИМ ЕДИНИЦЫ И
MOVWF CEKY ;ЗАПИШЕМ В ДВОИЧНОМ КОДЕ.
;=======================================
; 10. ЗАПИСЬ В РЕГИСТРЫ ИНДИКАЦИИ.
;=======================================
INDYC
MOVFW MCKLY ;ПЕРЕПИСЫВАЕМ ВСЕ РЕГИСТРЫ УСТАНОВКИ
MOVWF IN0 ;В РЕГИСТРЫ ИНДИКАЦИИ
MOVWF MCKLI ;И РЕГИСТРЫ РЕВЕРСИВНОГО СЧЕТА.
MOVFW MCKHY ;
MOVWF IN1 ;
MOVWF MCKHI ;
MOVFW MCKY ;
MOVWF MCKI ;
MOVFW CEKLY ;
MOVWF IN2 ;
MOVWF CEKLI ;
MOVFW CEKHY ;
MOVWF IN3 ;
MOVWF CEKHI ;
MOVFW CEKY ;
MOVWF CEKI ;
CLRF CEK ;ОБНУЛЯЕМ РЕГИСТРЫ
CLRF CEKL ;ПРЯМОГО СЧЕТА.
CLRF CEKH ;
CLRF MCK ;
CLRF MCKL ;
CLRF MCKH ;
RETURN ;
INS2
MOVFW MCKLI ;РЕГИСТРЫ ОБРАТНОГО СЧЕТА ПЕРЕПИШЕМ
MOVWF IN0 ;В РЕГИСТРЫ ИНДИКАЦИИ.
MOVFW MCKHI ;
MOVWF IN1 ;
MOVFW CEKLI ;
MOVWF IN2 ;
MOVFW CEKHI ;
MOVWF IN3 ;
RETURN ;
INS1
MOVFW MCKL ;РЕГИСТРЫ ПРЯМОГО СЧЕТА ПЕРЕПИШЕМ
MOVWF IN0 ;В РЕГИСТРЫ ИНДИКАЦИИ.
MOVFW MCKH ;
MOVWF IN1 ;
MOVFW CEKL ;
MOVWF IN2 ;
MOVFW CEKH ;
MOVWF IN3 ;
GOTO CPABH ;СРАВНИМ С РЕГИСТРАМИ УСТАНОВКИ.
;=======================================
; 11. ПЕРЕКОДИРОВКА ИЗ 2-ГО В 2_10.
;=======================================
BIDE ;ПЕРЕКОДИРОВКА ДЕСЯТКОВ
CLRF COU ;ОБНУЛЯЕМ СЧЕТЧИК.
ADDLW -.10 ;ВЫЧТЕМ 10.
BTFSS STATUS,0 ;ЕСЛИ ЕСТЬ ПЕРЕХОД ЧЕРЕЗ НОЛЬ,
GOTO $+4 ;ТО ЗАВЕРШАЕМ ПЕРЕКОДИРОВКУ.
MOVWF TEMP ;ИНАЧЕ ПЕРЕПИШЕМ НОВОЕ ЗНАЧЕНИЕ ВО ВРЕМЕННЫЙ.
INCF COU,1 ;УВЕЛИЧИМ СЧЕТЧИК.
GOTO $-5 ;ПОВТОРИМ ВЫЧИТАНИЕ.
MOVFW COU ;ЗНАЧЕНИЕ СЧЕТЧИКА (РАВНО ЧИСЛУ ДЕСЯТКОВ) ПЕРЕПИШЕМ В РАБОЧИЙ РЕГИСТР.
RETURN ;ВЕРНЕМСЯ.
;===================================================================
; 12. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ.
;===================================================================
PRER
MOVWF WTEMP ;СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W И
MOVFW STATUS ;STATUS,
MOVWF STEMP ;
MOVFW FSR ;FSR.
MOVWF FTEMP ;
INCF MKC,1 ;ПРИБАВИМ 1 В РЕГИСТР МИЛЛИСЕКУНД.
MOVFW MKC ;
ADDLW -.200 ;СЧИТАЕМ ДО 200.
BTFSS STATUS,2 ;ЕСЛИ НЕ РАВНО,
GOTO $+.7 ;ПРОПУСТИМ ПОДСЧЕТ.
CLRF MKC ;В ПРОТИВНОМ СЛУЧАЕ ОБНУЛИМ.
BSF FLAG,7 ;ВКЛЮЧИМ ФЛАГ 1 СЕКУНДЫ.
BTFSC FLAG,6 ;ЕСЛИ РАВЕНСТВО,
GOTO $+.3 ;ТО ВРЕМЯ НЕ СЧИТАЕМ.
CALL S1 ;ПРЯМОЙ СЧЕТ.
CALL S2 ;ОБРАТНЫЙ СЧЕТ.
CALL IND ;ПРОИНДИЦИРУЕМ.
REPER ;ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ.
MOVFW STEMP ;ВОССТАНОВЛЕНИЕ РЕГИСТРОВ:
MOVWF STATUS ;STATUS,
MOVFW FTEMP ;
MOVWF FSR ;FSR,
MOVFW WTEMP ;W.
BCF PIR1,2 ;СБРАСЫВАЕМ ФЛАГ ПРЕРЫВАНИЯ ОТ CCP1.
RETFIE ;ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ.
;=============================================
; 13. ПРЯМОЙ СЧЕТ.
;=============================================
S1
BTFSS FLAG,1 ;ЕСЛИ НЕ ВКЛЮЧЕН ПУСК,
RETURN ;ТО НЕТ СЧЕТА.
MOVFW MCK ;ЗАГРУЗКА ЗНАЧЕНИЙ MCK В РАБ. РЕГИСТР.
ADDLW -63H ;ВЫЧЕСТЬ ИЗ РЕГИСТРА 99.
BZ M1 ;СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА M1,
INCF MCK,1 ;ИНАЧЕ ПРИБАВИТЬ 1 В РЕГИСТР.
MOVFW MCK ;ПЕРЕКОДИРУЕМ ТЕКУЩЕЕ ЗНАЧЕНИЕ
MOVWF TEMP ;ИЗ 2-ГО В 2_10-Е.
CALL BIDE ;ТОЛЬКО ДО 99!
MOVWF MCKH ;ПЕРЕПИШЕМ ДЕСЯТЫЕ СЕКУНД.
MOVFW TEMP ;
MOVWF MCKL ;ПЕРЕПИШЕМ СОТЫЕ СЕКУНД.
RETURN ;
M1
CLRF MCK ;ОБНУЛЕНИЕ РЕГИСТРА СЕКУНД.
CLRF MCKL ;ОБНУЛИМ ЕДИНИЦЫ СЕКУНД.
CLRF MCKH ;ДЕСЯТКИ СЕКУНД.
MOVFW CEK ;ЗАГРУЗКА В РАБ. РЕГИСТР.
ADDLW -63H ;-99.
BZ H1 ;СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА H1.
INCF CEK,1 ;ПРИБАВИТЬ 1.
MOVFW CEK ;ПЕРЕКОДИРУЕМ ТЕКУЩЕЕ ЗНАЧЕНИЕ
MOVWF TEMP ;ИЗ 2-ГО В 2_10-Е.
CALL BIDE ;ТОЛЬКО ДО 99!
MOVWF CEKH ;ПЕРЕПИШЕМ ДЕСЯТКИ.
MOVFW TEMP ;
MOVWF CEKL ;ПЕРЕПИШЕМ ЕДИНИЦЫ.
RETURN ;
H1
BSF FLAG,6 ;ВКЛЮЧИМ ФЛАГ РАВЕНСТВА.
GOTO INS1 ;ЗАПОЛНИМ РЕГИСТРЫ ИНДИКАЦИИ.
;=============================
; 14. ОБРАТНЫЙ СЧЕТ.
;=============================
S2
BTFSS FLAG,1 ;ЕСЛИ НЕ ВКЛЮЧЕН ПУСК,
RETURN ;ТО НЕТ СЧЕТА.
TSTF MCKI ;ЕСЛИ МИЛЛИСЕКУНДЫ РАВНЫ НУЛЮ,
BZ M2 ;ПРОВЕРИМ СЕКУНДЫ.
DECF MCKI,1 ;ИНАЧЕ ПРИБАВИМ 1 В РЕГИСТР МИЛЛИСЕКУНД.
MOVFW MCKI ;ПЕРЕКОДИРУЕМ ТЕКУЩЕЕ ЗНАЧЕНИЕ
MOVWF TEMP ;ИЗ 2-ГО В 2_10-Е.
CALL BIDE ;ТОЛЬКО ДО 99!
MOVWF MCKHI ;ПЕРЕПИШЕМ ДЕСЯТКИ.
MOVFW TEMP ;
MOVWF MCKLI ;ПЕРЕПИШЕМ ЕДИНИЦЫ.
RETURN ;
M2
TSTF CEKI ;ЕСЛИ СЕКУНДЫ РАВНЫ НУЛЮ,
BZ H2 ;ВКЛЮЧИМ СИГНАЛ.
MOVLW .99 ;УСТАНОВИМ
MOVWF MCKI ;РЕГИСТР ДВОИЧНЫХ МИЛЛИСЕКУНД.
MOVLW .9 ;УСТАНОВИМ
MOVWF MCKLI ;РЕГИСТР ЕДИНИЦ МИЛЛИСЕКУНД.
MOVWF MCKHI ;РЕГИСТР ДЕСЯТКОВ МИЛЛИСЕКУНД.
DECF CEKI,1 ;ВЫЧТЕМ 1 ИЗ СЕКУНД.
MOVFW CEKI ;ПЕРЕКОДИРУЕМ ТЕКУЩЕЕ ЗНАЧЕНИЕ
MOVWF TEMP ;ИЗ 2-ГО В 2_10-Е.
CALL BIDE ;ТОЛЬКО ДО 99!
MOVWF CEKHI ;ПЕРЕПИШЕМ ДЕСЯТКИ.
MOVFW TEMP ;
MOVWF CEKLI ;ПЕРЕПИШЕМ ЕДИНИЦЫ.
RETURN ;
H2
BSF FLAG,6 ;ВКЛЮЧИМ ФЛАГ РАВЕНСТВА.
BCF PORTA,ZY ;ВКЛЮЧИМ СИГНАЛ.
BCF PORTC,CUL ;ВЫКЛЮЧИМ НАГРУЗКУ.
GOTO INDYC ;ВОССТАНОВИМ РЕГИСТРЫ ИНДИКАЦИИ.
;==============================
; 15. ИНДИКАЦИЯ.
;==============================
IND
BTFSS FLAG,1 ;ЕСЛИ ИДЕТ УСТАНОВКА,
GOTO $+5 ;ТО ПРОПУСКАЕМ ВЫБОР ИНДИКАЦИИ.
BTFSS FLAG,0 ;ЕСЛИ ФЛАГ СБРОШЕН,
CALL INS1 ;ТО ИНДИКАЦИЯ ПРЯМОГО СЧЕТА.
BTFSC FLAG,0 ;ЕСЛИ ФЛАГ ВКЛЮЧЕН,
CALL INS2 ;ТО ИНДИКАЦИЯ ОБРАТНОГО СЧЕТА.
MOVFW KATOD2 ;ДВОИЧНОЕ ЗНАЧЕНИЕ КАТОДА
ADDLW -4 ;СЧИТАЕМ ДО 3.
BTFSS STATUS,2 ;ПРИ РАВЕТСТВЕ, УСТАНОВИМ 0 РАЗРЯД.
GOTO WIND ;ВЫБЕРЕМ РАЗРЯД ИНДИКАЦИИ.
MOVLW .254 ;УСТАНАВЛИВАЕМ НУЛЕВОЙ РАЗРЯД В
MOVWF KATOD ;ПОЗИЦИОННОЕ ЗНАЧЕНИЕ КАТОДА.
CLRF KATOD2 ;ОБНУЛИМ ДВОИЧНОЕ ЗНАЧЕНИЕ КАТОДА.
IND0
MOVFW IN0 ;ЗАГРУЖАЕМ РЕГИСТР ИНДИКАЦИИ.
GOTO INDZ ;ПРОИНДИЦИРУЕМ.
IND1
MOVFW IN1 ;ВСЕ ОСТАЛЬНЫЕ РАЗРЯДЫ-
GOTO INDZ ;АНАЛОГИЧНО НУЛЕВОМУ.
IND2
MOVFW IN2 ;
GOTO INDZ ;
IND3
MOVFW IN3 ;
INDZ
CALL SEGDATA ;ОПРЕДЕЛИМ СЕМИСЕГМЕНТНОЕ ЗНАЧЕНИЕ.
MOVWF SEG ;ЗАПИШЕМ ЕГО В РЕГИСТР.
BTFSS PORTA,ZY ;ВВЕДЕМ ЗНАЧЕНИЕ БУДИЛЬНИКА В КАТОД.
BCF KATOD,ZY ;УСТАНОВИМ БИТ В НОЛЬ.
BTFSC PORTA,ZY ;ЕСЛИ ЗНАЧЕНИЕ ЕДИНИЧНОЕ,
BSF KATOD,ZY ;ТО УСТАНОВИМ В ЕДИНИЦУ.
MOVFW ZPTI ;СРАВНИМ РАЗРЯД ЗАПЯТОЙ
SUBWF KATOD2,0 ;С РАЗРЯДОМ ИНДИКАЦИИ.
SKPNZ ;ЕСЛИ ОНИ НЕ СОВПАДАЮТ, ТО ПРОПУСТИМ УСТАНОВКУ.
BSF SEG,7 ;ВКЛЮЧИМ СЕГМЕНТ ЗАПЯТОЙ.
MOVFW SEG ;ПЕРЕПИШЕМ ЗНАЧЕНИЕ
MOVWF PORTB ;В ПОРТ B.
MOVFW KATOD ;ВКЛЮЧИМ РАЗРЯД.
MOVWF PORTA ;В ПОРТ A.
BSF STATUS,0 ;НУЛЕВОЙ БИТ =1, ЧТОБЫ В КАТОД ЗАПИСАЛАСЬ 1.
RLF KATOD,1 ;СДВИНЕМ НОЛЬ НА РАЗРЯД ВЛЕВО.
INCF KATOD2,1 ;УВЕЛИЧИМ ДВОИЧНОЕ ЗНАЧЕНИЕ КАТОДА.
RETURN ;ВЕРНЕМСЯ.
;====================================
; 16. СРАВНЕНИЕ.
;====================================
CPABH
MOVFW MCKY ;СРАВНИМ МИЛЛИСЕКУНДЫ.
SUBWF MCK,0 ;
SKPZ ;ЕСЛИ НЕРАВЕНСТВО,
GOTO HEPABHO ;ВЫКЛЮЧИМ СИГНАЛ.
MOVFW CEKY ;СРАВНИМ СЕКУНДЫ.
SUBWF CEK,0 ;
SKPZ ;ЕСЛИ НЕРАВЕНСТВО,
GOTO HEPABHO ;ВЫКЛЮЧИМ СИГНАЛ.
BSF FLAG,6 ;ИНАЧЕ - ВКЛЮЧИМ ФЛАГ РАВЕНСТВА.
BCF PORTA,ZY ;ВКЛЮЧИМ СИГНАЛ.
BCF PORTC,CUL ;ВЫКЛЮЧИМ НАГРУЗКУ.
RETURN ;
HEPABHO
BCF FLAG,6 ;НЕТ РАВЕНСТВА.
BSF PORTA,ZY ;ВЫКЛЮЧИМ СИГНАЛ.
BSF PORTC,CUL ;ВКЛЮЧИМ НАГРУЗКУ.
RETURN ;
;===================================
; 17. ОЖИДАНИЕ ПРЕРЫВАНИЯ.
;===================================
ZDEM
BTFSS FLAG,7 ;ЕСЛИ 1 C. ПРОШЛА,
GOTO $+3 ;
CALL KHOP ;ПРОВЕРИМ КНОПКИ.
BCF FLAG,7 ;СБРОСИМ ФЛАГ 1 С.
BTFSC PORTC,SBR ;ЕСЛИ КНОПКА "ПУСК" НАЖАТА,
GOTO $+8 ;ТО КНОПКИ НЕ ПРОВЕРЯЕМ.
BSF FLAG,1 ;ВКЛЮЧИМ ФЛАГ ПУСКА.
MOVLW 1 ;ЗАПЯТУЮ В 1 РАЗРЯД.
MOVWF ZPTI ;
BSF PORTC,CUL ;ВКЛЮЧИМ НАГРУЗКУ.
BCF FLAG,6 ;СБРОСИМ ФЛАГ РАВЕНСТВА.
CLRF MKC ;
CALL INDYC ;ЗАПИШЕМ В РЕГИСТРЫ ИНДИКАЦИИ.
BTFSS FLAG,1 ;ЕСЛИ ВКЛЮЧЕН ПУСК, ТО ПРОПУСТИМ.
GOTO ZDEM ;ПОВТОРИМ.
BTFSC FLAG,6 ;ЕСТЬ РАВЕНСТВО?
GOTO $+3 ;ДА, ИДЕМ НА ПАУЗУ.
BTFSC PORTC,SBR ;ЕСЛИ КНОПКА НЕ НАЖАТА,
GOTO $-3 ;ЖДЕМ НАЖАТИЯ.
CALL PAUZ ;ПАУЗА ДЛЯ УСТРАНЕНИЯ ДРЕБЕЗГА.
BTFSS PORTC,SBR ;ЖДЕМ ОТПУСКАНИЯ КНОПКИ.
GOTO $-4 ;
BTFSC PORTC,YCT ;ЕСЛИ КНОПКА НЕ НАЖАТА,
GOTO $+9 ;ПРОПУСТИМ СМЕНУ ИНДИКАЦИИ.
CALL PAUZ ;
BTFSS PORTC,YCT ;ЖДЕМ ОТПУСКАНИЯ КНОПКИ.
GOTO $-2 ;
BTFSC FLAG,0 ;СМЕНИМ ИНДИКАЦИЮ НА ПРОТИВОПОЛОЖНУЮ.
GOTO $+3 ;
BSF FLAG,0 ;ИНДИКАЦИЯ РЕВЕРСИВНОГО СЧЕТА.
GOTO $+2 ;
BCF FLAG,0 ;ИНДИКАЦИЯ ПРЯМОГО СЧЕТА.
BTFSC PORTC,SBR ;ЕСЛИ НЕТ СТОПА,
GOTO $-.11 ;ПРОВЕРИМ КНОПКУ СМЕНЫ ИНДИКАЦИИ.
CALL PAUZ ;
BTFSS PORTC,SBR ;ЖДЕМ ОТПУСКАНИЯ КНОПКИ.
GOTO $-4 ;
BCF FLAG,1 ;СБРОС РАБОТЫ.
BCF FLAG,6 ;ВЫКЛЮЧИМ РАВЕНСТВО.
BSF PORTA,ZY ;ВЫКЛЮЧИМ СИГНАЛ.
CLRF ZPTI ;ЗАПЯТАЯ В НУЛЕВОЙ РАЗРЯД.
BCF PORTC,CUL ;ВЫКЛЮЧИМ НАГРУЗКУ.
GOTO ZDEM ;ЖДЕМ ДАЛЬНЕЙШИХ ДЕЙСТВИЙ.
PAUZ
MOVLW .255 ;МОЖНО ПОДБИРАТЬ ЗНАЧЕНИЕ ПАУЗЫ.
ADDLW -1 ;ПАУЗА = ЧИСЛО Х 4 МКС.
BTFSS STATUS,2 ;
GOTO $-2 ;ПОВТОРИМ.
RETURN ;
;========================================
END
;========================================
[свернуть]
Социальные закладки