However with a little thought the answer turn out to be relatively simple. The trick is to work from a known set point, in these examples the date is the year 1st Jan 2000, but once you understand the principals you can adapt it to your own requirements.
There are two examples; the first is a program using Case to work out its days per month calculations. The second uses Branch, while not so easy to read it uses a 1/3rd less code.
Please note the code below was corrected on the 22nd of March 04 due to an transcribing error.
Tim Box
Example Code
'days caculation,since 1/1/2000 to 31/12/2099
Include "proton_4.inc"
Dim Year as Word
Dim Month as byte
Dim Day as byte
dim Hour as byte
Dim Total_Days as word
Dim Complete_Years as byte
Dim Complete_Years_Days as word
Dim Current_Year_leap as byte
Year=2005
Month=1
Day=1
Total_Days=0
Complete_Years= Year-2000 ' calculate number of completed years
If Complete_Years>0 then
Complete_Years_Days =Complete_Years*365+((Complete_Years-1)/4) +1
endif
Current_Year_leap = Complete_Years//4 ' if 0 it is leap
select Month ' add the days of completed months
CASE 1
Total_Days= Complete_Years_Days
CASE 2
Total_Days= Complete_Years_Days + 31
CASE 3
Total_Days= Complete_Years_Days + 59 '31+28
CASE 4
Total_Days= Complete_Years_Days + 90 '31+28+31
CASE 5
Total_Days= Complete_Years_Days + 120 '31+28+31+30
CASE 6
Total_Days= Complete_Years_Days + 151 '31+28+31+30+31
CASE 7
Total_Days= Complete_Years_Days + 181 '31+28+31+30+31+30
CASE 8
Total_Days= Complete_Years_Days + 212 '31+28+31+30+31+30+31
CASE 9
Total_Days= Complete_Years_Days + 243 '31+28+31+30+31+30+31+31
CASE 10
Total_Days= Complete_Years_Days + 273 '31+28+31+30+31+30+31+31+30
CASE 11
Total_Days= Complete_Years_Days + 304 '31+28+31+30+31+30+31+31+30+31
CASE 12
Total_Days= Complete_Years_Days + 334 '31+28+31+30+31+30+31+31+30+31+30
ENDSELECT
Total_Days=Total_Days+ Day ' add the current month days
IF MONTH >2 AND Current_Year_leap=0 THEN Total_Days=Total_Days+1 ' add 1 if the current year is leap, and the month >2
print at 1,1, dec Total_Days ' total days including the current day
Stop
'DAYS CACULATION,SINCE 1/1/2000 TO 31/12/2099
INCLUDE "PROTON_4.INC"
DIM YEAR AS BYTE
DIM MONTH AS BYTE
DIM DAY AS BYTE
DIM HOUR AS BYTE
DIM TOTAL_DAYS AS WORD
DIM COMPLETE_YEARS AS BYTE
DIM COMPLETE_YEARS_DAYS AS WORD
DIM CURRENT_YEAR_LEAP AS BYTE
DIM MONTH_DAYS AS WORD
DIM CALC_TEMP
GOTO START
'--- YEAR CALC SUBS ---------------
TOTAL_CALC:
TOTAL_DAYS = COMPLETE_YEARS_DAYS + MONTH_DAYS
GOTO BRA_EXIT
'----------------------------------
CALC_DAYS:
TOTAL_DAYS=0
COMPLETE_YEARS= YEAR - 00 ' CALCULATE NUMBER OF COMPLETED YEARS
IF COMPLETE_YEARS > 0 THEN
CALC_TEMP = (COMPLETE_YEARS-1)/4)
COMPLETE_YEARS_DAYS =COMPLETE_YEARS * 365 + CALC_TEMP +1
ENDIF
CURRENT_YEAR_LEAP = COMPLETE_YEARS//4 ' IF 0 IT IS LEAP
BRANCH MONTH, [BRA_EXIT,JAN,FEB,MAR,APR,MAY,JUN,JULY,AUG,SEPT,OCT ,NOV,DECM]
' ADD THE DAYS OF COMPLETED MONTHS
JAN:
TOTAL_DAYS= COMPLETE_YEARS_DAYS
GOTO BRA_EXIT
FEB:
MONTH_DAYS = 31
GOTO TOTAL_CALC
MAR:
MONTH_DAYS = 59
GOTO TOTAL_CALC
APR:
MONTH_DAYS = 90
GOTO TOTAL_CALC
MAY:
MONTH_DAYS = 120
GOTO TOTAL_CALC
JUN:
MONTH_DAYS = 151
GOTO TOTAL_CALC
JULY:
MONTH_DAYS = 181
GOTO TOTAL_CALC
AUG:
MONTH_DAYS = 212
GOTO TOTAL_CALC
SEPT:
MONTH_DAYS = 243
GOTO TOTAL_CALC
OCT:
MONTH_DAYS = 273
GOTO TOTAL_CALC
NOV:
MONTH_DAYS = 304
GOTO TOTAL_CALC
DECM:
MONTH_DAYS = 334
GOTO TOTAL_CALC
BRA_EXIT:
TOTAL_DAYS=TOTAL_DAYS+ DAY ' ADD THE CURRENT MONTH DAYS
IF MONTH >2 THEN
IF CURRENT_YEAR_LEAP = 0 THEN
TOTAL_DAYS=TOTAL_DAYS+1 ' ADD 1 IF THE CURRENT YEAR IS LEAP, AND THE MONTH >2
ENDIF
ENDIF
RETURN
START:
YEAR=05
MONTH=12
DAY=1
GOSUB CALC_DAYS
PRINT AT 1,1, DEC TOTAL_DAYS ' TOTAL DAYS INCLUDING THE CURRENT DAY
STOP
Include "proton_4.inc"
Dim Year as Word
Dim Month as byte
Dim Day as byte
dim Hour as byte
Dim Total_Days as word
Dim Complete_Years as byte
Dim Complete_Years_Days as word
Dim Current_Year_leap as byte
Year=2005
Month=1
Day=1
Total_Days=0
Complete_Years= Year-2000 ' calculate number of completed years
If Complete_Years>0 then
Complete_Years_Days =Complete_Years*365+((Complete_Years-1)/4) +1
endif
Current_Year_leap = Complete_Years//4 ' if 0 it is leap
select Month ' add the days of completed months
CASE 1
Total_Days= Complete_Years_Days
CASE 2
Total_Days= Complete_Years_Days + 31
CASE 3
Total_Days= Complete_Years_Days + 59 '31+28
CASE 4
Total_Days= Complete_Years_Days + 90 '31+28+31
CASE 5
Total_Days= Complete_Years_Days + 120 '31+28+31+30
CASE 6
Total_Days= Complete_Years_Days + 151 '31+28+31+30+31
CASE 7
Total_Days= Complete_Years_Days + 181 '31+28+31+30+31+30
CASE 8
Total_Days= Complete_Years_Days + 212 '31+28+31+30+31+30+31
CASE 9
Total_Days= Complete_Years_Days + 243 '31+28+31+30+31+30+31+31
CASE 10
Total_Days= Complete_Years_Days + 273 '31+28+31+30+31+30+31+31+30
CASE 11
Total_Days= Complete_Years_Days + 304 '31+28+31+30+31+30+31+31+30+31
CASE 12
Total_Days= Complete_Years_Days + 334 '31+28+31+30+31+30+31+31+30+31+30
ENDSELECT
Total_Days=Total_Days+ Day ' add the current month days
IF MONTH >2 AND Current_Year_leap=0 THEN Total_Days=Total_Days+1 ' add 1 if the current year is leap, and the month >2
print at 1,1, dec Total_Days ' total days including the current day
Stop
'DAYS CACULATION,SINCE 1/1/2000 TO 31/12/2099
INCLUDE "PROTON_4.INC"
DIM YEAR AS BYTE
DIM MONTH AS BYTE
DIM DAY AS BYTE
DIM HOUR AS BYTE
DIM TOTAL_DAYS AS WORD
DIM COMPLETE_YEARS AS BYTE
DIM COMPLETE_YEARS_DAYS AS WORD
DIM CURRENT_YEAR_LEAP AS BYTE
DIM MONTH_DAYS AS WORD
DIM CALC_TEMP
GOTO START
'--- YEAR CALC SUBS ---------------
TOTAL_CALC:
TOTAL_DAYS = COMPLETE_YEARS_DAYS + MONTH_DAYS
GOTO BRA_EXIT
'----------------------------------
CALC_DAYS:
TOTAL_DAYS=0
COMPLETE_YEARS= YEAR - 00 ' CALCULATE NUMBER OF COMPLETED YEARS
IF COMPLETE_YEARS > 0 THEN
CALC_TEMP = (COMPLETE_YEARS-1)/4)
COMPLETE_YEARS_DAYS =COMPLETE_YEARS * 365 + CALC_TEMP +1
ENDIF
CURRENT_YEAR_LEAP = COMPLETE_YEARS//4 ' IF 0 IT IS LEAP
BRANCH MONTH, [BRA_EXIT,JAN,FEB,MAR,APR,MAY,JUN,JULY,AUG,SEPT,OCT ,NOV,DECM]
' ADD THE DAYS OF COMPLETED MONTHS
JAN:
TOTAL_DAYS= COMPLETE_YEARS_DAYS
GOTO BRA_EXIT
FEB:
MONTH_DAYS = 31
GOTO TOTAL_CALC
MAR:
MONTH_DAYS = 59
GOTO TOTAL_CALC
APR:
MONTH_DAYS = 90
GOTO TOTAL_CALC
MAY:
MONTH_DAYS = 120
GOTO TOTAL_CALC
JUN:
MONTH_DAYS = 151
GOTO TOTAL_CALC
JULY:
MONTH_DAYS = 181
GOTO TOTAL_CALC
AUG:
MONTH_DAYS = 212
GOTO TOTAL_CALC
SEPT:
MONTH_DAYS = 243
GOTO TOTAL_CALC
OCT:
MONTH_DAYS = 273
GOTO TOTAL_CALC
NOV:
MONTH_DAYS = 304
GOTO TOTAL_CALC
DECM:
MONTH_DAYS = 334
GOTO TOTAL_CALC
BRA_EXIT:
TOTAL_DAYS=TOTAL_DAYS+ DAY ' ADD THE CURRENT MONTH DAYS
IF MONTH >2 THEN
IF CURRENT_YEAR_LEAP = 0 THEN
TOTAL_DAYS=TOTAL_DAYS+1 ' ADD 1 IF THE CURRENT YEAR IS LEAP, AND THE MONTH >2
ENDIF
ENDIF
RETURN
START:
YEAR=05
MONTH=12
DAY=1
GOSUB CALC_DAYS
PRINT AT 1,1, DEC TOTAL_DAYS ' TOTAL DAYS INCLUDING THE CURRENT DAY
STOP


Menu
Recent Articles


Using PDS with SPI GLCD based on ST7565R Controller
Graphic LCDs based on the ST7565 are cheaper then GLCDs with other controllers. SPI requires only four pins. If the circuit