You are on page 1of 4

Thuật toán tính Âm lịch từ Dương lịch dùng phương pháp tra bảng

Cách tính ngày Âm lịch theo phương pháp tra bảng tra bảng:

Công thức tính ngày Âm lịch theo phương pháp tra bảng tra bảng:

Tính ngày Âm lịch:

Nếu (ngày Dương lịch tương ứng với ngày đầu tháng Âm lịch) bằng (ngày hiện tại) thì ngày
Âm lịch bằng 1
(N_DL_DAU_THANG = NGAY => NGAY_AL = 1)
Hoặc (ngày Dương lịch tương ứng với ngày đầu tháng Âm lịch) trừ (ngày hiện tại):
(N_DL_DAU_THANG - NGAY) :

- Nếu không có nhớ (C=0) thì ngày Âm lịch bằng (ngày Dương lịch hiện tại) cộng
(ngày Âm lịch của đầu tháng Dương lịch) rồi trừ 1
(NGAY_AL = ((NGAY + N_AL_DAU_THANG)-1)
- Nếu có nhớ (C=1) thì ngày Âm lịch hiện tại bằng (ngày Dương lịch hiện tại) trừ
(ngày Dương lịch đầu tháng Âm lịch) rồi + 1
(NGAY_AL = ((NGAY - N_DL_DAU_THANG)+1)

;===============================================

Tính tháng Âm lịch :

Bằng cách lấy (ngày Dương lịch tương ứng với đầu tháng Âm lịch trong tháng) trừ (ngày
hiện tại)
(N_DL_DAU_THANG - NGAY)

- Nếu không có nhớ (C=0) thì tháng Âm lịch hiện tại bằng tháng Âm lịch của đầu
tháng Dương lịch
(THANG_AL = (T_AL_DAU_THANG)
- Nếu có nhớ (C=1) thì tháng Âm lịch hiện tại bằng tháng Âm lịch của ngày đầu tháng
Âm lịch
(THANG_AL = T_AL_DAU_T_AL)

;===============================================

Tính năm Âm lịch:


Bằng cách lấy (tháng Dương lịch) trừ cho (tháng Âm lịch) (THANG - THANG_AL)

- Nếu không có nhớ (C=0) thì năm Âm lịch sẽ bằng năm Dương lịch
(NAM_AL=NAM)
- Nếu có nhớ (C=1) thì năm Âm lịch hiện tại bằng năm Dương lịch trừ 1
(NAM_AL = NAM - 1)

;===============================================

Trong đó:

- NGAY = ngày Dương lịch.(có sẵn trong IC thời gian thực)


- NGAY_AL = ngày Âm lịch.(kết quả)
- N_DL_DAU_THANG = ngày Dương lịch đầu tháng Âm lịch.(bảng tra)
- N_AL_DAU_THANG = ngày Âm lịch của đầu tháng Dương lịch.(bảng tra)
- THANG = tháng Dương lịch. (có sẵn trong IC thời gian thực)
- THANG_AL = tháng Âm lịch.(kết quả)
- T_AL_DAU_THANG = tháng Âm lịch đầu tháng Dương lịch. (bảng tra)
- T_AL_DAU_T_AL = tháng Âm lịch đầu tháng Âm lịch.(bảng tra)
- NAM = năm Dương lịch. (có sẵn trong IC thời gian thực)
- NAM_AL = năm Âm lịch.(kết quả)
Để tiện cho việc so sánh và chỉnh ngày tháng, Biến thứ 5 cần thiết phải có là tổng số ngày
Dương lịch trong tháng DL.

Bảng dưới đây được tạo ra cho 5 năm, trích từ Lịch "Vietnamese Lunar calendar".

Với các biến được xếp theo thứ tự như sau:

ngày AL đầu tháng DL; tháng AL đầu tháng DL; ngày DL của đầu tháng AL;tháng AL của
đầu tháng AL; tổng số ngày DL trong tháng.

DL2009:
DL2009_1: DB 6,12,26,1,31 ; Tháng 1 năm 2009
DL2009_2: DB 7,1,25,2,28 ; ; Tháng 2 năm 2009
DL2009_3: DB 5,2,26,3,31
DL2009_4: DB 7,3,25,4,30
DL2009_5: DB 7,4,24,5,31
DL2009_6: DB 9,5,23,5,30
DL2009_7: DB 9,5,22,6,31
DL2009_8: DB 11,6,20,7,31
DL2009_9: DB 13,7,19,8,30
DL2009_10: DB 13,8,18,9,31
DL2009_11: DB 15,9,17,10,30
DL2009_12: DB 15,10,16,11,31

DL2010:
DL2010_1: DB 17,11,15,12,31 ; Tháng 1 năm 2010
DL2010_2: DB 18,12,14,1,28
DL2010_3: DB 16,1,16,2,31
DL2010_4: DB 17,2,14,3,30
DL2010_5: DB 18,3,14,4,31
DL2010_6: DB 19,4,12,5,30
DL2010_7: DB 20,5,12,6,31
DL2010_8: DB 21,6,10,7,31
DL2010_9: DB 23,7,8,8,30
DL2010_10: DB 24,8,8,9,31
DL2010_11: DB 25,9,6,10,30
DL2010_12: DB 26,10,6,11,31

DL2011:
DL2011_1: DB 27,11,4,12,31
DL2011_2: DB 19,12,3,1,28
DL2011_3: DB 27,1,5,2,31
DL2011_4: DB 28,2,3,3,30
DL2011_5: DB 29,3,3,4,31
DL2011_6: DB 30,4,2,5,30
DL2011_7: DB 1,6,31,7,31
DL2011_8: DB 2,7,29,8,31
DL2011_9: DB 4,8,27,9,30
DL2011_10: DB 5,9,27,10,31
DL2011_11: DB 6,10,25,11,30
DL2011_12: DB 7,11,25,12,31

DL2012:
DL2012_1: DB 8,12,23,1,31
DL2012_2: DB 10,1,22,2,29
DL2012_3: DB 9,2,22,3,31
DL2012_4: DB 11,3,21,4,30
DL2012_5: DB 11,4,21,4,31
DL2012_6: DB 12,4,19,5,30
DL2012_7: DB 13,5,19,6,30
DL2012_8: DB 14,6,17,7,31
DL2012_9: DB 16,7,16,8,30
DL2012_10: DB 16,8,15,9,31
DL2012_11: DB 18,9,14,10,30
DL2012_12: DB 18,10,13,11,31

DL2013:
DL2013_1: DB 20,11,12,12,31
DL2013_2: DB 21,12,10,1,28
DL2013_3: DB 20,1,12,2,31
DL2013_4: DB 21,2,10,3,30
DL2013_5: DB 22,3,10,4,31
DL2013_6: DB 23,4,8,5,30
DL2013_7: DB 24,5,8,6,31
DL2013_8: DB 25,6,7,7,31
DL2013_9: DB 26,7,5,8,30
DL2013_10: DB 27,8,5,9,31
DL2013_11: DB 28,9,3,10,30
DL2013_12: DB 29,10,3,11,31
;==================================

Tới đây chúng ta có thể dễ dàng tạo code Lịch Vạn Niên Âm lịch cho 89C51 hoặc cho các
loại Vi điều khiển khác từ các công thức trên.

Các bạn có thể tạo nội dung bảng tra lên đến vài chục năm mà vẫn không sợ hết dung lượng
bộ nhớ của VXL

You might also like