📄 lab24.lst
字号:
C51 COMPILER V6.23a LAB24 08/11/2007 22:38:38 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE LAB24
OBJECT MODULE PLACED IN lab24.OBJ
COMPILER INVOKED BY: e:\mcs51\Keil\C51\BIN\C51.EXE lab24.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*可调时钟(无小时)和设定闹钟功能*/
2 #include<at89x52.h>
3 char code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
4 char code tv[]={0xfe,0xfd,0xfb,0xf7};
5 char led[4];
6 unsigned int counter;
7 unsigned char s_data=50,m_data=59,n,w=4,flag,flag2,flag3,set_mdata,set_sdata,mdata,sdata;
8 void display(void);
9
10 void delay(unsigned int j)
11 {
12 1 unsigned int i;
13 1 for(i=0;i<j;i++);
14 1 }
15
16 void delay2(void)
17 {
18 1 unsigned int j;
19 1 //for(i=0;i<1000;i++)
20 1 for(j=0;j<500;j++) display();
21 1 }
22
23 void display(void)
24 {
25 1 unsigned char k,i;
26 1 if(flag2==1) //设定闹钟时不显示实际时间
27 1 {
28 2 led[0]=mdata/10;
29 2 led[1]=mdata%10;
30 2 led[2]=sdata/10;
31 2 led[3]=sdata%10;
32 2 }
33 1 else
34 1 {
35 2 led[0]=m_data/10;
36 2 led[1]=m_data%10;
37 2 led[2]=s_data/10;
38 2 led[3]=s_data%10;
39 2 }
40 1 n++;
41 1 if(n>180)
42 1 n=0;
43 1 for(k=0;k<4;k++)
44 1 {
45 2 if(k==w) //闪烁显示
46 2 {
47 3 if(n<90)
48 3 {i=led[k];
49 4 P0=num[i];
50 4 if(k==1)
51 4 P0=num[i] | 0x80; //显示小数点
52 4 P2=tv[k];
53 4 delay(100);
54 4 }
55 3 else
C51 COMPILER V6.23a LAB24 08/11/2007 22:38:38 PAGE 2
56 3 {
57 4 P0=num[10];
58 4 if(k==1)
59 4 P0=num[10] | 0x80;
60 4 P2=tv[k];
61 4 delay(100);
62 4 }
63 3 }
64 2 else //正常显示
65 2 {
66 3 i=led[k];
67 3 P0=num[i];
68 3 if(k==1)
69 3 P0=num[i] | 0x80;
70 3 P2=tv[k];
71 3 delay(100);
72 3 }
73 2 }
74 1 }
75
76
77 void adjust(void) //调整函数
78 {
79 1 if(P3_5==0)
80 1 {
81 2 while(P3_5==0)
82 2 display();
83 2 if(flag2==0) //T1,开始调整时间 ;记时停止
84 2 {
85 3 TR0=0;
86 3 w=0;
87 3 flag++;
88 3 if(flag==2) //第一次按下是开始调整时间,第二次按下时确定
89 3 {flag=0;TR0=1;w=4;}
90 3 }
91 2 else //开始设定闹钟,记时不停止
92 2 {
93 3 w=0;
94 3 flag++;
95 3 if(flag==2) //第一次按下是开始调整时间,第二次按下时确定
96 3 {flag=0;flag2=0;flag3=1;w=4;}
97 3 }
98 2 }
99 1
100 1
101 1
102 1
103 1 if(P3_2==0) //INT0,加操作
104 1 {
105 2 while(P3_2==0)
106 2 display();
107 2 if(flag2==0)
108 2 { //显示当前时间,由于采用逐个数码管闪烁,逐个调整,所以分钟数和秒数的个位,十位分别赋值,比较麻烦
109 3 if(w==0)
110 3 {m_data=(m_data/10+1)*10+m_data%10;if(m_data>=60){m_data=m_data%10;}}
111 3 if(w==1)
112 3 {if(m_data%10==9) m_data=m_data/10*10;else m_data=m_data%10+1+m_data/10*10; }
113 3 if(w==2)
114 3 {s_data=(s_data/10+1)*10+s_data%10;if(s_data>=60){s_data=s_data%10;}}
115 3 if(w==3)
116 3 {if(s_data%10==9) s_data=s_data/10*10;else s_data=s_data%10+1+s_data/10*10; }
117 3 }
C51 COMPILER V6.23a LAB24 08/11/2007 22:38:38 PAGE 3
118 2 else
119 2 { //显示闹钟时间,逐个调整,
120 3 if(w==0)
121 3 {mdata=(mdata/10+1)*10+mdata%10;if(mdata>=60){mdata=mdata%10;}}
122 3 if(w==1)
123 3 {if(mdata%10==9) mdata=mdata/10*10;else mdata=mdata%10+1+mdata/10*10; }
124 3 if(w==2)
125 3 {sdata=(sdata/10+1)*10+sdata%10;if(sdata>=60){sdata=sdata%10;}}
126 3 if(w==3)
127 3 {if(sdata%10==9) sdata=sdata/10*10;else sdata=sdata%10+1+sdata/10*10; }
128 3 }
129 2
130 2 }
131 1
132 1
133 1
134 1
135 1
136 1 if(P3_3==0) //INT1,减操作
137 1 {
138 2 while(P3_3==0)
139 2 display();
140 2 if(flag2==0)
141 2 { //显示当前时间
142 3 if(w==0)
143 3 {if(m_data/10==0) m_data=50+m_data%10; else m_data=(m_data/10-1)*10+m_data%10;}
144 3 if(w==1)
145 3 {if(m_data%10==0) m_data=m_data/10*10+9;else m_data=m_data%10-1+m_data/10*10;}
146 3 if(w==2)
147 3 {if(s_data/10==0) s_data=50+s_data%10; else s_data=(s_data/10-1)*10+s_data%10;}
148 3 if(w==3)
149 3 {if(s_data%10==0) s_data=s_data/10*10+9;else s_data=s_data%10-1+s_data/10*10;}
150 3 }
151 2 else
152 2 { ////显示闹钟时间
153 3 if(w==0)
154 3 {if(mdata/10==0) mdata=50+mdata%10; else mdata=(mdata/10-1)*10+mdata%10;}
155 3 if(w==1)
156 3 {if(mdata%10==0) mdata=mdata/10*10+9;else mdata=mdata%10-1+mdata/10*10;}
157 3 if(w==2)
158 3 {if(sdata/10==0) sdata=50+sdata%10; else sdata=(sdata/10-1)*10+sdata%10;}
159 3 if(w==3)
160 3 {if(sdata%10==0) sdata=sdata/10*10+9;else sdata=sdata%10-1+sdata/10*10;}
161 3 }
162 2 }
163 1 //}
164 1
165 1
166 1
167 1
168 1 if(P3_4==0) //T0,下一个数码管闪烁/设定闹钟开始
169 1 {
170 2 while(P3_4==0)
171 2 display();
172 2 if(flag==1) //当flag==1时,说明P3_5按下过,开始调整时间,此时P3_4只起循环闪烁数码管的功能
173 2 {
174 3 w++;
175 3 if(w==4) w=0;
176 3 }
177 2 else //设定闹钟
178 2 {
179 3 flag2=1;
C51 COMPILER V6.23a LAB24 08/11/2007 22:38:38 PAGE 4
180 3 mdata=m_data; //读取当前时间值
181 3 sdata=s_data;
182 3 }
183 2 }
184 1
185 1 }
186
187
188
189
190
191 void timer0() interrupt 1
192 {
193 1 counter++;
194 1 if(counter==5000)
195 1 {
196 2 s_data++;
197 2 counter=0;
198 2 }
199 1 }
200
201
202
203 main(void)
204 {
205 1 IE=0x8a;
206 1 TMOD=0x02;
207 1 TH0=-200;
208 1 TL0=-200;
209 1 TR0=1;
210 1
211 1 while(1)
212 1 {
213 2 if(s_data==60)
214 2 {
215 3 s_data=0;
216 3 m_data++;
217 3 }
218 2 if(m_data==60)
219 2 {
220 3 m_data=0;
221 3 }
222 2
223 2 adjust();
224 2 if(m_data==mdata && s_data==sdata) //判断是否等于设定的时间值,即闹钟功能,mdata,sdata为设定的闹钟时间
-;
225 2 {if(flag3==1) //m_data,s_data为当前时间值
226 3 {P1_0=0;delay2();P1_0=1;flag3=0;}} // P1_0口接的数码管亮一下表示闹钟时间到
227 2 //delay(100);
228 2 display();
229 2 }
230 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1188 ----
CONSTANT SIZE = 15 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 17 2
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
C51 COMPILER V6.23a LAB24 08/11/2007 22:38:38 PAGE 5
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -