?? lunar.lst
字號:
202 0x06,0xAA,0x51, //2083
203 0x0A,0xd5,0x46, //2084
204 0x54,0xdA,0xBA, //2085
205 0x04,0xB6,0x4e, //2086
206 0x0A,0x57,0x43, //2087
207 0x45,0x27,0x38, //2088
208 0x0d,0x26,0x4A, //2089
209 0x8e,0x93,0x3e, //2090
210 0x0d,0x52,0x52, //2091
211 0x0d,0xAA,0x47, //2092
212 0x66,0xB5,0x3B, //2093
213 0x05,0x6d,0x4f, //2094
214 0x04,0xAe,0x45, //2095
215 0x4A,0x4e,0xB9, //2096
216 0x0A,0x4d,0x4C, //2097
217 0x0d,0x15,0x41, //2098
218 0x2d,0x92,0xB5, //2099
219 0x0d,0x53,0x49, //2100
220 };
221
222 uchar code Mon1[2][13]={0,31,28,31,30,31,30,31,31,30,31,30,31,
223 0,31,29,31,30,31,30,31,31,30,31,30,31};
224
225
226
227 SPDATE Spdate;
228 //獲得當年春節的公曆日期
229 SPDATE GetSpringDay(uchar GreYear,uchar GreMon,uchar GreDay)
230 {
231 1 //第三字節BIT6-5 表示春節的公歷月份,BIT4-0 表示春節的公歷日期
232 1 //0x09,0x2d,0x47, //2008 0x47 01000111
233 1 int day;
234 1 uchar i,Flag,F;
235 1 uchar Offset1;
236 1 unsigned char L=0x01,Flag1=1;
237 1 unsigned int Temp16,L1=0x0800;
238 1
239 1 Spdate.cYear=GreYear ;
240 1 Spdate.cMon=(Data[(200-(100-GreYear)-1)*3+2]&0x60)>>5; //春節公歷月份
241 1 Spdate.cDay=(Data[(200-(100-GreYear)-1)*3+2])&0x1f; //春節公歷日期
C51 COMPILER V8.08 LUNAR 07/29/2008 20:05:46 PAGE 5
242 1
243 1
244 1 if( (!(GreYear%4) && (GreYear%100)) || !(GreYear%400) ) Flag=1; else Flag=0;
245 1
246 1 if(Spdate.cMon>GreMon) //春節離公歷日期的天數
247 1 {
248 2 day=Mon1[Flag][GreMon]-GreDay;
249 2 for(i=GreMon+1;i<=Spdate.cMon-1;i++)
250 2 day+=Mon1[Flag][i];
251 2 day+=Spdate.cDay;
252 2 F=1;
253 2 }
254 1 else if(Spdate.cMon<GreMon) //春節的月份小於目標的月份
255 1 {
256 2 day=Mon1[Flag][Spdate.cMon]-Spdate.cDay;
257 2 for(i=Spdate.cMon+1;i<=GreMon-1;i++)
258 2 day+=Mon1[Flag][i];
259 2 day+=GreDay;
260 2 // day=-day;
261 2 F=0;
262 2 }
263 1 else
264 1 {
265 2 //if(Spdate.cDay!=GreDay) day=Spdate.cDay-GreDay; else day=0;
266 2 if(Spdate.cDay>GreDay)
267 2 {
268 3 day=Spdate.cDay-GreDay;
269 3 F=1;
270 3 }
271 2 else if(Spdate.cDay<GreDay)
272 2 {
273 3 day=GreDay-Spdate.cDay;
274 3 F=0;
275 3 }
276 2 else day=0;
277 2 }
278 1
279 1 Spdate.cYear=Spdate.cYear;
280 1 Spdate.cMon=1;
281 1 Spdate.cDay=1;
282 1
283 1 if(!day) return Spdate ;
284 1
285 1 if(F) //春節在公歷日期后
286 1 {
287 2 Spdate.cYear--;
288 2 Spdate.cMon=12;
289 2 Offset1=(200-(100-Spdate.cYear)-1)*3;
290 2 while(TRUE)
291 2 {
292 3 //格式第一字節BIT7-4 位表示閏月月份,值為0 為無閏月,BIT3-0 對應農歷第1-4 月的大小
293 3 //第二字節BIT7-0 對應農歷第5-12 月大小,第三字節BIT7 表示農歷第13 個月大小
294 3 //0x4d,0x4A,0xB8, //2001
295 3 if(Data[Offset1+1]&L)
296 3 day-=30;
297 3 else
298 3 day-=29;
299 3 L<<=1;
300 3 if(((Data[Offset1+0]&0xf0)>>4)==Spdate.cMon && Flag1)
301 3 {
302 4 Flag1=0;
303 4 if(Data[Offset1+2]&0x80) day-=30; else day-=29;
C51 COMPILER V8.08 LUNAR 07/29/2008 20:05:46 PAGE 6
304 4 //day-=LYDay;
305 4 //if(day<0) break;
306 4 continue;
307 4 }
308 3 if(day>0) Spdate.cMon--; else break;
309 3
310 3
311 3 }
312 2 // if(Flag) LunarDate.Month++;
313 2 Spdate.cDay=-day+1;
314 2 }
315 1
316 1 if(!F)
317 1 {
318 2 // day=-day;
319 2 //0x09,0x2d,0x47, //2008
320 2 Spdate.cMon=1;
321 2 Offset1=(200-(100-Spdate.cYear)-1)*3;
322 2 Temp16=(Data[Offset1+0]<<8)+Data[Offset1+1];
323 2 while(TRUE)
324 2 {
325 3 if(Temp16 & L1) day-=30; else day-=29;
326 3 if(day>=0)
327 3 Spdate.cMon++;
328 3 else if(day<0)
329 3 {
330 4 if(Temp16 & L1) day+=30; else day+=29;
331 4 break;
332 4 }
333 3 L1>>=1;
334 3 //格式第一字節BIT7-4 位表示閏月月份,值為0 為無閏月,BIT3-0 對應農歷第1-4 月的大小
335 3 //第二字節BIT7-0 對應農歷第5-12 月大小,第三字節BIT7 表示農歷第13 個月大小
336 3 if(((Data[Offset1+0]&0xf0)>>4)==(Spdate.cMon-1) && Flag1) //閏月
337 3 {
338 4 Flag1=0;
339 4 Spdate.cMon--;
340 4 if(Temp16 & L1) day-=30; else day-=29;
341 4 if(day>=0)
342 4 Spdate.cMon++;
343 4 else if(day<0)
344 4 {
345 5 if(Temp16 & L1) day+=30; else day+=29;
346 5 break;
347 5 }
348 4 L1>>1;
*** WARNING C275 IN LINE 348 OF LUNAR.C: expression with possibly no effect
349 4 }
350 3 //Temp16=
351 3 }
352 2 //LunarDate.Month--;
353 2 Spdate.cDay=day+1;
354 2 }
355 1 return Spdate;
356 1 }
357
358 bit YearFlag(uchar cYear)
359 {
360 1 if( (!(cYear%4) && (cYear%100)) || !(cYear%400) ) return 1; else return 0;
361 1 }
362
363 //目標日期是星期幾
364 uchar GetWeekDay(uchar cYear,uchar cMon,uchar cDay)
C51 COMPILER V8.08 LUNAR 07/29/2008 20:05:46 PAGE 7
365 {
366 1 char i;
367 1 int Sum=0,tmpyear=2000+cYear;
368 1 for(i=1;i<=cMon-1;i++)
369 1 Sum+=Mon1[YearFlag(cYear)][i];
370 1 Sum+=cDay-1;
371 1
372 1 return (((tmpyear-1)+(tmpyear-1)/4-(tmpyear-1)/100+(tmpyear-1)/400+Sum)%7)+1;
373 1 }
374
375
376
377 /*****************************************************************************
378
379 首先要能記住十大天干和十二地支,
380 十天干: 甲、乙、丙、丁、戊、己、庚、辛、壬、癸;
381 十二地支:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥;
382
383 天干地支紀年法首先是天干在前,地支在后,比如今年2005就為-乙酉年,先來算算天干,
384 有個公式:
385 4、 5、 6、 7、 8、 9、 0、 1、 2、 3 對應的十天干就是
386 甲、乙、丙、丁、戊、己、庚、辛、壬、癸,
387 數字為年代的最后的一位數字,比如今年是2005,最后一位是5,對應的天干就是乙;
388
389 地支的算法:用年代數除以12,后面的余數就代表某個地支,
390 余數分別為:4、 5、 6、 7、 8、 9、 10、 11、 0(能整除)、1、 2、3.
391 代表地支為:子、丑、寅、卯、辰、巳、午、 未、 申、酉、戌、亥.
392 比如2005年為例:年代末尾數為5,對應的天干為乙,2005除以12,余數為1,對應的地支為酉,所以2005年為乙酉年。
393
394 ******************************************************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1065 ----
CONSTANT SIZE = 626 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 15
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -