📄 timer.lst
字号:
C51 COMPILER V8.01 TIMER 04/13/2007 08:11:14 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE TIMER
OBJECT MODULE PLACED IN TIMER.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE TIMER.C BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "reg52.h"
2 #include "VIiC_C51.H" //包含VI2C软件包
3 #define uchar unsigned char
4 #define uint unsigned int
5
6 #define PCF8563 0xA2 //定义器件地址
7 #define WRADDR 0x00 //定义写单元首地址
8 #define RDADDR 0x02 //定义读单元首地址
9
10 sbit key_add=P3^7;
11 sbit key_move=P3^6;
12 sbit P1_2=P1^2;
13 sbit P1_3=P1^3;
14 sbit P3_4=P3^4;
15 sbit P0_7=P0^7;
16 bit gettime_fg;
17
18 unsigned char disp_buf[8]={0,0,0,0,0,0,0,0};//显示缓存
19 unsigned int back_daycount;
20 unsigned char day_old;
21 unsigned char group0[8],group1[8],group2[8];
22 //unsigned char code Tab1[]={0xc0,0xed,0xb0,0xa8,0x8d,0x8a,0x82,0xec,0x80,0x88};
23 unsigned char code Tab1[10]={
24 0x81,/*0*/
25 0xED,/*1*/
26 0x43,/*2*/
27 0x49,/*3*/
28 0x2D,/*4*/
29 0x19,/*5*/
30 0x11,/*6*/
31 0xCD,/*7*/
32 0x01,/*8*/
33 0x09,/*9*/
34
35 };
36 unsigned char code Tab2[10]={
37 0x18,/*0*/
38 0x7B,/*1*/
39 0x2C,/*2*/
40 0x29,/*3*/
41 0x4B,/*4*/
42 0x89,/*5*/
43 0x88,/*6*/
44 0x3B,/*7*/
45 0x08,/*8*/
46 0x09,/*9*/
47 };
48
49 uchar RtcTime[7];
50
51 void systeminit(void)
52 {
53 1 EA=1;
54 1 ET0=1;
55 1 TMOD=0x01;
C51 COMPILER V8.01 TIMER 04/13/2007 08:11:14 PAGE 2
56 1 TH0=-50000/256;
57 1 TL0=-50000%256;
58 1 TR0=1;
59 1 SCON=0x00;
60 1 }
61
62 void time0() interrupt 1 using 2 //定时器0中断处理程序
63 {
64 1 uchar t0int_count; //定时器0中断次数变量
65 1
66 1 TH0=-50000/256;
67 1 TL0=-50000%256;
68 1 t0int_count++;
69 1 if(t0int_count==10)
70 1 {
71 2 // P1_2=!P1_2;
72 2 P1_3=!P1_3;
73 2 t0int_count=0;
74 2 // gettime_fg=~gettime_fg;
75 2 }
76 1 }
77
78 void DelayMs(unsigned char no) //延时毫秒程序
79 {
80 1 unsigned char i,j;
81 1 for(i=0;i<no;i++)
82 1 {
83 2 for(j=0;j<164;j++);
84 2 for(j=0;j<164;j++);
85 2 }
86 1 }
87
88 void display(void) //数码管显示
89 {
90 1 uchar i,segsel;
91 1
92 1 segsel=0x7f;
93 1 for(i=0;i<8;i++)
94 1 {
95 2 P0=0xff;
96 2 if(i==0|i==2|i==4|i==6)
97 2 {
98 3 SBUF=Tab2[group2[i]];
99 3 while(TI==0) ;
100 3 TI=0;
101 3 TI=0;
102 3 SBUF=Tab2[group0[i]];
103 3 while(TI==0) ;
104 3 TI=0;
105 3 SBUF=Tab2[group1[i]];
106 3 while(TI==0) ;
107 3 TI=0;
108 3
109 3 }
110 2 else
111 2 {
112 3 SBUF=Tab1[group2[i]];
113 3 while(TI==0) ;
114 3 TI=0;
115 3 SBUF=Tab1[group0[i]];
116 3 while(TI==0) ;
117 3 TI=0;
C51 COMPILER V8.01 TIMER 04/13/2007 08:11:14 PAGE 3
118 3 SBUF=Tab1[group1[i]];
119 3 while(TI==0) ;
120 3 TI=0;
121 3
122 3 }
123 2 P0=segsel ;
124 2 DelayMs(1);
125 2 segsel=(segsel>>1)+0x80;
126 2 }
127 1 P0=0xff;
128 1
129 1
130 1 }
131
132
133 unsigned char displayall(unsigned char *sd) //显示时间
134 {
135 1 sd[0]=sd[0]&0x7f;//秒屏蔽保留位
136 1 sd[1]=sd[1]&0x7f;//分屏蔽保留位
137 1 sd[2]=sd[2]&0x3f;//时屏蔽保留位
138 1 sd[3]=sd[3]&0x3f;//日屏蔽保留位
139 1
140 1 sd[4]=sd[4]&0x07;//星期屏蔽保留位
141 1
142 1 sd[5]=sd[5]&0x1f;//月屏蔽保留位
143 1 sd[6]=sd[6]&0x7f;//年屏蔽保留位
144 1
145 1 group1[0]= (sd[3]%16); //日个位
146 1 group1[1] =(sd[3]/16); //日十位
147 1 group1[2]= (sd[5]%16); //月个位
148 1 group1[3] =(sd[5]/16); //月十位
149 1 group1[4]= (sd[6]%16); //年个位
150 1 group1[5] =(sd[6]/16); //年十位
151 1 group1[6]= 0x00; //年百位
152 1 group1[7] =0x02; //年千位
153 1
154 1 if(day_old!=sd[3])
155 1 {
156 2 if(back_daycount!=0x00)
157 2 back_daycount--;
158 2 day_old=sd[3];
159 2 }
160 1
161 1 group0[0]= 0xff;
162 1 // group0[1] =sd[4]; //星期
163 1 if(sd[4]==0x00)
164 1 group0[1]=0x08;
165 1 else
166 1 group0[1]=sd[4];
167 1 // group0[1] =sd[4]; //星期
168 1 group0[2]= (sd[0]%16);
169 1 group0[3] =(sd[0]/16);
170 1 group0[4]= (sd[1]%16);
171 1 group0[5] =(sd[1]/16);
172 1 group0[6]= (sd[2]%16);
173 1 group0[7] =(sd[2]/16);
174 1
175 1
176 1 group2[3]=back_daycount/100;
177 1 group2[2]=back_daycount%100/10;
178 1 group2[1]=back_daycount%10;
179 1
C51 COMPILER V8.01 TIMER 04/13/2007 08:11:14 PAGE 4
180 1 display();
181 1 display();
182 1
183 1 return 0;
184 1 }
185
186 unsigned char DelayNS(unsigned char no)
187 {
188 1 unsigned char i,j; //延时参数
189 1
190 1 for(; no>0; no--)
191 1 for(i=0; i<100; i++)
192 1 for(j=0; j<100; j++);
193 1 return 0;
194 1 }
195
196
197
198 void TimeBCDadd(uchar i) //时间BCD码加1
199 {
200 1 RtcTime[i] += 1;
201 1 if( (RtcTime[i] & 0x0f) == 0x0a )
202 1 RtcTime[i] += 6;
203 1 }
204
205
206
207 void timeadd( uchar i ) //时间加1
208 {
209 1 switch (i)
210 1 {
211 2 case 0: if(RtcTime[0] == 0x59) RtcTime[0] = 0;
212 2 else TimeBCDadd(0);
213 2 break;
214 2 case 1: if(RtcTime[1] ==0x59) RtcTime[1] = 0;
215 2 else TimeBCDadd(1);
216 2 break;
217 2 case 2: if(RtcTime[2] == 0x23) RtcTime[2] = 0;
218 2 else TimeBCDadd(2);
219 2 break;
220 2 case 3: if(RtcTime[3] == 0x31) RtcTime[3] = 0;
221 2 else TimeBCDadd(3);
222 2 break;
223 2 case 4: if(RtcTime[4] == 0x06) RtcTime[4] = 0;
224 2 else RtcTime[4]++;
225 2 break;
226 2 case 5: if(RtcTime[5] == 0x12) RtcTime[5] = 0;
227 2 else TimeBCDadd(5);
228 2 break;
229 2 case 6: if(RtcTime[6] == 0x99) RtcTime[6] = 0;
230 2 else TimeBCDadd(6);
231 2 break;
232 2 }
233 1 }
234
235
236 void main()
237 {
238 1 unsigned char td[9]={0x00,0x12,0x00,0x00,0x12,0x12,0x04,0x04,0x07}; //定义初始化字
239 1 // unsigned char rd[7],tc; //定义接收缓冲区
240 1 unsigned char code control_unit[2]={0x00,0x12};
241 1 uchar led_num,i;
C51 COMPILER V8.01 TIMER 04/13/2007 08:11:14 PAGE 5
242 1 bit settime_fg;
243 1 systeminit();
244 1
245 1 back_daycount=0x32;
246 1 day_old=0x00;
247 1
248 1 for(i=0;i<8;i++)
249 1 group2[i]=8-i;
250 1
251 1 led_num=0;
252 1 settime_fg=0;
253 1 P1_2=1;
254 1
255 1 ISendStr(PCF8563,WRADDR,td,0x5); //初始化PCF8563,如果需要的话可以不去掉
256 1 DelayNS(1);
257 1 ISendStr(PCF8563,WRADDR+5,&td[5],0x4);//初始化PCF8563,如果需要的话可以不去掉
258 1
259 1 IRcvStr(PCF8563,RDADDR,RtcTime,0x7); //读现在的时、分、秒
260 1 day_old=RtcTime[3]&0x3f;
261 1
262 1
263 1 while(1)
264 1 {
265 2 if(settime_fg==0)
266 2 IRcvStr(PCF8563,RDADDR,RtcTime,0x7); //读现在的时、分、秒
267 2
268 2
269 2 displayall(RtcTime); //调显示时间子程序
270 2
271 2 if(key_move==0)
272 2 {
273 3 settime_fg=1;
274 3 P1_2=0;
275 3 led_num++;
276 3 if(led_num==8)
277 3 {
278 4 led_num=0;
279 4 settime_fg=0;
280 4 P1_2=1;
281 4
282 4 ISendStr(PCF8563,WRADDR,control_unit,0x2);
283 4 DelayNS(1);
284 4 ISendStr(PCF8563,WRADDR+2,RtcTime,0x07);//初始化PCF8563,如果需要的话可以不去掉
285 4
286 4 }
287 3 while(key_move==0) //等待按键释放
288 3 {
289 4
290 4 displayall(RtcTime);
291 4
292 4 }
293 3 }
294 2
295 2 if(led_num)
296 2 {
297 3 if(key_add==0)
298 3 {
299 4 timeadd(led_num-1);
300 4 while(key_add==0) //等待按键释放
301 4 {
302 5 displayall(RtcTime); //调显示时间子程序
303 5
C51 COMPILER V8.01 TIMER 04/13/2007 08:11:14 PAGE 6
304 5 }
305 4 }
306 3 }
307 2
308 2
309 2 }
310 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 995 ----
CONSTANT SIZE = 31 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 42 14
IDATA SIZE = ---- ----
BIT SIZE = 1 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -