Код: Выделить всё
;Проба календаря с часами
;*************************************************
.include "m8def.inc"
.def R_YEAR_L=R1
.def R_MONTH=R2
.def R_DAY=R3
.def R_HOUR=R4
.def R_MIN=R5
.def R_SEC=R6
.def R_10msec=R7
.cseg
.org 0x0000
RJMP RESET
.org 0x0040
SET_TIME_BEGIN:
; год месяц,число часы,минуты секунды
.DB 15, 6-1, 1, 12,00, 00
SET_TIME_END:
CONST_COMPARE:
; сек мин час месяцы год
.DB 60, 24, 12, 100
H_YEAR:
.DB 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ; високосный год
L_YEAR:
.DB 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ; обычный год
TIME_END:
RESET:
LDI R16,LOW(RAMEND)
OUT SPL,R16 ; инициализация стека
CLR ZH
OUT SPH,ZH
CLR YH
LDI ZL,LOW(SET_TIME_BEGIN*2)
LDI YL,1 ; адрес регистра R1
LOAD_TIME_BEGIN:
LPM R0,Z+
ST Y+,R0
CPI ZL,LOW(SET_TIME_END*2)
BRLO LOAD_TIME_BEGIN
LDI ZL,LOW(CONST_COMPARE*2)
LOAD_CONST:
LPM
ST Z+,R0
CPI ZL,LOW(TIME_END*2)
BRLO LOAD_CONST
RCALL INC_TIME
RJMP PC-1
INC_TIME:
;INC_10msec:
; LDS R15,CONST_COMPARE*2+3
; INC R_10msec
; CP R_10msec,R15
; BRLO INC_TIME_OUT
; CLR R_10msec
INC_SEC:
LDS R15,CONST_COMPARE*2+0
INC R_SEC
CP R_SEC,R15
BRLO INC_TIME_OUT
CLR R_SEC
INC_MIN:
INC R_MIN
CP R_MIN,R15
BRLO INC_TIME_OUT
CLR R_MIN
INC_HOUR:
LDS R15,CONST_COMPARE*2+1
INC R_HOUR
CP R_HOUR,R15
BRLO INC_TIME_OUT
CLR R_HOUR
;*************************************************
INC_DAY:
LDI ZL,(L_YEAR*2)
MOV R24,R_YEAR_L
ANDI R24,0b00000011
BRNE PC+2
LDI ZL,(H_YEAR*2)
ADD ZL,R_MONTH
LPM
INC R_DAY
CP R_DAY,R0
BRLO INC_TIME_OUT
CLR R_DAY
INC_MONTH:
LDS R15,CONST_COMPARE*2+2
INC R_MONTH
CP R_MONTH,R15
BRLO INC_TIME_OUT
CLR R_MONTH
INC_YEAR:
; LDS R15,CONST_COMPARE*2+3
INC R_YEAR_L
; CP R_YEAR_L,R15
; BRLO INC_TIME_OUT
; CLR R_YEAR_L
INC_TIME_OUT:
RET
.EXIT