📄 ds1302b.lst
字号:
C51 COMPILER V7.06 DS1302B 10/09/2006 12:12:36 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE DS1302B
OBJECT MODULE PLACED IN ds1302b.OBJ
COMPILER INVOKED BY: E:\Program Files\C51\BIN\C51.EXE ds1302b.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <reg52.h>
2 #include <math.h>
3 #include <string.h>
4 #include <absacc.h>
5 #include <INTRINS.H>
6 #define uchar unsigned char
7
8 /**********鹰脚定义*********/
9
10 sbit lck = P3^5;//锁存信号
11 sbit enable = P1^5;//HC245使能信号
12 sbit USB = P1^0;//USBD12选中信号
13 sbit DQ =P3^2;
14 sbit rdlcd = P3^7;//读写控制
15
16
17
18 /********常用命令及参数定义********/
19 #define DISPON 0x3f
20 #define DISPOFF 0x3e
21 #define DISPFIRST 0xc0
22 #define SETX 0x40
23 #define SETY 0xb8
24 #define LCDBUZY 0x80
25 #define L 0x00
26 #define R 0x40
27 #define LIMIT 0x80
28
29 #define ENABLED enable =0
30 #define DISABLED enable =1
31 #define READ rdlcd = 0
32 #define WRITE rdlcd = 1
33
34
35 /**********全局变量************/
36 uchar xdata cbyte, statu;
37 bit xy,simple;
38
39 /**************函数******************/
40
41 void uDelay(uchar MS);
42 void WrL(uchar x);
43 void WrR(uchar x);
44 void Lcmcls(void);
45 void LcdbuzyR(void);
46 void LcdbuzyL(void);
47 void delay1s(void);
48 void Lcminit (void);
49 void Putpicture(void);
50 void MCUinitial();
51 void readtemp(void); //读取温度
52 void delay(unsigned int time);
53 void VtoH8x16change(uchar *hzbuf);
54 void Puthalf(uchar *strch,uchar row,uchar col);
55 void Wrdata(uchar x,uchar row,uchar col);
C51 COMPILER V7.06 DS1302B 10/09/2006 12:12:36 PAGE 2
56 void Puthz(uchar *str,uchar row,uchar col);
57 void VtoHchange(uchar *hzbuf);
58 void Locatexy(uchar row,uchar col);
59 void out16hz(uchar *p, uchar xdata ucXArray[]);
*** WARNING C258 IN LINE 59 OF DS1302B.C: 'ucXArray': mspace on parameter ignored
60 void vWrite8x16Character(uchar *ch,uchar row,uchar col,bit flag);
61 void vWrite16x16Chinese(uchar *ch,uchar row,uchar col,bit flag);
62 void vWrite8x16String(uchar *str,uchar col, uchar row, bit flag);
63 void out16hz(uchar *p, uchar data ucXArray[]);
64
65
66 extern uchar code char_Table[95][16];
67 unsigned char temper[2];
68
69
70
71 /***********主程序***************/
72 void main(void)
73 { unsigned char disp,temp;
74 1 float backbit;
75 1
76 1 simple = 1;
77 1 temper[0]=0;
78 1 temper[1]=0;
79 1 MCUinitial();
80 1 Lcminit();
81 1 vWrite8x16String(" 数字温度计" ,0, 0,0);
82 1 vWrite8x16String("当前温度:", 3, 0,0);
83 1 vWrite8x16String(" 充实的一天!", 6, 0,0);
84 1
85 1 while(1)
86 1 { readtemp();
87 2 backbit = temper[0];
88 2 backbit = backbit * 6.25;
89 2 temp = backbit;
90 2 disp = temp%10 + '0';
91 2 vWrite8x16Character(&char_Table[disp-0x20][0],3,104,0);
92 2 temp = temp/10;
93 2 disp = temp%10 + '0';
94 2 vWrite8x16Character(&char_Table[disp-0x20][0],3,96,0);
95 2 vWrite8x16Character(&char_Table['.'-0x20][0],3,88,0);
96 2 temp = temper[1];
97 2 disp = temp%10 + '0';
98 2 vWrite8x16Character(&char_Table[disp-0x20][0],3,80,0);
99 2 temp = temp/10;
100 2 disp = temp%10 + '0';
101 2 vWrite8x16Character(&char_Table[disp-0x20][0],3,72,0);
102 2
103 2 delay(100);
104 2 }
105 1 }
106
107
108
109 /***************初始化单片机I/O口*****************/
110 void MCUinitial()
111 {
112 1 P0 = 0x00;
113 1 lck = 0;
114 1 P1 = 0x24;
115 1 P2 = 0x00;
116 1 lck = 1;
C51 COMPILER V7.06 DS1302B 10/09/2006 12:12:36 PAGE 3
117 1 lck = 0;
118 1 P1 = 0x24;
119 1 P2 = 0x01;
120 1 lck = 1;
121 1 P1 = 0x21;
122 1 P2 = 0x01;
123 1 }
124
125
126
127 /************延时*****************/
128
129 void delay(unsigned int i)
130 {
131 1 while(i--);
132 1 }
133
134 void reset(void) //复位
135 {
136 1 uchar x=0;
137 1 DQ = 1;
138 1 delay(8); //稍做延时
139 1 DQ = 0;
140 1 delay(80); //精确延时 大于 480us
141 1 DQ = 1; //拉高总线
142 1 delay(14);
143 1 x=DQ;
144 1 delay(20);
145 1 }
146
147 uchar readbyte(void) //读1字节
148 {
149 1 uchar i=0;
150 1 uchar dat=0;
151 1 for (i=8;i>0;i--)
152 1 {
153 2 DQ = 0;
154 2 dat>>=1;
155 2 DQ = 1;
156 2 if(DQ)
157 2 dat|=0x80;
158 2 delay(4);
159 2 }
160 1 return(dat);
161 1 }
162
163 void writebyte(unsigned char dat) //写1字节
164 {
165 1 uchar i=0;
166 1 for (i=8; i>0; i--)
167 1 {
168 2 DQ = 0;
169 2 DQ = dat&0x01;
170 2 delay(5);
171 2 DQ = 1;
172 2 dat>>=1;
173 2 }
174 1 delay(4);
175 1 }
176
177 void readtemp(void) //读取温度
178 {
C51 COMPILER V7.06 DS1302B 10/09/2006 12:12:36 PAGE 4
179 1 uchar a=0,b=0;
180 1 reset();
181 1 writebyte(0xCC); // 跳过序列号
182 1 writebyte(0x44); // 启动温度转换
183 1 reset();
184 1 writebyte(0xCC);
185 1 writebyte(0xBE); //读9个寄存器,前两个为温度
186 1 a=readbyte(); //低位
187 1 b=readbyte(); //高位
188 1 temper[0]=a&0x0f;
189 1 a=a>>4; //低位右移4位,舍弃小数部分
190 1 temper[1]=b<<4; //高位左移4位,舍弃符号位
191 1 temper[1]=temper[1]|a;
192 1 }
193
194
195 //***********初始化LCD*******************/
196
197 void Lcminit (void)
198 {
199 1 cbyte=DISPOFF;
200 1 WrL(cbyte);
201 1 WrR(cbyte);
202 1 cbyte=DISPON;
203 1 WrL(cbyte);
204 1 WrR(cbyte);
205 1 cbyte=DISPFIRST;
206 1 WrL(cbyte);
207 1 WrR(cbyte);
208 1 Lcmcls();
209 1 Locatexy(0,0);
210 1 }
211
212
213 /***************LCD清屏********************/
214 void Lcmcls(void)
215 { uchar i,j;
216 1 for(i=0;i<8;i++)
217 1 for(j=0;j<LIMIT;j++)
218 1 Wrdata(0x0,i,j);
219 1 }
220
221
222
223 /**************写左区**************/
224
225 void WrL(uchar data x)
226 {
227 1 LcdbuzyL();
228 1
229 1 ENABLED;
230 1 WRITE;
231 1
232 1 P0 = x;
233 1 lck = 0;
234 1 P1 = 0xc6;//ELCD=1,RSTLOW=1(低电平复位无效),RW = 0(写),CS138无效,CSB=1,CSA=0
235 1 P2 = 0x01;
236 1 lck = 1;
237 1 P1 = 0xa1;//把PS/2的DATA(P1.7)拉高,非片选USBD12
238 1
239 1 lck = 0;
240 1 P1 = 0x44;//ELCD=0,RSTLOW=1(低电平复位无效),CS138无效,CSB=0,CSA=0
C51 COMPILER V7.06 DS1302B 10/09/2006 12:12:36 PAGE 5
241 1 P2 = 0x01;
242 1 lck = 1;
243 1 P1 = 0xa1;//把PS/2的DATA(P1.7)拉高,非片选USBD12
244 1 DISABLED;
245 1 }
246
247 /**************写右区**************/
248 void WrR(uchar data x)
249 {
250 1 LcdbuzyR();
251 1
252 1 ENABLED;
253 1 WRITE;
254 1
255 1 P0=x;
256 1 lck = 0;
257 1 P1 = 0xc5;//ELCD=1,RSTLOW=1(低电平复位无效),RW = 0(写),CS138无效,CSB=0,CSA=1
258 1 P2 = 0x01;//避免LCKMOTOR产生上升沿
259 1 lck = 1;
260 1 P1 = 0xa1;//把PS/2的DATA(P1.7)拉高,非片选USBD12
261 1
262 1 lck = 0;
263 1 P1 = 0x44;//ELCD=0,RSTLOW=1(低电平复位无效),CS138无效,CSB=0,CSA=0
264 1 P2 = 0x01;
265 1 lck = 1;
266 1 P1 = 0xa1;//把PS/2的DATA(P1.7)拉高,非片选USBD12
267 1 DISABLED;
268 1 }
269
270
271 /**************判忙****************/
272 void LcdbuzyL(void)
273 {
274 1 DISABLED;
275 1 WRITE;
276 1
277 1 P0=0xFF;//P0口送FF,准备读
278 1
279 1 READ;
280 1 lck = 0;
281 1 P1 = 0x96;//ELCD=1,RSTLOW=1(低电平复位无效),R/W=1(读),CS138=1(无效),CSB=1,CSA=0
282 1 P2 = 0x01;
283 1 lck = 1;
284 1 P1 = 0xa1;//把PS/2的DATA(P1.7)拉高,非片选USBD12
285 1 ENABLED;
286 1 while(P0 & LCDBUZY);//最高位为1,表示忙,则循环
287 1 DISABLED;
288 1 lck = 0;
289 1 P1 = 0x44;//ELCD=0,RSTLOW=1(低电平复位无效),R/W=0(读),CS138=1(无效),CSB=1,CSA=0
290 1 P2 = 0x01;//避免LCKMOTOR产生上升沿
291 1 lck = 1;
292 1 P1 = 0xa1;//把PS/2的DATA(P1.7)拉高,非片选USBD12
293 1
294 1 }
295
296
297 void LcdbuzyR(void)
298 {
299 1 DISABLED;
300 1 WRITE;
301 1
302 1 P0=0xFF;//P0口送FF,准备读
C51 COMPILER V7.06 DS1302B 10/09/2006 12:12:36 PAGE 6
303 1
304 1 READ;
305 1 lck = 0;
306 1 P1 = 0x95;//ELCD=1,RSTLOW=1(低电平复位无效),R/W=1(读),CS138无效,CSB=0,CSA=1
307 1 P2 = 0x01;
308 1 lck = 1;
309 1 P1 = 0xa1;//把PS/2的DATA(P1.7)拉高
310 1 ENABLED;
311 1 while(P0 & LCDBUZY);//最高位为1,表示忙,则循环
312 1 DISABLED;
313 1 lck = 0;
314 1 P1 = 0x44;
315 1 P2 = 0x01;//避免LCKMOTOR产生上升沿
316 1 lck = 1;
317 1 P1 = 0xa1;//把PS/2的DATA(P1.7)拉高
318 1
319 1 }
320
321
322
323
324
325 /*************定位*****************/
326 void Locatexy(uchar row,uchar col)
327 {
328 1 uchar data x,y,right;
329 1 switch(col&0xc0)
330 1 {
331 2 case 0: {LcdbuzyR();right = 1;break;}//置右半屏标志
332 2 case 0x40:{LcdbuzyL();right = 0;break;}//置左半屏标志
333 2 }
334 1 x=col&0x3f|SETX;//把列数据变成行命令
335 1 y=row&0x07|SETY;//把行数据变成行命令
336 1
337 1 DISABLED;
338 1
339 1 P0=0xFF;
340 1 /**********************************/
341 1 READ;
342 1 lck = 0;
343 1 if(right)
344 1 P1 = 0x95;
345 1 else
346 1 P1 = 0x96;
347 1 P2 = 0x01;
348 1 lck = 1;
349 1 P1 = 0xa1;
350 1 while(P0 & LCDBUZY);//最高位为1,表示忙,则循环
351 1 lck = 0;
352 1 P1 = 0x44;
353 1 P2 = 0x01;
354 1 lck = 1;
355 1 P1 = 0xa1;
356 1 /*********以上为判断忙标志********/
357 1 WRITE;
358 1 /*********************************/
359 1 P0 = y;
360 1 lck = 0;
361 1 if(right)
362 1 P1 = 0xc5;
363 1 else
364 1 P1 = 0xc6;
C51 COMPILER V7.06 DS1302B 10/09/2006 12:12:36 PAGE 7
365 1 P2 = 0x01;
366 1 lck = 1;
367 1 P1 = 0xa1;
368 1
369 1 lck = 0;
370 1 P1 = 0x44;
371 1 P2 = 0x01;
372 1 lck = 1;
373 1 P1 = 0xa1;
374 1 /**********以上为送行命令***********/
375 1 P0=0xFF;
376 1
377 1 READ;
378 1
379 1 lck = 0;
380 1 if(right)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -