📄 pcf8563.lst
字号:
C51 COMPILER V7.06 PCF8563 01/02/2008 09:54:09 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE PCF8563
OBJECT MODULE PLACED IN PCF8563.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PCF8563.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <reg52.h>
2 #include <stdio.h>
3 #include <absacc.h>
4 #include <intrins.h>
5
6 typedef unsigned char uchar;
7
8 uchar g8563_Store[4]; /*时间交换区,全局变量声明*/
9 uchar code c8563_Store[4]={0x50,0x59,0x07,0x01}; /*写入时间初值:星期一 07:59:40*/
10
11 sbit CS=P1^4;
12 sbit CLK=P1^7;
13 sbit DIO=P1^6;
14 sbit KEY=P3^2;
15
16 sbit SDA=P1^1; // pcf8563时钟
17 sbit SCL=P1^0; // pcf8563时钟
18
19 bdata uchar com_data;
20 sbit mos_bit=com_data^7;
21 sbit low_bit=com_data^0;
22
23 void delay_50us()
24 {
25 1 uchar i;
26 1 for (i=0; i<6; i++){;}
27 1 }
28
29 void delay_8us()
30 {
31 1 uchar i;
32 1 for (i=0; i<1; i++){;}
33 1 }
34 void delay_50ms()
35 {
36 1 uchar i,j;
37 1 for(j=0;j<50;j++)
38 1 for(i=0;i<125;i++){;}
39 1 }
40 void send(uchar sebuf)
41 {
42 1 uchar i;
43 1 com_data=sebuf;
44 1 CLK=0;
45 1 CS=0;
46 1 delay_50us();
47 1 for(i=0;i<8;i++)
48 1 {
49 2 delay_8us();
50 2 DIO=mos_bit;
51 2 CLK=1;
52 2 delay_8us();
53 2 com_data=com_data<<1;
54 2 CLK=0;
55 2 }
C51 COMPILER V7.06 PCF8563 01/02/2008 09:54:09 PAGE 2
56 1 DIO=0;
57 1 }
58 uchar receive(void)
59 {
60 1 uchar i,rebuf;
61 1 CLK=1;
62 1 delay_50us();
63 1 for(i=0;i<8;i++)
64 1 {
65 2 com_data=com_data<<1;
66 2 low_bit=DIO;
67 2 CLK=1;
68 2 delay_8us();
69 2 CLK=0;
70 2 delay_8us();
71 2 }
72 1 rebuf=com_data;
73 1 DIO =1;
74 1 CS=1;
75 1 return rebuf;
76 1 }
77 void reset(void)
78 {
79 1 DIO=1;
80 1 delay_50ms();
81 1 send(0xa4);
82 1 CS=1;
83 1 }
84 /* 7289显示程序 */
85 /* addr为显示位置 范围0~7 */
86 /* dat为现实内容 */
87 void display(uchar addr,uchar dat)
88 {
89 1 if(addr<0 || addr >7)
90 1 return;
91 1 send(0xc8 + addr);
92 1 delay_50us();
93 1 send(dat);
94 1 CS=1;
95 1 }
96 /* 发送双字节命令 */
97 void sendcommand(uchar addr,uchar dat)
98 {
99 1 send(addr);
100 1 delay_50us();
101 1 send(dat);
102 1 CS=1;
103 1 }
104 /********************************************
105 内部函数,延时1
106 ********************************************/
107 void Delay()
108 {
109 1 // {P10=1;_nop_();P10=0;}
110 1 _nop_();
111 1 _nop_(); /*根据晶振频率制定延时时间*/
112 1 }
113 /********************************************
114 内部函数,I2C开始
115 ********************************************/
116 void Start()
117 {
C51 COMPILER V7.06 PCF8563 01/02/2008 09:54:09 PAGE 3
118 1 EA=0;
119 1 SDA=1;
120 1 SCL=1;
121 1 Delay();
122 1 SDA=0;
123 1 Delay();
124 1 SCL=0;
125 1 }
126 /********************************************
127 内部函数,I2C结束
128 ********************************************/
129 void Stop()
130 {
131 1 SDA=0;
132 1 SCL=0;
133 1 Delay();
134 1 SCL=1;
135 1 Delay();
136 1 SDA=1;
137 1 Delay();
138 1 EA=1;
139 1 }
140 /********************************************
141 内部函数,输出ACK ,每个字节传输完成,输出ack=0,结束读书据,ack=1;
142 ********************************************/
143 void WriteACK(uchar ack)
144 {
145 1 SDA=ack;
146 1 Delay();
147 1 SCL=1;
148 1 Delay();
149 1 SCL=0;
150 1 }
151 /********************************************
152 内部函数,等待ACK
153 ********************************************/
154 void WaitACK()
155 {
156 1 uchar errtime=20;
157 1 SDA=1;
158 1 Delay(); /*读ACK*/
159 1 SCL=1;
160 1 Delay();
161 1 while(SDA)
162 1 { errtime--; }
163 1 SCL=0;
164 1 Delay();
165 1
166 1 }
167 /********************************************
168 内部函数.输出数据字节
169 入口:B=数据
170 ********************************************/
171 void writebyte(uchar wdata)
172 {
173 1 uchar i;
174 1 for(i=0;i<8;i++)
175 1 {
176 2 if(wdata&0x80) SDA=1;
177 2 else SDA=0;
178 2 wdata<<=1;
179 2 SCL=1;
C51 COMPILER V7.06 PCF8563 01/02/2008 09:54:09 PAGE 4
180 2 Delay();
181 2 SCL=0;
182 2 }
183 1 WaitACK(); //I2C器件或通讯出错,将会退出I2C通讯
184 1 }
185 /********************************************
186 内部函数.输入数据
187 出口:B
188 ********************************************/
189 uchar Readbyte()
190 {
191 1 uchar i,bytedata;
192 1 SDA=1;
193 1 for(i=0;i<8;i++)
194 1 {
195 2 SCL=1;
196 2 bytedata<<=1;
197 2 bytedata|=SDA;
198 2 SCL=0;
199 2 Delay();
200 2 }
201 1 return(bytedata);
202 1 }
203 /********************************************
204 输出数据->pcf8563
205 ********************************************/
206 void writeData(uchar address,uchar mdata)
207 {
208 1 Start();
209 1 writebyte(0xa2); /*写命令*/
210 1 writebyte(address); /*写地址*/
211 1 writebyte(mdata); /*写数据*/
212 1 Stop();
213 1 }
214 /********************************************
215 输入数据<-pcf8563
216 ********************************************/
217 uchar ReadData(uchar address) /*单字节*/
218 {
219 1 uchar rdata;
220 1 Start();
221 1 writebyte(0xa2); /*写命令*/
222 1 writebyte(address); /*写地址*/
223 1 Start();
224 1 writebyte(0xa3); /*读命令*/
225 1 rdata=Readbyte();
226 1 WriteACK(1);
227 1 Stop();
228 1 return(rdata);
229 1 }
230 void ReadData1(uchar address,uchar count,uchar * buff) /*多字节*/
231 {
232 1 uchar i;
233 1 Start();
234 1 writebyte(0xa2); /*写命令*/
235 1 writebyte(address); /*写地址*/
236 1 Start();
237 1 writebyte(0xa3); /*读命令*/
238 1 for(i=0;i<count;i++)
239 1 {
240 2 buff[i]=Readbyte();
241 2 if(i<count-1) WriteACK(0);
C51 COMPILER V7.06 PCF8563 01/02/2008 09:54:09 PAGE 5
242 2 }
243 1 WriteACK(1);
244 1 Stop();
245 1 }
246 /********************************************
247 内部函数,读入时间到内部缓冲区
248 ********************************************/
249 void P8563_Read()
250 {
251 1 uchar time[7];
252 1 ReadData1(0x02,0x07,time);
253 1 g8563_Store[0]=time[0]&0x7f; /*秒*/
254 1 g8563_Store[1]=time[1]&0x7f; /*分*/
255 1 g8563_Store[2]=time[2]&0x3f; /*小时*/
256 1 g8563_Store[3]=time[4]&0x07; /*星期*/
257 1 }
258 /********************************************
259 读入时间到内部缓冲区----外部调用
260 ********************************************/
261 void P8563_gettime()
262 {
263 1 P8563_Read();
264 1 if(g8563_Store[0]==0)
265 1 P8563_Read(); /*如果为秒=0,为防止时间变化,再读一次*/
266 1 }
267 /********************************************
268 写时间修改值
269 ********************************************/
270 void P8563_settime()
271 {
272 1 uchar i;
273 1 for(i=2;i<=4;i++) { writeData(i,g8563_Store[i-2]); }
274 1 writeData(6,g8563_Store[3]);
275 1 }
276 /********************************************
277 P8563的初始化-----外部调用
278 ********************************************/
279 void P8563_init()
280 {
281 1 uchar i;
282 1
283 1 for(i=0;i<=3;i++) g8563_Store[i]=c8563_Store[i]; /*初始化时间*/
284 1 P8563_settime();
285 1 writeData(0x0,0x00);
286 1 writeData(0xa,0x8); /*8:00报警*/
287 1 writeData(0x1,0x12); /*报警有效*/
288 1 writeData(0xd,0xf0);
289 1
290 1 }
291
292 main()
293 {
294 1 reset();
295 1 P8563_init();
296 1 while(1)
297 1 {
298 2 P8563_Read();
299 2 display(0,g8563_Store[2] >> 4);
300 2 display(1,g8563_Store[2] & 0x0f);
301 2 sendcommand(0x82,0x0a);
302 2 display(3,g8563_Store[1] >> 4);
303 2 display(4,g8563_Store[1] & 0x0f);
C51 COMPILER V7.06 PCF8563 01/02/2008 09:54:09 PAGE 6
304 2 sendcommand(0x85,0x0a);
305 2 display(6,g8563_Store[0] >> 4);
306 2 display(7,g8563_Store[0] & 0x0f);
307 2 }
308 1 }
309
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 612 ----
CONSTANT SIZE = 4 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 5 10
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 + -