📄 suanfa.lst
字号:
C51 COMPILER V3.20, SN-0 SUANFA 10/29/04 17:31:34 PAGE 1
DOS C51 COMPILER V3.20, COMPILATION OF MODULE SUANFA
OBJECT MODULE PLACED IN SUANFA.OBJ
COMPILER INVOKED BY: C:\C51\BIN\C51.EXE SUANFA.C DB OE SMALL ROM(LARGE)
stmt level source
1 /*新编万年历星期速算法C语言的实现 */
2
3
4 #include <stdio.h>
5
6 code unsigned char WeekTab[] = {/*闰年月星期表*/
7 (3 << 5) + 31,/*1月*/
8 (6 << 5) + 29,/*2月*/
9 (0 << 5) + 31,/*3月*/
10 (3 << 5) + 30,/*4月*/
11 (5 << 5) + 31,/*5月*/
12 (1 << 5) + 30,/*6月*/
13 (3 << 5) + 31,/*7月*/
14 (6 << 5) + 31,/*8月*/
15 (1 << 5) + 30,/*9月*/
16 (4 << 5) + 31,/*10月*/
17 (0 << 5) + 30,/*11月*/
18 (2 << 5) + 31 /*12月*/
19 };
20
21 /*------------------------------------------------------------------------------
----------
2000年~2099年星期算法
--------------------------------------------------------------------------------
---------*/
26 unsigned char WeekDay20(unsigned char y, unsigned char m, unsigned char d)
27 {
28 1 unsigned char week, day;
29 1 day = WeekTab[m - 1]; /*月表*/
30 1 week = day >> 5;/*月星期数*/
31 1 day &= 0x1f;/*月天数*/
32 1 if ((m < 3) && (y & 0x03)){/*平年*/
33 2 if (m == 2) day--;/*平年月天数*/
34 2 week++;/*平年月表+1*/
35 2 }
36 1 y = y + (y >> 2);/*年+年/4*/
37 1 week = (week + y + d + 2) % 7;/*(星期=年+年/4+月表+2日)%7*/
38 1 return (week << 5) | day;/*返回星期和月天数*/
39 1 }
40
41 /*------------------------------------------------------------------------------
----------
0000年~9999年星期算法
--------------------------------------------------------------------------------
---------*/
46 unsigned char WeekDay(unsigned char c, unsigned char y, unsigned char m,
47 unsigned char d)
48 {
49 1 unsigned char week, day;
50 1 c &= 0x03;/*百年%4*/
51 1 c = c | (c << 2);/*百年%4*5*/
52 1 day = WeekTab[m - 1];/*月表*/
53 1 week = day >> 5;/*月星期数*/
54 1 day &= 0x1f;/*月天数*/
55 1 if ((m < 3) && !((c == 0) | (y & ((y & 0x03) == 0)))){/*平年*/
C51 COMPILER V3.20, SN-0 SUANFA 10/29/04 17:31:34 PAGE 2
56 2 if (m == 2) day--;/*平年月天数*/
57 2 week++;/*平年月表+1*/
58 2 }
59 1 y = y + (y >> 2);/*年+年/4*/
60 1 week = (week + c + y + d + 2) % 7;/*(星期=百年%4*5+年+年/4+月表+日+2)%7*/
61 1 return (week << 5) | day;/*返回星期和月天数*/
62 1 }
63
64 unsigned char BcdToBin(unsigned char val)
65 {
66 1 val = (val >> 4) * 10 + (val & 0x0f);/*将BCD码转换为10进制数*/
67 1 return val;/*返回10进制数*/
68 1 }
69
70 void main(void)
71 {
72 1 unsigned char c, y, m, d;
73 1 unsigned char cx, yx, mx, dx;
74 1 unsigned char WDay, Week, Day;
75 1 /*---------------------------------------------------------
0001年1月1日 星期天
---------------------------------------------------------*/
78 1 c = 0x01;
79 1 y = 0x01;
80 1 m = 0x01;
81 1 d = 0x01;
82 1 cx = BcdToBin(c);/*百年*/
83 1 yx = BcdToBin(y);/*年*/
84 1 mx = BcdToBin(m);/*月*/
85 1 dx = BcdToBin(d);/*日*/
86 1 WDay = WeekDay(cx, yx, mx, dx);/*取星期和月天数*/
87 1 Week = WDay >> 5;/*得到星期*/
88 1 Day = WDay & 0x1f;/*得到最大月天数*/
89 1 /*---------------------------------------------------------
1918年1月21日 星期一
---------------------------------------------------------*/
92 1 c = 0x19;
93 1 y = 0x18;
94 1 m = 0x01;
95 1 d = 0x21;
96 1 cx = BcdToBin(c);/*百年*/
97 1 yx = BcdToBin(y);/*年*/
98 1 mx = BcdToBin(m);/*月*/
99 1 dx = BcdToBin(d);/*日*/
100 1 WDay = WeekDay(cx, yx, mx, dx);/*取星期和月天数*/
101 1 Week = WDay >> 5;/*得到星期*/
102 1 Day = WDay & 0x1f;/*得到最大月天数*/
103 1 /*---------------------------------------------------------
9999年12月31日 星期天
---------------------------------------------------------*/
106 1 c = 0x00;
107 1 y = 0x01;
108 1 m = 0x01;
109 1 d = 0x01;
110 1 cx = BcdToBin(c);/*百年*/
111 1 yx = BcdToBin(y);/*年*/
112 1 mx = BcdToBin(m);/*月*/
113 1 dx = BcdToBin(d);/*日*/
114 1 WDay = WeekDay(cx, yx, mx, dx);/*取星期和月天数*/
115 1 Week = WDay >> 5;/*得到星期*/
116 1 Day = WDay & 0x1f;/*得到最大月天数*/
117 1 /*---------------------------------------------------------
C51 COMPILER V3.20, SN-0 SUANFA 10/29/04 17:31:34 PAGE 3
2004年6月18日 星期五
---------------------------------------------------------*/
120 1 c = 0x20;
121 1 y = 0x04;
122 1 m = 0x06;
123 1 d = 0x18;
124 1 cx = BcdToBin(c);/*百年*/
125 1 yx = BcdToBin(y);/*年*/
126 1 mx = BcdToBin(m);/*月*/
127 1 dx = BcdToBin(d);/*日*/
128 1 WDay = WeekDay20(yx, mx, dx);/*取星期和月天数*/
129 1 Week = WDay >> 5;/*得到星期*/
130 1 Day = WDay & 0x1f;/*得到最大月天数*/
131 1 /*---------------------------------------------------------
2018年3月8日 星期四
---------------------------------------------------------*/
134 1 c = 0x20;
135 1 y = 0x18;
136 1 m = 0x03;
137 1 d = 0x08;
138 1 cx = BcdToBin(c);/*百年*/
139 1 yx = BcdToBin(y);/*年*/
140 1 mx = BcdToBin(m);/*月*/
141 1 dx = BcdToBin(d);/*日*/
142 1 WDay = WeekDay20(yx, mx, dx);/*取星期和月天数*/
143 1 Week = WDay >> 5;/*得到星期*/
144 1 Day = WDay & 0x1f;/*得到最大月天数*/
145 1 while(1);
146 1 }
147
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 501 ----
CONSTANT SIZE = 12 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 15
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -