📄 disk.lst
字号:
C51 COMPILER V8.08 DISK 08/21/2011 19:21:23 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE DISK
OBJECT MODULE PLACED IN DISK.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE DISK.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*-------------------------------------
2 程序功能:万年历
3 硬件连接:输出(PO连接J3,P1.0连接位码,P1.1连接段码)
4 独立按键输入(P2连接K1--8,但是只用到了端口低位4个)
5 --------------------------------------*/
6
7
8 #include<reg52.h>
9 #define uint unsigned int
10 #define uchar unsigned char
11 #define ulong unsigned long
12 #define InPut P2
13 #define DataOut P0
14
15 sbit SegDat=P1^0;
16 sbit SegCs=P1^1;
17
18 ulong JBit;
19 uint KeyData,CsCount,JChoose,i;
20 uint TimeCount,SecondData,MinuteData,HourData;DayData,MonthData,YearDataL,YearDataH;
21 bit JDisplay;
22
23 uint ReadKey();
24
25
26 DisplayData [8];
27 CsData [9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x67};
28
29 uchar code tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
30 /*0 1 2 3 4 5 6 7 8 9 共阴*/
31
32 //*****时间模式*****
33 TimeDisplay()
34 {DisplayData [0]=tab[HourData/10];
35 1 DisplayData [1]=tab[HourData%10];
36 1 DisplayData [2]=0x40;
37 1 DisplayData [3]=tab[MinuteData/10];
38 1 DisplayData [4]=tab[MinuteData%10];
39 1 DisplayData [5]=0x40;
40 1 DisplayData [6]=tab[SecondData/10];
41 1 DisplayData [7]=tab[SecondData%10]; //送入显示数据
42 1 if(JChoose==1) //小时修改
43 1 {if(KeyData==0xfb)
44 2 {KeyData=0xff,HourData++;}
45 2 if(KeyData==0xf7)
46 2 {KeyData=0xff,HourData--;}
47 2
48 2 if(SecondData%2==0) //光标闪烁
49 2 {DisplayData [0]=0x00;
50 3 DisplayData [1]=0x00;}
51 2 }
52 1 else if(JChoose==2) //分钟修改
53 1 {if(KeyData==0xfb)
54 2 {KeyData=0xff,MinuteData++;}
55 2 if(KeyData==0xf7)
C51 COMPILER V8.08 DISK 08/21/2011 19:21:23 PAGE 2
56 2 {KeyData=0xff,MinuteData--;}
57 2
58 2 if(SecondData%2==0) //光标闪烁
59 2 {DisplayData [3]=0x00;
60 3 DisplayData [4]=0x00;}
61 2 }
62 1 else JChoose=0;
63 1 }
64 //*****日期模式*****
65 DateDisplay()
66 {DisplayData [0]=tab[2];
67 1 DisplayData [1]=tab[0];
68 1 DisplayData [2]=tab[YearDataL/10];
69 1 DisplayData [3]=tab[YearDataL%10];
70 1 DisplayData [4]=tab[MonthData/10];
71 1 DisplayData [5]=tab[MonthData%10];
72 1 DisplayData [6]=tab[DayData/10];
73 1 DisplayData [7]=tab[DayData%10]; //送入显示数据
74 1 if(JChoose==1) //年份修改
75 1 {if(KeyData==0xfb)
76 2 {KeyData=0xff,YearDataL++;}
77 2 if(KeyData==0xf7)
78 2 {KeyData=0xff,YearDataL--;}
79 2
80 2 if(SecondData%2==0)
81 2 {DisplayData [0]=0x00;
82 3 DisplayData [1]=0x00;
83 3 DisplayData [2]=0x00;
84 3 DisplayData [3]=0x00;}
85 2 }
86 1 else if(JChoose==2) //月份修改
87 1 {if(KeyData==0xfb)
88 2 {KeyData=0xff,MonthData++;}
89 2 if(KeyData==0xf7)
90 2 {KeyData=0xff,MonthData--;}
91 2
92 2 if(SecondData%2==0)
93 2 {DisplayData [4]=0x00;
94 3 DisplayData [5]=0x00;}
95 2 }
96 1 else if(JChoose==3) //日期修改
97 1 {if(KeyData==0xfb)
98 2 {KeyData=0xff,DayData++;}
99 2 if(KeyData==0xf7)
100 2 {KeyData=0xff,DayData--;}
101 2
102 2 if(SecondData%2==0)
103 2 {DisplayData [6]=0x00;
104 3 DisplayData [7]=0x00;}
105 2 }
106 1 else JChoose=0;
107 1 }
108
109 //////////菜单判断系统////////////////
110 DisplaySystem()
111 { if(KeyData==0xfe) //判断菜单按键
112 1 {JDisplay=~JDisplay;
113 2 KeyData=0xff;}
114 1 else if(KeyData==0xfd) //判断修改按键
115 1 {JChoose++;
116 2 KeyData=0xff;}
117 1 else;
C51 COMPILER V8.08 DISK 08/21/2011 19:21:23 PAGE 3
118 1
119 1 if(JDisplay==0)
120 1 {TimeDisplay();} //时间模式
121 1 else
122 1 {DateDisplay();} //日期模式
123 1 }
124
125
126 ////////时间判断系统////////////////
127 HourSystem() //小时判断
128 { if(SecondData==60)
129 1 {SecondData=0;
130 2 MinuteData++;}
131 1 else if(SecondData>60)
132 1 {SecondData=0;}
133 1 else;
134 1
135 1 if(MinuteData==60)
136 1 {MinuteData=0;
137 2 HourData++;}
138 1 else if(MinuteData>60)
139 1 {MinuteData=0;}
140 1 else;
141 1
142 1 if(HourData>24)
143 1 {HourData=0;
144 2 DayData++;}
145 1 else;
146 1 }
147
148 /////////////日期判断系统///////////
149 DaySystem()
150 { if(MonthData<7&MonthData>0) //1~7月
151 1 {if(MonthData==2) //2月
152 2 {if(YearDataL%4==0) //润年
153 3 {if(DayData>29)
154 4 {DayData=1;
155 5 MonthData++;}
156 4 else if(DayData==0)
157 4 {DayData=1;}
158 4 else;
159 4 }
160 3 else //平年
161 3 {if(DayData>28)
162 4 {DayData=1;
163 5 MonthData++;}
164 4 else if(DayData==0)
165 4 {DayData=1;}
166 4 else;
167 4 }
168 3 }
169 2
170 2
171 2 if(MonthData%2==0&MonthData!=2) //小月
172 2 {if(DayData>30)
173 3 {DayData=1;
174 4 MonthData++;}
175 3 else if(DayData==0)
176 3 {DayData=1;}
177 3 else;
178 3 }
179 2 else //大月
C51 COMPILER V8.08 DISK 08/21/2011 19:21:23 PAGE 4
180 2 {if(DayData>31)
181 3 {DayData=1;
182 4 MonthData++;}
183 3 else if(DayData==0)
184 3 {DayData=1;}
185 3 else;
186 3 }
187 2 }
188 1
189 1
190 1 else if(MonthData>=7&MonthData<=12)//8~12月
191 1 {if(MonthData%2==0) //大月
192 2 {if(DayData>31)
193 3 {DayData=1;
194 4 MonthData++;}
195 3 else if(DayData==0)
196 3 {DayData=1;}
197 3 else;
198 3 }
199 2
200 2 else //小月
201 2 {if(DayData>30)
202 3 {DayData=1;
203 4 MonthData++;}
204 3 else if(DayData==0)
205 3 {DayData=1;}
206 3 else;
207 3 }
208 2
209 2 }
210 1 else if(MonthData==13) //月份进位
211 1 {MonthData=1;
212 2 YearDataL++;}
213 1 else {MonthData=1;}//超出范围
214 1 }
215
216 ///////////年份判断系统/////////////
217 YearSystem()
218 {if(YearDataL>50)
219 1 {YearDataL=50;}
220 1 else if(YearDataL<0)
221 1 {YearDataL=0;}
222 1 else ;
223 1 }
224 ///////////按键////////////
225 KeyScan()
226 { if(ReadKey()!=0xff)
227 1 {JBit++;
228 2 if(JBit==10) //短按防抖
229 2 {KeyData=ReadKey();}
230 2 else if(JBit%50==0) //长按加1
231 2 {KeyData=ReadKey();}
232 2 else;
233 2 }
234 1 else {JBit=0;}
235 1 }
236
237 uint ReadKey() //键值读取
238 { uint tempkey;
239 1 InPut=0xff;
240 1 tempkey=InPut;
241 1 return (tempkey);
C51 COMPILER V8.08 DISK 08/21/2011 19:21:23 PAGE 5
242 1 }
243 //*****显示
244 Display()
245 { while(CsCount<8)
246 1 { DataOut=DisplayData[CsCount]; //送数据
247 2 SegDat=1;
248 2 SegDat=0;
249 2
250 2 DataOut=CsData[CsCount]; //送位码
251 2 SegCs=1;
252 2 SegCs=0;
253 2
254 2 for(i=0;i<100;i++); //循环写入
255 2
256 2 DataOut=0xff;
257 2 SegCs=1;
258 2 SegCs=0;
259 2 CsCount++;
260 2
261 2 }
262 1 CsCount=0;
263 1 }
264
265
266 main()
267 { TMOD=0x01;
268 1 TH0=(65539-50000)/256;
269 1 TL0=(65539-50000)%256;
270 1 EA=1;
271 1 ET0=1;
272 1 TR0=1;
273 1 //*****************************
274 1 while(1)
275 1 {HourSystem();
276 2 DaySystem();
277 2 YearSystem();
278 2 KeyScan();
279 2 DisplaySystem();
280 2 Display();
281 2 }
282 1 }
283 ////////定时中断///////////////
284 void Time() interrupt 1
285 { TH0=(65536-50000)/256;
286 1 TL0=(65536-50000)%256;
287 1 TimeCount++;
288 1 if(TimeCount==20)
289 1 {SecondData++;
290 2 TimeCount=0;}
291 1 else;
292 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1593 ----
CONSTANT SIZE = 10 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 62 ----
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILER V8.08 DISK 08/21/2011 19:21:23 PAGE 6
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -