📄 main.lst
字号:
C51 COMPILER V7.50 MAIN 10/24/2008 14:18:00 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2 #include<reg52.h>
3 #include <intrins.h>
4 #define uchar unsigned char
5 #define uint unsigned int
6
7 #define true 1
8 #define false 0
9
10 sbit SDA=P3^7;
11 sbit SCL=P3^6;
12
13 sbit write=0xA2;
14 sbit read=0xA3;
15
16
17 sbit a_138=P2^2;
18 sbit b_138=P2^3;
19 sbit c_138=P2^4;
20 sbit cs_138=P2^6;
21 sbit cs_373=P2^5;
22
23
24 unsigned code zima1[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
25 //{0x88,0x83,0xc6,0xa1,0x86,0x8e};
26 unsigned char zima2[10];
27 unsigned code zima3[]={0xbf};//显示"-";
28
29 /*以下是显示函数的声明*/
30 void delay();
31 void xianshi();
32 void shuju(unsigned int i);
33
34 /*---------------以下是pcf8563的函数声明---------------------------*/
35 void delay_iic(void);
36 void I2CStart(void);
37 void I2CStop(void);
38 bit WaitAck(void);
39 void SendAck(void);
40 void SendNotAck(void);
41 void SendNotAck(void);
42 void I2CSendByte(uchar);
43 uchar I2CReceiveByte(void);
44 void GetPCF8563(uchar ,uchar ,uchar *);
45 void SetPCF8563(uchar ,uchar );
46 void SetAlarm(uchar alarmtype,uchar count);
47 void CleanAlarm(void);
48 void I2CInit(void);
49
50
51 main()
52 {
53 1 idata uchar rom_sed[9]; //定义保存时间初值的数组
54 1 idata uchar rom_rec[7]; //定义保存读取时间的数组
55 1 idata uint i;
C51 COMPILER V7.50 MAIN 10/24/2008 14:18:00 PAGE 2
56 1
57 1 cs_138=1;
58 1 cs_373=1;
59 1 rom_sed[0]=0x00; rom_sed[1]=0x00; //要发送的数据初始化
60 1 rom_sed[2]=0x00; rom_sed[3]=0x05;
61 1 rom_sed[4]=0x11; rom_sed[5]=0x15;
62 1 rom_sed[6]=0x04; rom_sed[7]=0x03;
63 1 rom_sed[8]=0x07;
64 1
65 1 for (i=0;i<9;i++)
66 1 {
67 2 SetPCF8563(i,rom_sed[i]); //设定时间初值,2007年03月15日11点05分0秒
68 2 }
69 1
70 1
71 1 while(1)
72 1 {
73 2
74 2 GetPCF8563(0x02,0x07, rom_rec); //读取时间信息,并将其保存在rom_rec 中
75 2 //for(i=0;i<15;i++)
76 2 xianshi();
77 2 zima2[6]=(rom_rec[0]&0xf0)/16; //BCD码取各个位
78 2 zima2[7]=rom_rec[0]&0x0f; // rom_rec[0]中存放的是"秒"数据
79 2
80 2 xianshi();
81 2
82 2 zima2[3]=(rom_rec[1]&0xf0)/16; //BCD码取各个位
83 2 zima2[4]=rom_rec[1]&0x0f; // rom_rec[1]中存放的是"分"数据
84 2
85 2 xianshi();
86 2
87 2 zima2[0]=(rom_rec[2]&0x30)/16; //BCD码取各个位
88 2 zima2[1]=rom_rec[2]&0x0f; // rom_rec[2]中存放的是"小时"数据
89 2 xianshi();
90 2
91 2 }
92 1
93 1
94 1 }
95
96
97
98
99 void delay()
100 {
101 1 unsigned char i;
102 1 for(i=0;i<80;i++);
103 1 }
104
105
106 void xianshi(void) //LED显示的数据
107 {
108 1
109 1 P0=zima1[zima2[0]];//所要显示的数据
110 1 P2=0xbf|0x60; //所要显示的数据位置
111 1 delay();
112 1 P0=zima1[zima2[1]];//所要显示的数据
113 1 P2=0xbb|0x60; //所要显示的数据位置
114 1 delay();
115 1 P0=zima3[zima2[2]];//所要显示的"-";
116 1 P2=0xb7|0x60; //所要显示的数据位置
117 1 delay();
C51 COMPILER V7.50 MAIN 10/24/2008 14:18:00 PAGE 3
118 1 P0=zima1[zima2[3]];//所要显示的数据
119 1 P2=0xb3|0x60;//所要显示的数据位置
120 1 delay();
121 1 P0=zima1[zima2[4]];//所要显示的数据
122 1 P2=0xaf|0x60;//所要显示的数据位置
123 1 delay();
124 1 P0=zima3[zima2[5]];//所要显示的"-";
125 1 P2=0xab|0x60;//所要显示的数据位置
126 1 delay();
127 1 P0=zima1[zima2[6]];//所要显示的数据
128 1 P2=0xa7|0x60;//所要显示的数据位置
129 1 delay();
130 1 P0=zima1[zima2[7]];//所要显示的数据
131 1 P2=0xa3|0x60;//所要显示的数据位置
132 1 delay();
133 1 }
134
135 void shuju(unsigned int i)
136 {
137 1 unsigned int k;
138 1 zima2[0]=i/10000; //所要显示的数字
139 1 xianshi();
140 1 zima2[1]=(i/1000)%10;
141 1 xianshi();
142 1 zima2[2]=(i/100)%10;
143 1 xianshi();
144 1 zima2[3]=(i/10)%10;
145 1 xianshi();
146 1 zima2[4]=i%10;
147 1 xianshi();
148 1 for(k=0;k<1000;k++)
149 1 xianshi();
150 1 }
151
152
153
154 ///////////*以下是8563的初始化*///////////////
155 void delay_iic(void) /*延时子程序*/
156 {
157 1 _nop_();
158 1 }
159
160
161 void I2CInit()
162 {
163 1 SCL=0;
164 1 I2CStop();
165 1 }
166
167 void I2CStart(void) /*启动I2C总线*/
168 {
169 1 EA=0;
170 1 SDA=1;
171 1 delay_iic();
172 1 SCL=1;
173 1 delay_iic();
174 1 SDA=0;
175 1 delay_iic();
176 1 SCL=0;
177 1 delay_iic();
178 1 }
179
C51 COMPILER V7.50 MAIN 10/24/2008 14:18:00 PAGE 4
180 void I2CStop(void) /*停止I2C总线*/
181 {
182 1 SDA=0;
183 1 delay_iic();
184 1 SCL=1;
185 1 delay_iic();
186 1 SDA=1;
187 1 delay_iic();
188 1 SCL=0;
189 1 delay_iic();
190 1 EA=1;
191 1 }
192
193 bit WaitAck(void)
194 {
195 1 uchar errtime=255; //因故障接收方无ACK,超时值为255。
196 1 SDA=1;
197 1 delay_iic();
198 1 SCL=1;
199 1 delay_iic();
200 1 while(SDA)
201 1 {
202 2 errtime--;
203 2 if (!errtime)
204 2 {
205 3 I2CStop();
206 3 //SystemError=0x11;
207 3 return false;
208 3 }
209 2 }
210 1 SCL=0;
211 1 return true;
212 1 }
213
214 void SendAck(void)
215 {
216 1 SDA=0;
217 1 delay_iic();
218 1 SCL=1;
219 1 delay_iic();
220 1 SCL=0;
221 1 }
222
223 void SendNotAck(void)
224 {
225 1 SDA=1;
226 1 delay_iic();
227 1 SCL=1;
228 1 delay_iic();
229 1 SCL=0;
230 1 }
231
232 void I2CSendByte(uchar ch) /*发送一个字节*/
233 {
234 1 uchar i=8;
235 1 while (i--)
236 1 {
237 2 SCL=0;
238 2 delay_iic();
239 2 SDA=(bit)(ch&0x80);
240 2 ch<<=1;
241 2 delay_iic();
C51 COMPILER V7.50 MAIN 10/24/2008 14:18:00 PAGE 5
242 2 SCL=1;
243 2 delay_iic();
244 2 }
245 1 SCL=0;
246 1 }
247
248 uchar I2CReceiveByte(void) /*接收一个字节*/
249 {
250 1 uchar i=8;
251 1 uchar ddata=0;
252 1 SDA=1;
253 1 while (i--)
254 1 {
255 2 ddata<<=1;
256 2 SCL=0;
257 2 delay_iic();
258 2 SCL=1;
259 2 delay_iic();
260 2 ddata|=SDA;
261 2 }
262 1 SCL=0;
263 1 return ddata;
264 1 }
265
266 /*-- 以下函数的功能为:读取时钟芯片PCF8563的时间,设置要读的第一个时间类型firsttype
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -