用51 單片機(jī)實(shí)現(xiàn)公歷與農(nóng)歷星期的轉(zhuǎn)換 濟(jì)南 朱思榮 一概述 公歷是全世界通用的歷法以地球繞太陽的一周為一年一年365 天分為12 個月1 3 5 7 8 10 12 月為 31 天2 月為28 天其余月份為30 天事實(shí)上地球繞太陽一周共365 天5 小時48 分46 秒比公歷一年多出5 小時48 分46 秒為使年誤差不累積公歷年用閏年法來消除年誤差 由于每年多出5 小時48 分46 秒每4 年累計多出23 小時15 分4 秒接近1 天天文學(xué)家就規(guī)定每4 年有一個閏年把2 月由28 天改為29 天凡是公歷年代能被4 整除 的那一年就是閏年但是這樣一來每4 年又少了44 分56 秒為了更準(zhǔn)確地計時天文學(xué)家又規(guī)定凡能被100 整除 的年份只有能被400 整除才是閏年即每400 年要減掉3 個閏年經(jīng)過這樣處理后實(shí)際上每400 年的誤差只有2 小時 53 分20 秒已相當(dāng)準(zhǔn)確了 農(nóng)歷與公歷不同農(nóng)歷把月亮繞地球一周作為一月因?yàn)樵铝晾@地球一周不是一整天所以農(nóng)歷把月分為大月和小 月大月30 天小月29 天通過設(shè)置大小月使農(nóng)歷日始終與月亮與地球的位置相對應(yīng)為了使農(nóng)歷的年份與公歷年 相對應(yīng)農(nóng)歷通過設(shè)置閏月的辦法使它的平均年長度與公歷年相等農(nóng)歷是中國傳統(tǒng)文化的代表之一并與農(nóng)業(yè)生產(chǎn)聯(lián) 系密切中國人民特別是廣大農(nóng)民十分熟悉并喜愛農(nóng)歷 公歷與農(nóng)歷是我國目前并存的兩種歷法各有其固有的規(guī)律農(nóng)歷與月球的運(yùn)行相對應(yīng)其影響因素多它的大小 月和閏月與天體運(yùn)行有關(guān)計算十分復(fù)雜且每年都不一致因此要用單片機(jī)實(shí)現(xiàn)公歷與農(nóng)歷的轉(zhuǎn)換用查表法是最方 便實(shí)用的辦法 51 系列單片機(jī)因其在功能上能滿足大部份對速度要求不高的應(yīng)用場合的要求且價格低廉開發(fā)工具普及程度高 是目前應(yīng)用最多的單片機(jī)之一本文介紹一種用51 單片機(jī)實(shí)現(xiàn)從1901 年到2099 年199 年公歷日到農(nóng)歷日及星期的轉(zhuǎn) 換方法并向讀者提供完整的51 匯編程序 二 基本原理 實(shí)現(xiàn)公歷與農(nóng)歷的轉(zhuǎn)換一般采用查表法按日查表是速度最快的方法但51 單片機(jī)尋址能力有限不可能采用 按日查表的方法除按日查外我們可以通過按月查表和按年查表的方法再通過適當(dāng)?shù)挠嬎銇泶_定公歷日所對應(yīng)的 農(nóng)歷日期本文采用的是按年查表法最大限度地減少表格所占的程序空間 對于農(nóng)歷月來說大月為30 天小月為29 天這是固定不變的這樣我們就可用1 個BIT 位來表示大小月信 息農(nóng)歷一年如有閏月為13 個月否則是12 個月所以一年需要用13 個BIT 閏月在農(nóng)歷年中所在的月份并不固定 大部分閏月分布在農(nóng)歷2 8 月但也有少量年份在9 月以后所以要表示閏月的信息至少要4BIT 在這里我們用4BIT 的值來表示閏月的月份值為0 表示本年沒有閏月有了以上信息還不足以判斷公歷日對應(yīng)的農(nóng)歷日因?yàn)檫需要一 個參照日我們選用農(nóng)歷正月初一所對應(yīng)的公歷日期作參照日公歷日最大為31 日需要5BIT 來表示而春節(jié)所在的 月份不是1 月就是2 月用1BIT 就夠了考慮到表達(dá)方便我們用2BIT 來表示春節(jié)月2BIT 的值直接表示月份這 樣一年的農(nóng)歷信息只用3 個字節(jié)就全部包括了 計算公歷日對應(yīng)的農(nóng)歷日期的方法先計算出公歷日離當(dāng)年元旦的天數(shù)然后查表取得當(dāng)年的春節(jié)日期計算出春 節(jié)離元旦的天數(shù)二者相減即可算出公歷日離春節(jié)的天數(shù)以后只要根據(jù)大小月和閏月信息減一月天數(shù)調(diào)整一月農(nóng) 歷月份即可推算出公歷日所對應(yīng)的農(nóng)歷日期如公歷日不到春節(jié)日期農(nóng)歷年要比公歷年小一年農(nóng)歷大小月取前一 年的信息農(nóng)歷月從12 月向前推算 公歷日是非常有規(guī)律的所以公歷日所對應(yīng)的星期天可以通過計算直接得到理論上公元0 年1 月1 日為星期日 只要求得公歷日離公元0 年1 月1 日的日子數(shù)除7 后的余數(shù)就是星期天為了簡化計算采用月校正法根據(jù)公歷的 年月日可直接計算出星期天其算法是日期年份所過閏年數(shù)月校正數(shù)之和除7 的余數(shù)就是星期天但如果是在 閏年又不到3 月份上述之和要減一天再除7 其1 12 月的校正數(shù)據(jù)為6 2 2 5 0 3 5 1 4 6 2 4 在 本程序中采用1 個字節(jié)表示年份閏年數(shù)也只計算1900 年以后的閏年數(shù)所以實(shí)際校正數(shù)據(jù)也和上述數(shù)據(jù)不同 - 2 - 三 程序流程 由于星期的計算很簡單這里只提供公歷日轉(zhuǎn)農(nóng)歷日的程序流程圖 否 是 否 是 否 子程序入口 轉(zhuǎn)換數(shù)據(jù)到HEX 格式方便運(yùn)算 根據(jù)公歷年定位數(shù)據(jù)表的地址 從數(shù)據(jù)表中取得春節(jié)的公歷日期,并通過 計算公歷日和春節(jié)離元旦的天數(shù)算出公歷 日離春節(jié)的天數(shù)記為X 農(nóng)歷年=公歷年減 1 數(shù)據(jù)表地址減 3 定位到前一年 取農(nóng)歷月信息 農(nóng)歷月12 閏月標(biāo) 志F0 0 非閏月 X Y 否 公歷日在春節(jié)以后碼? 取農(nóng)歷月天 數(shù)Y 是 X X Y F0 1 是 否 是 農(nóng)歷月減1 農(nóng)歷月閏月 F0 取反 是 否 農(nóng)歷日Y X 1 農(nóng)歷年=公歷年取 農(nóng)歷月信息 農(nóng)歷月1 閏月標(biāo) 志F0 0 非閏月 取農(nóng)歷月 天數(shù)Y X Y X X Y 農(nóng)歷月閏月 農(nóng)歷月加1 F0 1 F0 取反 是 農(nóng)歷日X 1 否 農(nóng)歷年月日數(shù) 據(jù)標(biāo)準(zhǔn)化 子程序出口 - 3 - 四程序使用說明 本文提供的子程序在設(shè)計時應(yīng)用了PCF8563 作時鐘芯片所以其入口格式與PCF8563 芯片的時鐘信號存儲格式完 全一致年月日均為BCD 碼其中月的BIT7 表示世紀(jì)為1 表示19 世紀(jì)為0 表示20 世紀(jì)采用PCF8563 時 鐘芯片只要把它的年月日寄存器內(nèi)容讀出到time_yeAr time_month 和time_date 三個單元內(nèi)即可直接調(diào)用本 程序轉(zhuǎn)換采用其它時鐘芯片調(diào)用前要把時鐘格式稍作調(diào)整或修改一下程序公歷日轉(zhuǎn)農(nóng)歷日程序在12M 晶振下 執(zhí)行時間最長約0.48 毫秒實(shí)際使用時只需在復(fù)位和日期變化時才需要調(diào)用一次對于公歷日轉(zhuǎn)星期天的子程序則 只在設(shè)置時鐘時才有用在設(shè)置時鐘年月日后調(diào)用子程序得到對應(yīng)的星期天直接寫入時鐘即可 子程序附帶了1901-2100 年的農(nóng)歷數(shù)據(jù)表全部編譯要占600 字節(jié)空間如不需這么多可把不需要的數(shù)據(jù)刪除然 后修改stArt_yeAr 值即可stArt_yeAr 定義了查詢表的起始年份 五子程序清單 start_year EQU 01; 定義查詢表起始年份,01--199 表示1901-2099 年 ;以下三單元為需轉(zhuǎn)換的公歷日期是子程序的入口數(shù)據(jù) time_year DATA 30h time_month DATA 31h ;BIT7 表示世紀(jì),為1 表示19 世紀(jì),為0 表示20 世紀(jì) time_date DATA 32h ;以下三單元存轉(zhuǎn)換后農(nóng)歷日期與入口單元重疊,如要保留入口信息,請重定義出口地址 CONvert_yeAr DATA 30h CONvert_mONth DATA 31h ;BIT7 為1 表示閏月 CONvert_dAte DATA 32h temp_Byte1 DATA 37h temp_Byte2 DATA 38h temp_Byte3 DATA 39h temp_Byte4 DATA 3Ah temp_Byte5 DATA 3Bh time_week DATA 40h ;星期天出口 ;以下為公歷轉(zhuǎn)農(nóng)歷子程序 CONvert: MOV A,time_year ;將年月日轉(zhuǎn)化為HEX 格式 MOV B,#16 DIV AB MOV CONvert_yeAr,B MOV B,#10 MUL AB ADD A,CONvert_yeAr MOV CONvert_yeAr,A MOV A,time_month MOV C,ACC.7 MOV f0,C ;f0暫存世紀(jì)標(biāo)志,僅用于數(shù)據(jù)表定位 CLR ACC.7 JNB ACC.4,CON_02 - 4 - CLR ACC.4 ;ACC.4 為1 表示大于10 月 ADD A,#10 CON_02: MOV CONvert_mONth,A MOV A,time_date MOV B,#16 DIV AB MOV CONvert_dAte,B MOV B,#10 MUL AB ADD A,CONvert_dAte MOV CONvert_dAte,A MOV dptr,#mONth_dAtA ;以下定位本年數(shù)據(jù)在表格中的位置 MOV A,CONvert_yeAr JB f0,CON_06 ;當(dāng)前為19 世紀(jì)年跳轉(zhuǎn) ADD A,#100 ;從19 世紀(jì)起定義表格起始年,20 世紀(jì)要加100 年 CON_06: CLR C SUBB A,#stArt_yeAr MOV B,#3 ;表格每年3 字節(jié) MUL AB ADD A,dpl MOV dpl,A MOV A,B ADDC A,dph MOV dph,A MOV A,#2 MOVC A,@A+dptr ;讀本年表格最后一字節(jié)(春節(jié)日期) CLR ACC.7 ;ACC.7 是閏年第13 個月大小,在此不用 MOV B,#32 DIV AB MOV temp_Byte1,A ;春節(jié)月份 MOV temp_Byte2,B ;春節(jié)日 ; 以下計算當(dāng)前日期距元旦天數(shù) MOV temp_Byte3,#0 ;設(shè)距元旦天數(shù)高位為0 MOV A,CONvert_mONth CJNE A,#10,CON_08 CON_08: JC CON_09 ;9月以前日子數(shù)小于256 天,高字節(jié)為0(9 月份過去的整月為8 個月) MOV temp_Byte3,#1 CON_09: MOV A,CONvert_yeAr ANL A,#03h ;ACC 為除4 的余數(shù) JNZ CON_10 ;轉(zhuǎn)常年處理 ; 年除4 余數(shù)為0 是閏年 MOV A,CONvert_mONth - 5 - LCALL get_ruN_dAys_lOw ;取得閏年過去月的天數(shù)的低字節(jié) SJMP CON_12 CON_10: MOV A,CONvert_mONth LCALL get_dAys_lOw ;取得常年過去月的天數(shù)的低字節(jié) CON_12: MOV B,CONvert_dAte DEC B ;因?yàn)槿掌趶? 日起,而不是0 日起 ADD A,B ;過去的整月天數(shù)加當(dāng)月天數(shù) MOV temp_Byte4,A JNC CON_14 INC temp_Byte3 ;temp_Byte3,temp_Byte4 分別為公歷年過去的天數(shù)的高低字節(jié) ; 以下求春節(jié)距元旦天數(shù),因肯定小于256 天所以只用一字節(jié)表示 CON_14: MOV A,temp_Byte1 LCALL get_dAys_lOw ;春節(jié)不會在3 月份,不用考慮閏年 DEC A ;因?yàn)槿掌趶? 日起 ADD A,temp_Byte2 MOV temp_Byte5,A ;temp_Byte5,為春節(jié)距元旦天數(shù) MOV A,CONvert_mONth CJNE A,temp_Byte1,CON_20 ;轉(zhuǎn)換月與春節(jié)月比較 MOV A,CONvert_dAte CJNE A,temp_Byte2,CON_20 ;轉(zhuǎn)換日與春節(jié)日比較 CON_20: JC CON_22 LJMP CON_60 ;當(dāng)前日大于等于春節(jié)日期,公歷年與農(nóng)歷年同年份 CON_22: MOV A,CONvert_yeAr ;不到春節(jié),農(nóng)歷年比公歷年低一年 JNZ CON_24 MOV A,#100 ;年有效數(shù)0-99 CON_24: DEC A MOV CONvert_yeAr,A MOV A,dpl CLR C SUBB A,#3 MOV dpl,A JNC CON_26 DEC dph ;表格指針指向上一年 CON_26: MOV A,temp_Byte5 CLR C SUBB A,temp_Byte4 MOV temp_Byte3,A ;temp_Byte3 中為當(dāng)前日離春節(jié)的天數(shù) MOV CONvert_mONth,#12 ;農(nóng)歷月為12 月 CLR f0 ;1901-2099 年沒有閏12 月,清閏月標(biāo)志 CLR A MOVC A,@A+dptr - 6 - ANL A,#0f0h SWAP A; MOV temp_Byte4,A ;temp_Byte4 中為閏月 JZ CON_30 ;沒有閏月轉(zhuǎn)移 MOV A,#2 ;有閏月,取第13 個月天數(shù) MOVC A,@A+dptr MOV C,ACC.7 MOV A,#1 MOVC A,@A+dptr RLC A ;ACC 中為最后6 個月的大小值 SJMP CON_34 CON_30: MOV A,#1 MOVC A,@A+dptr ;ACC 中為最后6 個月的大小值 CON_34: MOV temp_Byte5,A CON_40: MOV A,temp_Byte5 RRC A MOV temp_Byte5,A JC CON_42 MOV B,#29 ;小月29 天 SJMP CON_44 CON_42: MOV B,#30 ;大月30 天 CON_44: MOV A,temp_Byte3 CLR C SUBB A,B JZ CON_46 ;正好夠減,就是農(nóng)歷日1 日 JNC CON_50 ;不夠減一月天數(shù),結(jié)束農(nóng)歷月調(diào)整 CPL A ;求補(bǔ)取絕對值 INC A CON_46: INC A ;加1 即為農(nóng)歷日 MOV B,#10 ;轉(zhuǎn)換并保存農(nóng)歷日,月,年 DIV AB SWAP A ORL A,B MOV CONvert_dAte,A MOV A,CONvert_mONth MOV B,#10 DIV AB SWAP A ORL A,B MOV C,f0 MOV ACC.7,C MOV CONvert_mONth,A - 7 - MOV A,CONvert_yeAr MOV B,#10 DIV AB SWAP A ORL A,B MOV CONvert_yeAr,A RET ;結(jié)束轉(zhuǎn)換 CON_50: MOV temp_Byte3,A ;temp_Byte3 存減去一月后的天數(shù) JB f0,CON_52 ;是閏月,前推一月,月份不減 DEC CONvert_mONth; CON_52: MOV A,CONvert_mONth CJNE A,temp_Byte4,CON_54 CPL f0 ;當(dāng)前月與閏月相同,更改閏月標(biāo)志 CON_54: SJMP CON_40 CON_60: MOV A,temp_Byte4 ;春節(jié)日小于當(dāng)前日,農(nóng)歷年同公歷年 CLR C SUBB A,temp_Byte5 MOV temp_Byte4,A JNC CON_62 DEC temp_Byte3 ;temp_Byte3 temp_Byte4 中為公歷日離春節(jié)的天數(shù) CON_62: MOV CONvert_mONth,#1 ;農(nóng)歷月為1 月 CLR A MOVC A,@A+dptr MOV temp_Byte5,A ANL A,#0f0h SWAP A; XCH A,temp_Byte5 ;temp_Byte5 中為閏月,ACC 為當(dāng)年農(nóng)歷表第一字節(jié) CLR f0 ;第一個月肯定不是閏月 ANL A,#0fh MOV temp_Byte1,A MOV A,#1 MOVC A,@A+dptr MOV temp_Byte2,A ANL A,#0f0h ORL A,temp_Byte1 SWAP A MOV temp_Byte1,A MOV A,#2 MOVC A,@A+dptr MOV C,ACC.7 MOV A,temp_Byte2 ANL A,#0fh - 8 - SWAP A MOV ACC.3,C; MOV temp_Byte2,A ;以上temp_Byte1,temp_Byte2 各BIT 存農(nóng)歷年大小 CON_70: MOV A,temp_Byte2 RLC A MOV temp_Byte2,A MOV A,temp_Byte1 RLC A MOV temp_Byte1,A JC CON_72 MOV B,#29 ;小月29 天處理 SJMP CON_74 CON_72: MOV B,#30 ;大月30 天 CON_74: MOV A,temp_Byte4 CLR C SUBB A,B JNC CON_78 ;低字節(jié)夠減跳轉(zhuǎn) MOV B,A ;低字節(jié)不夠減, B 暫存減后結(jié)果, MOV A,temp_Byte3 JZ CON_76 ;高字節(jié)為0,不夠減 DEC temp_Byte3 MOV temp_Byte4,B SJMP CON_80 CON_76: MOV A,temp_Byte4 ;不夠減結(jié)束月調(diào)整 LJMP CON_46 ;轉(zhuǎn)日期加1 后,處理并保存轉(zhuǎn)換后農(nóng)歷年月日 CON_78: MOV temp_Byte4,A ;temp_Byte3 temp_Byte4 天數(shù)為減去一月后天數(shù) CON_80: MOV A,CONvert_mONth CJNE A,temp_Byte5,CON_82 CPL f0 ;當(dāng)前月與閏月相同,更改閏月標(biāo)志 JNB f0,CON_82 ;更改標(biāo)志后是非閏月,月份加1 SJMP CON_70 CON_82: INC CONvert_mONth; SJMP CON_70 get_dAys_lOw: MOVC A,@A+PC ;取得常年過去月的天數(shù)的低字節(jié) RET DB 0,31,59,90,120,151,181,212,243,17,48,78 get_ruN_dAys_lOw: MOVC A,@A+PC ;取得閏年過去月的天數(shù)的低字節(jié) RET DB 0,31,60,91,121,152,182,213,244,18,49,79 mONth_dAtA: ;公歷年對應(yīng)的農(nóng)歷數(shù)據(jù),每年三字節(jié), - 9 - ;格式第一字節(jié)BIT7-4 位表示閏月月份,值為0 為無閏月,BIT3-0 對應(yīng)農(nóng)歷第1-4 月的大小 ;第二字節(jié)BIT7-0 對應(yīng)農(nóng)歷第5-12 月大小,第三字節(jié)BIT7 表示農(nóng)歷第13 個月大小 ;月份對應(yīng)的位為1 表示本農(nóng)歷月大(30 天),為0 表示小(29 天). ;第三字節(jié)BIT6-5 表示春節(jié)的公歷月份,BIT4-0 表示春節(jié)的公歷日期 DB 004h,0Aeh,053h; 1901; DB 00Ah,057h,048h; 1902 DB 055h,026h,0Bdh; 1903 DB 00dh,026h,050h; 1904 DB 00dh,095h,044h; 1905 DB 046h,0AAh,0B9h; 1906 DB 005h,06Ah,04dh; 1907 DB 009h,0Adh,042h; 1908 DB 024h,0Aeh,0B6h; 1909 DB 004h,0Aeh,04Ah; 1910 DB 06Ah,04dh,0Beh; 1911 DB 00Ah,04dh,052h; 1912 DB 00dh,025h,046h; 1913 DB 05dh,052h,0BAh; 1914 DB 00Bh,054h,04eh; 1915 DB 00dh,06Ah,043h; 1916 DB 029h,06dh,037h; 1917 DB 009h,05Bh,04Bh; 1918 DB 074h,09Bh,0C1h; 1919 DB 004h,097h,054h; 1920 DB 00Ah,04Bh,048h; 1921 DB 05Bh,025h,0BCh; 1922 DB 006h,0A5h,050h; 1923 DB 006h,0d4h,045h; 1924 DB 04Ah,0dAh,0B8h; 1925 DB 002h,0B6h,04dh; 1926 DB 009h,057h,042h; 1927 DB 024h,097h,0B7h; 1928 DB 004h,097h,04Ah; 1929 DB 066h,04Bh,03eh; 1930 DB 00dh,04Ah,051h; 1931 DB 00eh,0A5h,046h; 1932 DB 056h,0d4h,0BAh; 1933 DB 005h,0Adh,04eh; 1934 DB 002h,0B6h,044h; 1935 DB 039h,037h,038h; 1936 DB 009h,02eh,04Bh; 1937 DB 07Ch,096h,0Bfh; 1938 DB 00Ch,095h,053h; 1939 DB 00dh,04Ah,048h; 1940 - 10 - DB 06dh,0A5h,03Bh; 1941 DB 00Bh,055h,04fh; 1942 DB 005h,06Ah,045h; 1943 DB 04Ah,0Adh,0B9h; 1944 DB 002h,05dh,04dh; 1945 DB 009h,02dh,042h; 1946 DB 02Ch,095h,0B6h; 1947 DB 00Ah,095h,04Ah; 1948 DB 07Bh,04Ah,0Bdh; 1949 DB 006h,0CAh,051h; 1950 DB 00Bh,055h,046h; 1951 DB 055h,05Ah,0BBh; 1952 DB 004h,0dAh,04eh; 1953 DB 00Ah,05Bh,043h; 1954 DB 035h,02Bh,0B8h; 1955 DB 005h,02Bh,04Ch; 1956 DB 08Ah,095h,03fh; 1957 DB 00eh,095h,052h; 1958 DB 006h,0AAh,048h; 1959 DB 07Ah,0d5h,03Ch; 1960 DB 00Ah,0B5h,04fh; 1961 DB 004h,0B6h,045h; 1962 DB 04Ah,057h,039h; 1963 DB 00Ah,057h,04dh; 1964 DB 005h,026h,042h; 1965 DB 03eh,093h,035h; 1966 DB 00dh,095h,049h; 1967 DB 075h,0AAh,0Beh; 1968 DB 005h,06Ah,051h; 1969 DB 009h,06dh,046h; 1970 DB 054h,0Aeh,0BBh; 1971 DB 004h,0Adh,04fh; 1972 DB 00Ah,04dh,043h; 1973 DB 04dh,026h,0B7h; 1974 DB 00dh,025h,04Bh; 1975 DB 08dh,052h,0Bfh; 1976 DB 00Bh,054h,052h; 1977 DB 00Bh,06Ah,047h; 1978 DB 069h,06dh,03Ch; 1979 DB 009h,05Bh,050h; 1980 DB 004h,09Bh,045h; 1981 DB 04Ah,04Bh,0B9h; 1982 DB 00Ah,04Bh,04dh; 1983 DB 0ABh,025h,0C2h; 1984 - 11 - DB 006h,0A5h,054h; 1985 DB 006h,0d4h,049h; 1986 DB 06Ah,0dAh,03dh; 1987 DB 00Ah,0B6h,051h; 1988 DB 009h,037h,046h; 1989 DB 054h,097h,0BBh; 1990 DB 004h,097h,04fh; 1991 DB 006h,04Bh,044h; 1992 DB 036h,0A5h,037h; 1993 DB 00eh,0A5h,04Ah; 1994 DB 086h,0B2h,0Bfh; 1995 DB 005h,0ACh,053h; 1996 DB 00Ah,0B6h,047h; 1997 DB 059h,036h,0BCh; 1998 DB 009h,02eh,050h; 1999 DB 00Ch,096h,045h; 2000 DB 04dh,04Ah,0B8h; 2001 DB 00dh,04Ah,04Ch; 2002 DB 00dh,0A5h,041h; 2003 DB 025h,0AAh,0B6h; 2004 DB 005h,06Ah,049h; 2005 DB 07Ah,0Adh,0Bdh; 2006 DB 002h,05dh,052h; 2007 DB 009h,02dh,047h; 2008 DB 05Ch,095h,0BAh; 2009 DB 00Ah,095h,04eh; 2010 DB 00Bh,04Ah,043h; 2011 DB 04Bh,055h,037h; 2012 DB 00Ah,0d5h,04Ah; 2013 DB 095h,05Ah,0Bfh; 2014 DB 004h,0BAh,053h; 2015 DB 00Ah,05Bh,048h; 2016 DB 065h,02Bh,0BCh; 2017 DB 005h,02Bh,050h; 2018 DB 00Ah,093h,045h; 2019 DB 047h,04Ah,0B9h; 2020 DB 006h,0AAh,04Ch; 2021 DB 00Ah,0d5h,041h; 2022 DB 024h,0dAh,0B6h; 2023 DB 004h,0B6h,04Ah; 2024 DB 069h,057h,03dh; 2025 DB 00Ah,04eh,051h; 2026 DB 00dh,026h,046h; 2027 DB 05eh,093h,03Ah; 2028 - 12 - DB 00dh,053h,04dh; 2029 DB 005h,0AAh,043h; 2030 DB 036h,0B5h,037h; 2031 DB 009h,06dh,04Bh; 2032 DB 0B4h,0Aeh,0Bfh; 2033 DB 004h,0Adh,053h; 2034 DB 00Ah,04dh,048h; 2035 DB 06dh,025h,0BCh; 2036 DB 00dh,025h,04fh; 2037 DB 00dh,052h,044h; 2038 DB 05dh,0AAh,038h; 2039 DB 00Bh,05Ah,04Ch; 2040 DB 005h,06dh,041h; 2041 DB 024h,0Adh,0B6h; 2042 DB 004h,09Bh,04Ah; 2043 DB 07Ah,04Bh,0Beh; 2044 DB 00Ah,04Bh,051h; 2045 DB 00Ah,0A5h,046h; 2046 DB 05Bh,052h,0BAh; 2047 DB 006h,0d2h,04eh; 2048 DB 00Ah,0dAh,042h; 2049 DB 035h,05Bh,037h; 2050 DB 009h,037h,04Bh; 2051 DB 084h,097h,0C1h; 2052 DB 004h,097h,053h; 2053 DB 006h,04Bh,048h; 2054 DB 066h,0A5h,03Ch; 2055 DB 00eh,0A5h,04fh; 2056 DB 006h,0B2h,044h; 2057 DB 04Ah,0B6h,038h; 2058 DB 00Ah,0Aeh,04Ch; 2059 DB 009h,02eh,042h; 2060 DB 03Ch,097h,035h; 2061 DB 00Ch,096h,049h; 2062 DB 07dh,04Ah,0Bdh; 2063 DB 00dh,04Ah,051h; 2064 DB 00dh,0A5h,045h; 2065 DB 055h,0AAh,0BAh; 2066 DB 005h,06Ah,04eh; 2067 DB 00Ah,06dh,043h; 2068 DB 045h,02eh,0B7h; 2069 DB 005h,02dh,04Bh; 2070 DB 08Ah,095h,0Bfh; 2071 DB 00Ah,095h,053h; 2072 - 13 - DB 00Bh,04Ah,047h; 2073 DB 06Bh,055h,03Bh; 2074 DB 00Ah,0d5h,04fh; 2075 DB 005h,05Ah,045h; 2076 DB 04Ah,05dh,038h; 2077 DB 00Ah,05Bh,04Ch; 2078 DB 005h,02Bh,042h; 2079 DB 03Ah,093h,0B6h; 2080 DB 006h,093h,049h; 2081 DB 077h,029h,0Bdh; 2082 DB 006h,0AAh,051h; 2083 DB 00Ah,0d5h,046h; 2084 DB 054h,0dAh,0BAh; 2085 DB 004h,0B6h,04eh; 2086 DB 00Ah,057h,043h; 2087 DB 045h,027h,038h; 2088 DB 00dh,026h,04Ah; 2089 DB 08eh,093h,03eh; 2090 DB 00dh,052h,052h; 2091 DB 00dh,0AAh,047h; 2092 DB 066h,0B5h,03Bh; 2093 DB 005h,06dh,04fh; 2094 DB 004h,0Aeh,045h; 2095 DB 04Ah,04eh,0B9h; 2096 DB 00Ah,04dh,04Ch; 2097 DB 00dh,015h,041h; 2098 DB 02dh,092h,0B5h; 2099 DB 00dh,053h,049h; 2100 ;以下子程序用于從當(dāng)前公歷日期,推算星期, ;入口:time_yeAr,time_month ,time_date ,定義公歷年月日,BCD 碼,其中月的 ;BIT7 表示世紀(jì),0 表示20 世紀(jì),1 表示19 世紀(jì),與PCF8563 一致 ;出口 time_week, 0-6 表示星期日-星期六,與PCF8563 一致,程序不改變?nèi)肟跀?shù)據(jù) ;使用資源:ACC,B,psw,temp_Byte1,temp_Byte2,temp_Byte3 GetWeek: MOV A,time_yeAr MOV B,#16 DIV AB MOV temp_Byte1,B MOV B,#10 MUL AB ADD A,temp_Byte1 MOV temp_Byte1,A ;temp_Byte1=年 MOV A,time_month JB ACC.7,getw02 - 14 - MOV A,#100 ADD A,temp_Byte1 MOV temp_Byte1,A ;20世紀(jì)年+100 MOV A,time_month CLR ACC.7 getw02: JNB ACC.4,getw04 ADD A,#10 CLR ACC.4 getw04: MOV temp_Byte2,A ;temp_Byte2=月 MOV A,time_date MOV B,#16 DIV AB MOV temp_Byte3,B MOV B,#10 MUL AB ADD A,temp_Byte3 MOV temp_Byte3,A ;temp_Byte3=日 MOV A,temp_Byte1; ANL A,#03h JNZ getw10 ;非閏年轉(zhuǎn)移 MOV A,temp_Byte2 CJNE A,#3,getw06 getw06: JNC getw10 ;月大于2 轉(zhuǎn)移 DEC temp_Byte3 ;份小于等于2,又是閏年,日減1 getw10: MOV A,temp_Byte2; LCALL get_CorreCt ;取月校正表數(shù)據(jù) ADD A,temp_Byte1 MOV B,#7 DIV AB ;B放年加校正日數(shù)之和后除7 的余數(shù)不先做這一步 ;有可能數(shù)據(jù)溢出 MOV A,temp_Byte1 ANL A,#0fCh RR A RR A ;以上年除4 即閏年數(shù) ADD A,B ADD A,temp_Byte3 MOV B,#7 DIV AB MOV time_week,B RET get_COrreCt: MOVC A,@A+PC RET DB 0,3,3,6,1,4,6,2,5,0,3,5 |
|