📄 clock.lst
字号:
C51 COMPILER V6.14 CLOCK 07/01/2001 11:17:50 PAGE 1
C51 COMPILER V6.14, COMPILATION OF MODULE CLOCK
OBJECT MODULE PLACED IN .\clock.OBJ
COMPILER INVOKED BY: E:\KEIL\C51\BIN\C51.EXE .\clock.c DEBUG OBJECTEXTEND
stmt level source
1 /************************************************************/
2 /* 广州天河双龙电子有限公司 */
3 /* http://www.sl.com.cn */
4 /* 电脑时钟演示程序(KEIL 51版本) */
5 /* 程序作者:詹卫前 */
6 /* 接线方式:CS=P2.4 CLK=P2.3 DATA=P2.2 KEY=P2.1 */
7 /* 处理器:AT89C51 晶振频率:8MHZ */
8 /* SL279 晶振频率:12MHZ */
9 /************************************************************/
10 #include<at89x51.h>
11 sbit cs=P2^4;
12 sbit clk=P2^3;
13 sbit dat=P2^2;
14 sbit key=P2^1;
15 sbit bp=P2^0;
16 unsigned char flag=0;//时间刷新标志
17 unsigned char dflag=0;//计数方向标志
18 unsigned char count=20;
19 /* 定义结构体time */
20 struct time
21 {
22 signed char second;
23 signed char minute;
24 signed char hour;
25 } time;
26 /* 90us延时程序 */
27 void delay_90us(void)
28 {
29 1 unsigned char i;
30 1 for (i=0;i<18;i++)
31 1 ;
32 1 }
33 /* 10us延时程序 */
34 void delay_10us(void)
35 {
36 1 unsigned char i;
37 1 for (i=0;i<1;i++)
38 1 ;
39 1 }
40 /* ms级延时程序 */
41 void delay_ms(unsigned int number)
42 {
43 1 unsigned char i;
44 1 do
45 1 {
46 2 for(i=0;i<11;i++)
47 2 delay_90us();
48 2 }
49 1 while(--number!=0);
50 1 }
51 /* 字节发送函数 */
52 void send_byte( unsigned char para)
53 {
54 1 unsigned char i;
55 1 cs=0;
C51 COMPILER V6.14 CLOCK 07/01/2001 11:17:50 PAGE 2
56 1 delay_90us();
57 1 for (i=0;i<8;i++)
58 1 {
59 2 if (para&0x80)
60 2 {
61 3 dat=1;
62 3 }
63 2 else
64 2 {
65 3 dat=0;
66 3 }
67 2 clk=1;
68 2 delay_10us();
69 2 clk=0;
70 2 delay_10us();
71 2 para=para<<1;
72 2 }
73 1 dat=0;
74 1 clk=0;
75 1 }
76 /* 字节接收函数 */
77 unsigned char receive_byte(void)
78 {
79 1 unsigned char i, temp;
80 1 dat=1;
81 1 delay_90us();
82 1 for (i=0;i<8;i++)
83 1 {
84 2 clk=1;
85 2 delay_10us();
86 2 temp=temp<<1;
87 2 if (dat)
88 2 {
89 3 temp=temp|0x01;
90 3 }
91 2 clk=0;
92 2 delay_10us();
93 2 }
94 1 dat=0;
95 1 return (temp);
96 1 }
97 /* 写sl279双字节命令 */
98 void write279(unsigned char cmd1, unsigned char cmd2)
99 {
100 1 send_byte (cmd1);
101 1 send_byte (cmd2);
102 1 cs=1;
103 1 }
104 /*在启动时设置时间,按shift键后进入计时状态*/
105 void initdis()
106 {
107 1 unsigned char i=7;
108 1 unsigned char keyval=0;
109 1 write279(0xc8,0);
110 1 write279(0xc9,0);
111 1 write279(0x92,1);
112 1 write279(0xcb,0);
113 1 write279(0xcc,0);
114 1 write279(0x95,1);
115 1 write279(0xce,0);
116 1 write279(0xcf,0);
117 1 write279(0x88,0x7f);
C51 COMPILER V6.14 CLOCK 07/01/2001 11:17:50 PAGE 3
118 1 do
119 1 {
120 2 while(key!=0)
121 2 ;
122 2 send_byte(0x15);
123 2 keyval=receive_byte();
124 2 cs=1;
125 2 switch (i)
126 2 {
127 3 case 7:{
128 4 if(keyval<3)
129 4 {
130 5 write279(0xc8+i,keyval);
131 5 i--;
132 5 write279(0x88,0xbf);
133 5 time.hour=time.hour%10+keyval*10;
134 5 }
135 4 break;
136 4 }
137 3 case 6:{
138 4 if(keyval<10)
139 4 {
140 5 if((time.hour<20)|(keyval<4))
141 5 {
142 6 write279(0xc8+i,keyval);
143 6 i--;
144 6 i--;
145 6 write279(0x88,0xef);
146 6 time.hour=(time.hour/10)*10+keyval;
147 6 }
148 5 }
149 4 break;
150 4 }
151 3 case 4:{
152 4 if(keyval<6)
153 4 {
154 5 write279(0xc8+i,keyval);
155 5 i--;
156 5 write279(0x88,0xf7);
157 5 time.minute=time.minute%10+keyval*10;
158 5 }
159 4 break;
160 4 }
161 3 case 3:{
162 4 if(keyval<10)
163 4 {
164 5 write279(0xc8+i,keyval);
165 5 i--;
166 5 i--;
167 5 write279(0x88,0xfd);
168 5 time.minute=(time.minute/10)*10+keyval;
169 5 }
170 4 break;
171 4 }
172 3 case 1:{
173 4 if(keyval<6)
174 4 {
175 5 write279(0xc8+i,keyval);
176 5 i--;
177 5 write279(0x88,0xfe);
178 5 time.second=time.second%10+keyval*10;
179 5 }
C51 COMPILER V6.14 CLOCK 07/01/2001 11:17:50 PAGE 4
180 4 break;
181 4 }
182 3 case 0:{
183 4 if(keyval<10)
184 4 {
185 5 write279(0xc8+i,keyval);
186 5 i=7;
187 5 write279(0x88,0x7f);
188 5 time.second=(time.second/10)*10+keyval;
189 5 }
190 4 break;
191 4 }
192 3 }
193 2 while(key==0)//按键释放检查
194 2 ;
195 2 }
196 1 while(keyval!=0x17);
197 1 write279(0x88,0xff);
198 1 }
199 /* 设置定时器1及中断系统 */
200 void opentime()
201 {
202 1 TMOD=0x11;
203 1 TL1=101;
204 1 TH1=253;
205 1 TL0=202;
206 1 TH0=125;
207 1 TR0=1;
208 1 TR1=1;
209 1 IE=0x82;
210 1 IP=0x02;
211 1 }
212 /* 显示刷新 */
213 void display(void)
214 {
215 1 write279(0xc8,time.second%10);
216 1 write279(0xc9,time.second/10);
217 1 write279(0x92,1);
218 1 write279(0xcb,time.minute%10);
219 1 write279(0xcc,time.minute/10);
220 1 write279(0x95,1);
221 1 write279(0xce,time.hour%10);
222 1 write279(0xcf,time.hour/10);
223 1 }
224 /* 正计时 */
225 void inctime(void)
226 {
227 1 if(time.second<59)
228 1 time.second++;
229 1 else
230 1 {
231 2 time.second=0;
232 2 if(time.minute<59)
233 2 time.minute++;
234 2 else
235 2 {
236 3 time.minute=0;
237 3 if(time.hour<23)
238 3 time.hour++;
239 3 else
240 3 time.hour=0;
241 3 }
C51 COMPILER V6.14 CLOCK 07/01/2001 11:17:50 PAGE 5
242 2 }
243 1 }
244 /* 倒计时 */
245 void dectime(void)
246 {
247 1 if(time.second>0)
248 1 time.second--;
249 1 else
250 1 {
251 2 time.second=59;
252 2 if(time.minute>0)
253 2 time.minute--;
254 2 else
255 2 {
256 3 time.minute=59;
257 3 if(time.hour>0)
258 3 time.hour--;
259 3 else
260 3 time.hour=23;
261 3 }
262 2 }
263 1 }
264 /*启动时为正计时,按shift键进行正计时和倒计时切换 */
265 /*启动时允许整点报时,按0~F中任意键一次关闭,二次打开*/
266 void main(void)
267 {
268 1 unsigned char temp,bpflag=0;
269 1 delay_ms(30);
270 1 send_byte(0xa4);
271 1 cs=1;
272 1 initdis();
273 1 opentime();
274 1 while(1)
275 1 {
276 2 if(flag==0x01)
277 2 {
278 3 if(dflag==0)
279 3 inctime();
280 3 else
281 3 dectime();
282 3 display();
283 3 flag=0;
284 3 }
285 2 if(key==0)//检查shift按键
286 2 {
287 3 send_byte(0x15);
288 3 temp=receive_byte();
289 3 cs=1;
290 3 if(temp==0x17)
291 3 {
292 4 if (dflag==0)
293 4 dflag=1;
294 4 else
295 4 dflag=0;
296 4 }
297 3 else
298 3 bpflag^=0x01;
299 3 while(key==0)
300 3 ;
301 3 }
302 2 if ((time.minute==0)&(bpflag==0))
303 2 ET1=1; //整点报时
C51 COMPILER V6.14 CLOCK 07/01/2001 11:17:50 PAGE 6
304 2 else
305 2 ET1=0;
306 2 }
307 1 }
308 void timer1_ovf() interrupt 1 //溢出中断子程序
309 {
310 1 if(--count==0)
311 1 {
312 2 flag=0x01;
313 2 count=20;
314 2 }
315 1 TL0=202;
316 1 TH0=125;
317 1 }
318 void timer0_ovf() interrupt 3
319 {
320 1 static unsigned int i;
321 1 i++;
322 1 if(i<400)
323 1 {
324 2 bp^=1;
325 2 }
326 1 if(i>800)
327 1 i=0;
328 1 TL1=101;
329 1 TH1=253;
330 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 926 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 1
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 + -