if _day > 28 and _month = 2 then _day = 1
if _day > 30 then
if _month = 4 or _month = 6 or _month = 9 or _month = 11 then _day = 1
end if
if _day > 31 then _day = 1[/uquote]
Благодарствую! Влезло. 5401 байт. 6-разрядные часы-календарь на Ин-12.
Можно задействовать режим сравнения по одному из каналов A(B) и в регистр OCR1A(B) загрузить 100'000/4. Тогда все частоты меньше 10/сек игнорировать.Dnepr_1186 писал(а):...Оно мне и не надо...
Код: Выделить всё
I2cstart ' DS1307 - LED-1Hz моргалка секунд
I2cwbyte &HD0 ' посылаем команду записи
I2cwbyte &H07
I2cwbyte &B00010000
I2cstop
Код: Выделить всё
' **********************[Основной цикл] **************************
Do ' основной цикл
Gosub Getdatetime ' считываем время и дату из DS1307
If _sec < 50 Then
Gosub Break_time ' показываем время
Else
Gosub Break_date ' показ даты последние 10 сек каждой минуты
End If
Debounce B_set , 0 , Setup_timedate , Sub ' обработка кнопки "SET"
Waitms 500
Loop
End
'***********************[Процедуры обработки подпрограмм и прерываний]*******************************
Refresh: ' прерывание таймера Т0 (индикация)
Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig4 : Reset Dig5 : Reset Dig6 ' гасим индикатор
Incr Count : If Count > 6 Then Count = 1 ' выбираем какой разряд сейчас включать
Portd = Lookup(i(count) , Digits) ' закидываем в порт код цифры
Select Case Count ' включаем соответствующий разряд индикатора
Case 1 : Set Dig1
Case 2 : Set Dig2
Case 3 : Set Dig3
Case 4 : Set Dig4
Case 5 : Set Dig5
Case 6 : Set Dig6
End Select
Return
В простом случае нужно использовать два прерывания - по переполнению и по совпадению. В прерывании по переполнению зажигается нужный разряд, а в прерывании по совпадению - гасятся все разряды. Тогда ширина анодного импульса будет пропорциональна числу в регистре сравнения.goldskif писал(а):Вот думаю, как можно обрезать анодные импульсы по длительности?
слева!В простом случае нужно использовать два прерывания - по переполнению и по совпадению. В прерывании по переполнению зажигается нужный разряд, а в прерывании по совпадению - гасятся все разряды. Тогда ширина анодного импульса будет пропорциональна числу в регистре сравнения.goldskif писал(а):Вот думаю, как можно обрезать анодные импульсы по длительности?
слева!Код: Выделить всё
Config Timer0 = Timer , Prescale = 64 , Clear Timer = 0 ' конфигурируем таймер индикации (~500 Гц)
On Ovf0 Refresh ' вектор прерывания по переполнению
On Oc0a Dimmer ' вектор прерывания по совпадению (длительность импульса)
Ocr0a = 127 ' загрузка значения в регистр сравнения
'***********************************[Процедуры обработки подпрограмм и прерываний]*******************************
Refresh: ' прерывание таймера Т0 (индикация)
Set Dig1 : Set Dig2 : Set Dig3 : Set Dig4 : Set Dig5 : Set Dig6 ' гасим индикатор
Incr Count : If Count > 6 Then Count = 1 ' выбираем какой разряд сейчас включать
Portd = Lookup(i(count) , Digits) ' закидываем в порт код цифры
Select Case Count ' и включаем соответствующий разряд индикатора
Case 1 : Reset Dig1
Case 2 : Reset Dig2
Case 3 : Reset Dig3
Case 4 : Reset Dig4
Case 5 : Reset Dig5
Case 6 : Reset Dig6
End Select
Return ' выход из обработчика прерывания
'----------------------------------------------------------------------------------------------------------------
Dimmer: ' прерывание таймера Т0 (регулировка яркости)
Set Dig1 : Set Dig2 : Set Dig3 : Set Dig4 : Set Dig5 : Set Dig6 ' гасим индикатор
Return ' выход из обработчика прерывания