Помогите чайнику с таймером на PIC16F84a
Добавлено: Пт апр 23, 2010 08:38:28
Собрал я таймер на мк , работает замечательно. Но вот беда диапозон времени не тот что нужен.
В данном таймере диапазон от 0-90 мин а мне нужно от 1- 12 часов. Как это сделать? Какие изменения нужно внести в программу?
Прошу вашей помощи.
__CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC
;
;********************** Константы*******************************
;
M_O_INIT EQU 0xC3 ;b'11000011',Загрузка OPTION. Коэфф. дел.=16
M_TA_INIT EQU 0x08 ;b'00001000',Управление портом А-TRISA
M_TB_INIT EQU 0x00 ;b'00000000',Управление портом В-TRISB
M_I_INIT EQU 0xA0 ;b'10100000',Загрузка INTCON
M_FLAG_INIT EQU 0xFF ;b'11111111',Загрузка регистра флагов
X_Pause EQU 0xFE ;Данные для счетчика X
Y_Pause EQU 0xFE ;Данные для счетчика Y
Z_Pause EQU 0x05 ;Данные для счетчика Z
Del_Range EQU 0x82 ;Константа задержки
Cycle_1 EQU 0xA0 ;Частота зв. сигнала (1024 Гц)
Cycle_2 EQU 0x02 ;Скважность имп. зв. сигнала (2)
Cycle_3 EQU 0xFF ;Длительность зв. сигнала (500ms)
Cycle_4 EQU 0x06 ;Время звучания (6s)
;
;******************** Описание портов **********************************
;
Ind_0 EQU 0x00 ;Вывод RA0, мл.разряд индикатора (1-вкл.), Out
Ind_1 EQU 0x01 ;Вывод RA1, ст.разряд индикатора (1-вкл.) Out
C1_Rel EQU 0x02 ;Вывод RA2, Зарядка\разрядка конденсатора (In/Out)
TMR_On EQU 0x03 ;Вывод RA3, Пуск/Сброс таймера (0), In
TMR_Run EQU 0x04 ;Вывод RA4, Выход зв. сигнала, Out
Led_On EQU 0x07 ;Вывод RB7, Индикатор работы таймера (1), Out
;
;********************** Описание регистра Флагов *************************
;
Phase EQU 0x07 ;Режим работы: 0-таймер вкл., 1-установка
;
;************************** Переменные ************************************
;
Delay_Reg_1 EQU 0x0C ;Рабочие регистры подпрограмм
Delay_Reg_2 EQU 0x0D ; задержки
Flags EQU 0x0E ;Хранение регисра флагов
W_copy EQU 0x0F ;Временное хранение w
FSR_copy EQU 0x10 ;Временное хранение FSR
STATUS_copy EQU 0x11 ;Временное хранение STATUS
X_Count EQU 0x12 ;Cчетчик задержки X
Y_Count EQU 0x13 ;Cчетчик задержки Y
Z_Count EQU 0x14 ;Cчетчик задержки Z
R_Bits EQU 0x15 ;Время (мин.), соотв. сопротивлению R1
N EQU 0x16 ;Рабочая ячейка подпр. One_Shot
Digit_0 EQU 0x17 ;Мл.байт величины выдержки времени
Digit_1 EQU 0x18 ;Ст.байт величины выдержки времени
Int_Count_Low EQU 0x19 ;Мл.байт счетчика прерываний
Int_Count_High EQU 0x1A ;Ст.байт счетчика прерываний
Ind_Nom EQU 0x1B ;Хранение № индикатора
Cell_1 EQU 0x1C ;Рабочие регистры подпрограммы
Cell_2 EQU 0x1D ; генерации зв. сигнала
Cell_3 EQU 0x1E
Cell_4 EQU 0x1F
;
;***************** Основной код*******************************
;
ORG 0 ;Программа начинается с метки 'Main'
goto Main
ORG 4 ;Вектор прерывания
goto Int_Prog
;
;**************** Начальная инициализация *******************
;
Main
clrf PORTA ;Очистить выходные защелки порта А
clrf PORTB ; и порта В
clrf TMR0 ;Очистить таймер
bsf STATUS,RP0 ;Открыть доступ к банку 1
movlw M_O_INIT ;Загрузить исходные
movwf OPTION_REG^80H ; данные в OPTION_REG
movlw M_TA_INIT ;Настроить порт А
movwf TRISA^80H ;
movlw M_TB_INIT ;Настроить порт В
movwf TRISB^80H ;
bcf STATUS,RP0 ;Включить банк 0
movlw M_I_INIT ;Загрузить исходные
movwf INTCON ; данные в INTCON
movlw M_FLAG_INIT ;Загрузить исходные
movwf Flags ; данные в ячейку Flags
clrf R_Bits ;Очистить R_Bits
Test
bcf INTCON,7 ;Запрет прерываний
movlw b'10000000' ;Вывод на LSB(HG1) индикатор цифры 8
movwf PORTB
bsf PORTA,0
call Delay_1s ;Пауза 1сек
bsf PORTA,1 ;Вывод на MSB индикатор(HG2) цифры 8
call Delay_1s ;Пауза 1сек
clrf PORTA ;Порты в исходное состояние
clrf PORTB
clrf N ;Обнулить N
bsf PORTA,TMR_Run
First_Pass
call One_Shot ;Пробное измерение, зарядка конденсатора
call Delay_100ms ;Задержка 0,1сек
;
;****************** Установка времени выдержки таймера**********************
;
Get_Time
bsf Flags,Phase ;Признак режима установки
bcf INTCON,7 ;Запрет прерываний
call One_Shot ;Подсчет числа 'N' импульсов разрядки
movlw 0x03 ;Запись ст. байта адреса таблицы
movwf PCLATH ; преобразования в PCLATH
movf N,w
call Convert ;Таблица преобразования
movwf R_Bits ;Хранение результата преобразования
clrf PCLATH ;PCLATH в исходное состояние
call Bin_to_BCD ;Перекодирование в BCD код
bsf INTCON,7 ;Разрешить прерывания
;
;****************** Проверка состояния кнопки SB1 **************************
;
Check_SB1
btfsc PORTA,TMR_On ;Пока кнопка не нажата-
goto Get_Time ; таймер в режиме установки
call Delay_100ms
bcf Flags,Phase ;Установить признак работы таймера на счет
call Delay_1s ;Задержка, необходимая для отпускания SB1
;
;******************** Таймер включен ***************************************
;
Timer_On
clrf Int_Count_Low ;Обнулить счетчики прерываний
clrf Int_Count_High
Time_Count
bsf PORTA,TMR_Run ;Транзистор VT1 закрыт
btfss PORTA,TMR_On ;Сброс таймера при повторном нажатии
goto Reset_TMR ; на SB1
movfw Int_Count_High ;Сравнение счетчика прерываний с 15000
xorlw 0x3A ; (3A98hex),что соответствует 1мин.
btfss STATUS,Z
goto Time_Count
movfw Int_Count_Low
sublw 0x97
btfsc STATUS,C
goto Time_Count ;Если 1мин не закончилась-продолжить счет
decf R_Bits,f ;R_Bits=R_Bits-1. Если установленное
btfsc STATUS,Z ; время закончилось (R_Bits=0), установить
bsf Flags,Phase ; признак окончания работы таймера
call Bin_to_BCD ;Преобразование R_Bits в BCD-код
btfss Flags,Phase ;Если таймер в режиме счета-
goto Timer_On ; идти на продолжение счета времени
;
;************************** Таймер остановлен ****************************
;
Timer_Stop
call Delay_1s
call Beep
bsf PORTA,TMR_Run ;Транзистор VT1 закрыт
Reset_TMR
call Delay_1s
clrf R_Bits ;Обнулить счетчик времени
clrf Int_Count_Low ; и прерываний
clrf Int_Count_High
bsf Flags,Phase ;Флаг режима установки=1
call Delay_100ms
goto Get_Time ;Идти на установку
;
;******** Подпрограмма преобразования двоичного кода в BCD-код *********
; Двоичный код в регистре R_Bits, после преобразования в Digit_0
; - единицы, в Digit_1 - десятки.
Bin_to_BCD
clrf Digit_1
movfw R_Bits
movwf Digit_0
G_Tens
movlw d'10'
subwf Digit_0,w
btfss STATUS,C
goto Over
movwf Digit_0
incf Digit_1,f
goto G_Tens
Over
movf Digit_1,w ;Гашение незначащих нулей
andlw b'00001111'
btfss STATUS,Z
goto Finish
movlw b'00010000' ;d'16'-указатель на 16 строку
movwf Digit_1 ; таблицы (пустое место)
Finish
return
;
;****** Подпрограмма преобразования для 7-ми сегментного индикатора ********
; "0" - соответствует горящему сегменту, т. к. индикатор с общим анодом
Table
addwf PCL,f
retlw b'11000000' ;Цифра "0"
retlw b'11111001' ;Цифра "1"
retlw b'10100100' ;Цифра "2"
retlw b'10110000' ;Цифра "3"
retlw b'10011001' ;Цифра "4"
retlw b'10010010' ;Цифра "5"
retlw b'10000010' ;Цифра "6"
retlw b'11111000' ;Цифра "7"
retlw b'10000000' ;Цифра "8"
retlw b'10010000' ;Цифра "9"
retlw b'10001000' ;Цифра "А"
retlw b'10000011' ;Цифра "B"
retlw b'11000110' ;Цифра "C"
retlw b'10100001' ;Цифра "D"
retlw b'10000110' ;Цифра "E"
retlw b'10001110' ;Цифра "F"
retlw b'11111111' ;Пустое место (код 10h)
;
;********************* Обработка прерывания от TMR0 ***********************
;
Int_Prog
movwf W_copy ;Сохранение регистров
movf STATUS,w
movwf STATUS_copy
movf FSR,w
movwf FSR_copy
bcf INTCON,T0IF ;Сбросить флаг прерывания
movlw 0x06 ; Настраиваем таймер
movwf TMR0
btfsc Flags,Phase ;Проверка текущего режима:
goto Clear ;Если установка-обнулить счетчики
movfw Int_Count_Low ; Прибавляем LSB счетчик прерываний
xorlw H'FF' ;Если переполнен-перенос в ст. разряд
BZ Add_H ;
incf Int_Count_Low,f
goto Indicate ;Индикация
Add_H
incf Int_Count_High,f ;Прибавляем MSB счетчик прерываний
clrf Int_Count_Low
movfw Int_Count_High
xorlw H'FF' ;Если переполнен-обнулить счетчики
BZ Clear
goto Indicate ;Индикация
Clear
clrf Int_Count_Low
clrf Int_Count_High
Indicate
bcf PORTA,Ind_0 ;Гашение индикаторов
bcf PORTA,Ind_1
incf Ind_Nom,f ;Выбор индикатора (чет\нечет)
btfss Ind_Nom,0 ; если чет-индикация мл.байта
goto LSB_Ind ; если нечет-старшего
goto MSB_Ind
MSB_Ind
movf Digit_1,w ;Загрузить MSB в w
call Table ;Преобразование в 7-сегм. код
andwf Flags,w ;Установить бит 7 порта В
movwf PORTB ; и вывод
bsf PORTA,Ind_1 ;Включить индикатор
goto End_Int
LSB_Ind
movf Digit_0,w ;Загрузить MSB в w
call Table ;Преобразование в 7-сегм. код
andwf Flags,w ;Установить бит 7 порта В
movwf PORTB ; и вывод
bsf PORTA,Ind_0 ;Включить индикатор
End_Int
movf FSR_copy,w ;Восстановление регистров
movwf FSR
movf STATUS_copy,w
movwf STATUS
swapf W_copy,f
swapf W_copy,w
retfie
;
;****************** Подпрограмма "One Shot" ********************************
;
One_Shot
clrf N
bsf STATUS,RP0
bsf TRISA,2
bcf STATUS,RP0
Tst
btfss PORTA,C1_Rel
goto Ready
incfsz N,f
goto Tst
Ready
decf N,f
movf N,w
xorlw 0xFF
btfsc STATUS,Z
clrf N
bsf STATUS,RP0
bcf TRISA,2
bcf STATUS,RP0
bsf PORTA,C1_Rel
return
;
;************************** Подпрограмма задержки на 1s *****************
;
Delay_1s
movlw Z_Pause
movwf Z_Count
Z_Loop
movlw Y_Pause
movwf Y_Count
Y_Loop movlw X_Pause
movwf X_Count
X_Loop decfsz X_Count,f
goto X_Loop
decfsz Y_Count,f
goto Y_Loop
decfsz Z_Count,f
goto Z_Loop
return
;
;**************Подпрограмма задержки на 100 мс***************************
;
Delay_100ms
movlw Del_Range
movwf Delay_Reg_1
movlw h'FF'
movwf Delay_Reg_2
Loop
decfsz Delay_Reg_2,f
goto Loop
decfsz Delay_Reg_1,f
goto Loop
return
;
;********* Подпрограмма подачи звукового сигнала на RA4 ******************
;
Beep
bcf INTCON,7
movlw Cycle_4
movwf Cell_4
Beep_500
movlw Cycle_3
movwf Cell_3
Double
movlw Cycle_2
movwf Cell_2
H_Level
bsf PORTA,4
movlw Cycle_1
movwf Cell_1
Ring_1
decfsz Cell_1,f
goto Ring_1
L_Level
bcf PORTA,4
movlw Cycle_1
movwf Cell_1
Ring_2
decfsz Cell_1,f
goto Ring_2
decfsz Cell_2,f
goto H_Level
decfsz Cell_3,f
goto Double
goto Del_500
Del_500
movlw Cycle_3
movwf Cell_3
Doub
movlw Cycle_2
movwf Cell_2
H_Lev
bcf PORTA,4
movlw Cycle_1
movwf Cell_1
Rin_1
decfsz Cell_1,f
goto Rin_1
L_Lev
bcf PORTA,4
movlw Cycle_1
movwf Cell_1
Rin_2
decfsz Cell_1,f
goto Rin_2
decfsz Cell_2,f
goto H_Lev
decfsz Cell_3,f
goto Doub
decfsz Cell_4,f
goto Beep_500
bsf INTCON,7
return
;
;**** Подпрограмма табличной конвертации значения N *********
; в длительность выдержки времени (мин.)
ORG 0x300
Convert
addwf PCL,f
retlw .1
retlw .1
retlw .2
retlw .2
retlw .3
retlw .3
retlw .4
retlw .4
retlw .5
retlw .5
retlw .6
retlw .6
retlw .7
retlw .7
retlw .8
retlw .8
retlw .9
retlw .9
retlw .10
retlw .10
retlw .11
retlw .11
retlw .12
retlw .12
retlw .13
retlw .13
retlw .14
retlw .14
retlw .15
retlw .15
retlw .16
retlw .16
retlw .17
retlw .17
retlw .18
retlw .18
retlw .19
retlw .19
retlw .20
retlw .20
retlw .21
retlw .21
retlw .22
retlw .22
retlw .23
retlw .23
retlw .24
retlw .24
retlw .25
retlw .25
retlw .26
retlw .26
retlw .27
retlw .27
retlw .28
retlw .28
retlw .29
retlw .29
retlw .30
retlw .30
retlw .31
retlw .31
retlw .32
retlw .32
retlw .33
retlw .33
retlw .34
retlw .34
retlw .35
retlw .35
retlw .36
retlw .36
retlw .37
retlw .37
retlw .38
retlw .38
retlw .39
retlw .39
retlw .40
retlw .40
retlw .41
retlw .41
retlw .42
retlw .42
retlw .43
retlw .43
retlw .44
retlw .44
retlw .45
retlw .45
retlw .46
retlw .46
retlw .47
retlw .47
retlw .48
retlw .48
retlw .49
retlw .49
retlw .50
retlw .50
retlw .51
retlw .51
retlw .52
retlw .52
retlw .53
retlw .53
retlw .54
retlw .54
retlw .55
retlw .55
retlw .56
retlw .56
retlw .57
retlw .57
retlw .58
retlw .58
retlw .59
retlw .59
retlw .60
retlw .60
retlw .61
retlw .61
retlw .62
retlw .62
retlw .63
retlw .63
retlw .64
retlw .64
retlw .65
retlw .65
retlw .66
retlw .66
retlw .67
retlw .67
retlw .68
retlw .68
retlw .69
retlw .69
retlw .70
retlw .70
retlw .71
retlw .71
retlw .72
retlw .72
retlw .73
retlw .73
retlw .74
retlw .74
retlw .75
retlw .75
retlw .76
retlw .76
retlw .77
retlw .77
retlw .78
retlw .78
retlw .79
retlw .79
retlw .80
retlw .80
retlw .81
retlw .81
retlw .82
retlw .82
retlw .83
retlw .83
retlw .84
retlw .84
retlw .85
retlw .85
retlw .86
retlw .86
retlw .87
retlw .87
retlw .88
retlw .88
retlw .89
retlw .89
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
END ;Конец
В данном таймере диапазон от 0-90 мин а мне нужно от 1- 12 часов. Как это сделать? Какие изменения нужно внести в программу?
Прошу вашей помощи.
__CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC
;
;********************** Константы*******************************
;
M_O_INIT EQU 0xC3 ;b'11000011',Загрузка OPTION. Коэфф. дел.=16
M_TA_INIT EQU 0x08 ;b'00001000',Управление портом А-TRISA
M_TB_INIT EQU 0x00 ;b'00000000',Управление портом В-TRISB
M_I_INIT EQU 0xA0 ;b'10100000',Загрузка INTCON
M_FLAG_INIT EQU 0xFF ;b'11111111',Загрузка регистра флагов
X_Pause EQU 0xFE ;Данные для счетчика X
Y_Pause EQU 0xFE ;Данные для счетчика Y
Z_Pause EQU 0x05 ;Данные для счетчика Z
Del_Range EQU 0x82 ;Константа задержки
Cycle_1 EQU 0xA0 ;Частота зв. сигнала (1024 Гц)
Cycle_2 EQU 0x02 ;Скважность имп. зв. сигнала (2)
Cycle_3 EQU 0xFF ;Длительность зв. сигнала (500ms)
Cycle_4 EQU 0x06 ;Время звучания (6s)
;
;******************** Описание портов **********************************
;
Ind_0 EQU 0x00 ;Вывод RA0, мл.разряд индикатора (1-вкл.), Out
Ind_1 EQU 0x01 ;Вывод RA1, ст.разряд индикатора (1-вкл.) Out
C1_Rel EQU 0x02 ;Вывод RA2, Зарядка\разрядка конденсатора (In/Out)
TMR_On EQU 0x03 ;Вывод RA3, Пуск/Сброс таймера (0), In
TMR_Run EQU 0x04 ;Вывод RA4, Выход зв. сигнала, Out
Led_On EQU 0x07 ;Вывод RB7, Индикатор работы таймера (1), Out
;
;********************** Описание регистра Флагов *************************
;
Phase EQU 0x07 ;Режим работы: 0-таймер вкл., 1-установка
;
;************************** Переменные ************************************
;
Delay_Reg_1 EQU 0x0C ;Рабочие регистры подпрограмм
Delay_Reg_2 EQU 0x0D ; задержки
Flags EQU 0x0E ;Хранение регисра флагов
W_copy EQU 0x0F ;Временное хранение w
FSR_copy EQU 0x10 ;Временное хранение FSR
STATUS_copy EQU 0x11 ;Временное хранение STATUS
X_Count EQU 0x12 ;Cчетчик задержки X
Y_Count EQU 0x13 ;Cчетчик задержки Y
Z_Count EQU 0x14 ;Cчетчик задержки Z
R_Bits EQU 0x15 ;Время (мин.), соотв. сопротивлению R1
N EQU 0x16 ;Рабочая ячейка подпр. One_Shot
Digit_0 EQU 0x17 ;Мл.байт величины выдержки времени
Digit_1 EQU 0x18 ;Ст.байт величины выдержки времени
Int_Count_Low EQU 0x19 ;Мл.байт счетчика прерываний
Int_Count_High EQU 0x1A ;Ст.байт счетчика прерываний
Ind_Nom EQU 0x1B ;Хранение № индикатора
Cell_1 EQU 0x1C ;Рабочие регистры подпрограммы
Cell_2 EQU 0x1D ; генерации зв. сигнала
Cell_3 EQU 0x1E
Cell_4 EQU 0x1F
;
;***************** Основной код*******************************
;
ORG 0 ;Программа начинается с метки 'Main'
goto Main
ORG 4 ;Вектор прерывания
goto Int_Prog
;
;**************** Начальная инициализация *******************
;
Main
clrf PORTA ;Очистить выходные защелки порта А
clrf PORTB ; и порта В
clrf TMR0 ;Очистить таймер
bsf STATUS,RP0 ;Открыть доступ к банку 1
movlw M_O_INIT ;Загрузить исходные
movwf OPTION_REG^80H ; данные в OPTION_REG
movlw M_TA_INIT ;Настроить порт А
movwf TRISA^80H ;
movlw M_TB_INIT ;Настроить порт В
movwf TRISB^80H ;
bcf STATUS,RP0 ;Включить банк 0
movlw M_I_INIT ;Загрузить исходные
movwf INTCON ; данные в INTCON
movlw M_FLAG_INIT ;Загрузить исходные
movwf Flags ; данные в ячейку Flags
clrf R_Bits ;Очистить R_Bits
Test
bcf INTCON,7 ;Запрет прерываний
movlw b'10000000' ;Вывод на LSB(HG1) индикатор цифры 8
movwf PORTB
bsf PORTA,0
call Delay_1s ;Пауза 1сек
bsf PORTA,1 ;Вывод на MSB индикатор(HG2) цифры 8
call Delay_1s ;Пауза 1сек
clrf PORTA ;Порты в исходное состояние
clrf PORTB
clrf N ;Обнулить N
bsf PORTA,TMR_Run
First_Pass
call One_Shot ;Пробное измерение, зарядка конденсатора
call Delay_100ms ;Задержка 0,1сек
;
;****************** Установка времени выдержки таймера**********************
;
Get_Time
bsf Flags,Phase ;Признак режима установки
bcf INTCON,7 ;Запрет прерываний
call One_Shot ;Подсчет числа 'N' импульсов разрядки
movlw 0x03 ;Запись ст. байта адреса таблицы
movwf PCLATH ; преобразования в PCLATH
movf N,w
call Convert ;Таблица преобразования
movwf R_Bits ;Хранение результата преобразования
clrf PCLATH ;PCLATH в исходное состояние
call Bin_to_BCD ;Перекодирование в BCD код
bsf INTCON,7 ;Разрешить прерывания
;
;****************** Проверка состояния кнопки SB1 **************************
;
Check_SB1
btfsc PORTA,TMR_On ;Пока кнопка не нажата-
goto Get_Time ; таймер в режиме установки
call Delay_100ms
bcf Flags,Phase ;Установить признак работы таймера на счет
call Delay_1s ;Задержка, необходимая для отпускания SB1
;
;******************** Таймер включен ***************************************
;
Timer_On
clrf Int_Count_Low ;Обнулить счетчики прерываний
clrf Int_Count_High
Time_Count
bsf PORTA,TMR_Run ;Транзистор VT1 закрыт
btfss PORTA,TMR_On ;Сброс таймера при повторном нажатии
goto Reset_TMR ; на SB1
movfw Int_Count_High ;Сравнение счетчика прерываний с 15000
xorlw 0x3A ; (3A98hex),что соответствует 1мин.
btfss STATUS,Z
goto Time_Count
movfw Int_Count_Low
sublw 0x97
btfsc STATUS,C
goto Time_Count ;Если 1мин не закончилась-продолжить счет
decf R_Bits,f ;R_Bits=R_Bits-1. Если установленное
btfsc STATUS,Z ; время закончилось (R_Bits=0), установить
bsf Flags,Phase ; признак окончания работы таймера
call Bin_to_BCD ;Преобразование R_Bits в BCD-код
btfss Flags,Phase ;Если таймер в режиме счета-
goto Timer_On ; идти на продолжение счета времени
;
;************************** Таймер остановлен ****************************
;
Timer_Stop
call Delay_1s
call Beep
bsf PORTA,TMR_Run ;Транзистор VT1 закрыт
Reset_TMR
call Delay_1s
clrf R_Bits ;Обнулить счетчик времени
clrf Int_Count_Low ; и прерываний
clrf Int_Count_High
bsf Flags,Phase ;Флаг режима установки=1
call Delay_100ms
goto Get_Time ;Идти на установку
;
;******** Подпрограмма преобразования двоичного кода в BCD-код *********
; Двоичный код в регистре R_Bits, после преобразования в Digit_0
; - единицы, в Digit_1 - десятки.
Bin_to_BCD
clrf Digit_1
movfw R_Bits
movwf Digit_0
G_Tens
movlw d'10'
subwf Digit_0,w
btfss STATUS,C
goto Over
movwf Digit_0
incf Digit_1,f
goto G_Tens
Over
movf Digit_1,w ;Гашение незначащих нулей
andlw b'00001111'
btfss STATUS,Z
goto Finish
movlw b'00010000' ;d'16'-указатель на 16 строку
movwf Digit_1 ; таблицы (пустое место)
Finish
return
;
;****** Подпрограмма преобразования для 7-ми сегментного индикатора ********
; "0" - соответствует горящему сегменту, т. к. индикатор с общим анодом
Table
addwf PCL,f
retlw b'11000000' ;Цифра "0"
retlw b'11111001' ;Цифра "1"
retlw b'10100100' ;Цифра "2"
retlw b'10110000' ;Цифра "3"
retlw b'10011001' ;Цифра "4"
retlw b'10010010' ;Цифра "5"
retlw b'10000010' ;Цифра "6"
retlw b'11111000' ;Цифра "7"
retlw b'10000000' ;Цифра "8"
retlw b'10010000' ;Цифра "9"
retlw b'10001000' ;Цифра "А"
retlw b'10000011' ;Цифра "B"
retlw b'11000110' ;Цифра "C"
retlw b'10100001' ;Цифра "D"
retlw b'10000110' ;Цифра "E"
retlw b'10001110' ;Цифра "F"
retlw b'11111111' ;Пустое место (код 10h)
;
;********************* Обработка прерывания от TMR0 ***********************
;
Int_Prog
movwf W_copy ;Сохранение регистров
movf STATUS,w
movwf STATUS_copy
movf FSR,w
movwf FSR_copy
bcf INTCON,T0IF ;Сбросить флаг прерывания
movlw 0x06 ; Настраиваем таймер
movwf TMR0
btfsc Flags,Phase ;Проверка текущего режима:
goto Clear ;Если установка-обнулить счетчики
movfw Int_Count_Low ; Прибавляем LSB счетчик прерываний
xorlw H'FF' ;Если переполнен-перенос в ст. разряд
BZ Add_H ;
incf Int_Count_Low,f
goto Indicate ;Индикация
Add_H
incf Int_Count_High,f ;Прибавляем MSB счетчик прерываний
clrf Int_Count_Low
movfw Int_Count_High
xorlw H'FF' ;Если переполнен-обнулить счетчики
BZ Clear
goto Indicate ;Индикация
Clear
clrf Int_Count_Low
clrf Int_Count_High
Indicate
bcf PORTA,Ind_0 ;Гашение индикаторов
bcf PORTA,Ind_1
incf Ind_Nom,f ;Выбор индикатора (чет\нечет)
btfss Ind_Nom,0 ; если чет-индикация мл.байта
goto LSB_Ind ; если нечет-старшего
goto MSB_Ind
MSB_Ind
movf Digit_1,w ;Загрузить MSB в w
call Table ;Преобразование в 7-сегм. код
andwf Flags,w ;Установить бит 7 порта В
movwf PORTB ; и вывод
bsf PORTA,Ind_1 ;Включить индикатор
goto End_Int
LSB_Ind
movf Digit_0,w ;Загрузить MSB в w
call Table ;Преобразование в 7-сегм. код
andwf Flags,w ;Установить бит 7 порта В
movwf PORTB ; и вывод
bsf PORTA,Ind_0 ;Включить индикатор
End_Int
movf FSR_copy,w ;Восстановление регистров
movwf FSR
movf STATUS_copy,w
movwf STATUS
swapf W_copy,f
swapf W_copy,w
retfie
;
;****************** Подпрограмма "One Shot" ********************************
;
One_Shot
clrf N
bsf STATUS,RP0
bsf TRISA,2
bcf STATUS,RP0
Tst
btfss PORTA,C1_Rel
goto Ready
incfsz N,f
goto Tst
Ready
decf N,f
movf N,w
xorlw 0xFF
btfsc STATUS,Z
clrf N
bsf STATUS,RP0
bcf TRISA,2
bcf STATUS,RP0
bsf PORTA,C1_Rel
return
;
;************************** Подпрограмма задержки на 1s *****************
;
Delay_1s
movlw Z_Pause
movwf Z_Count
Z_Loop
movlw Y_Pause
movwf Y_Count
Y_Loop movlw X_Pause
movwf X_Count
X_Loop decfsz X_Count,f
goto X_Loop
decfsz Y_Count,f
goto Y_Loop
decfsz Z_Count,f
goto Z_Loop
return
;
;**************Подпрограмма задержки на 100 мс***************************
;
Delay_100ms
movlw Del_Range
movwf Delay_Reg_1
movlw h'FF'
movwf Delay_Reg_2
Loop
decfsz Delay_Reg_2,f
goto Loop
decfsz Delay_Reg_1,f
goto Loop
return
;
;********* Подпрограмма подачи звукового сигнала на RA4 ******************
;
Beep
bcf INTCON,7
movlw Cycle_4
movwf Cell_4
Beep_500
movlw Cycle_3
movwf Cell_3
Double
movlw Cycle_2
movwf Cell_2
H_Level
bsf PORTA,4
movlw Cycle_1
movwf Cell_1
Ring_1
decfsz Cell_1,f
goto Ring_1
L_Level
bcf PORTA,4
movlw Cycle_1
movwf Cell_1
Ring_2
decfsz Cell_1,f
goto Ring_2
decfsz Cell_2,f
goto H_Level
decfsz Cell_3,f
goto Double
goto Del_500
Del_500
movlw Cycle_3
movwf Cell_3
Doub
movlw Cycle_2
movwf Cell_2
H_Lev
bcf PORTA,4
movlw Cycle_1
movwf Cell_1
Rin_1
decfsz Cell_1,f
goto Rin_1
L_Lev
bcf PORTA,4
movlw Cycle_1
movwf Cell_1
Rin_2
decfsz Cell_1,f
goto Rin_2
decfsz Cell_2,f
goto H_Lev
decfsz Cell_3,f
goto Doub
decfsz Cell_4,f
goto Beep_500
bsf INTCON,7
return
;
;**** Подпрограмма табличной конвертации значения N *********
; в длительность выдержки времени (мин.)
ORG 0x300
Convert
addwf PCL,f
retlw .1
retlw .1
retlw .2
retlw .2
retlw .3
retlw .3
retlw .4
retlw .4
retlw .5
retlw .5
retlw .6
retlw .6
retlw .7
retlw .7
retlw .8
retlw .8
retlw .9
retlw .9
retlw .10
retlw .10
retlw .11
retlw .11
retlw .12
retlw .12
retlw .13
retlw .13
retlw .14
retlw .14
retlw .15
retlw .15
retlw .16
retlw .16
retlw .17
retlw .17
retlw .18
retlw .18
retlw .19
retlw .19
retlw .20
retlw .20
retlw .21
retlw .21
retlw .22
retlw .22
retlw .23
retlw .23
retlw .24
retlw .24
retlw .25
retlw .25
retlw .26
retlw .26
retlw .27
retlw .27
retlw .28
retlw .28
retlw .29
retlw .29
retlw .30
retlw .30
retlw .31
retlw .31
retlw .32
retlw .32
retlw .33
retlw .33
retlw .34
retlw .34
retlw .35
retlw .35
retlw .36
retlw .36
retlw .37
retlw .37
retlw .38
retlw .38
retlw .39
retlw .39
retlw .40
retlw .40
retlw .41
retlw .41
retlw .42
retlw .42
retlw .43
retlw .43
retlw .44
retlw .44
retlw .45
retlw .45
retlw .46
retlw .46
retlw .47
retlw .47
retlw .48
retlw .48
retlw .49
retlw .49
retlw .50
retlw .50
retlw .51
retlw .51
retlw .52
retlw .52
retlw .53
retlw .53
retlw .54
retlw .54
retlw .55
retlw .55
retlw .56
retlw .56
retlw .57
retlw .57
retlw .58
retlw .58
retlw .59
retlw .59
retlw .60
retlw .60
retlw .61
retlw .61
retlw .62
retlw .62
retlw .63
retlw .63
retlw .64
retlw .64
retlw .65
retlw .65
retlw .66
retlw .66
retlw .67
retlw .67
retlw .68
retlw .68
retlw .69
retlw .69
retlw .70
retlw .70
retlw .71
retlw .71
retlw .72
retlw .72
retlw .73
retlw .73
retlw .74
retlw .74
retlw .75
retlw .75
retlw .76
retlw .76
retlw .77
retlw .77
retlw .78
retlw .78
retlw .79
retlw .79
retlw .80
retlw .80
retlw .81
retlw .81
retlw .82
retlw .82
retlw .83
retlw .83
retlw .84
retlw .84
retlw .85
retlw .85
retlw .86
retlw .86
retlw .87
retlw .87
retlw .88
retlw .88
retlw .89
retlw .89
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
retlw .90
END ;Конец