pcf8563c.lst
来自「单片机C语言教程」· LST 代码 · 共 243 行
LST
243 行
C51 COMPILER V8.02 PCF8563C 08/10/2007 21:32:41 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE PCF8563C
OBJECT MODULE PLACED IN PCF8563C.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PCF8563C.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************************/
2 /* 这是用C51高级语言编写的pcf8563时钟日历读写程序-没有调用汇编语言,*/
3 /* 文件名 pcf8563C.C */
4 /* 功能:本程序主要是读pcf8563的日历时钟值(共7个字节)、置pcf8563 */
5 /* 的日历时钟值。此外,还有分钟、小时、日和星期报警功能及4种 */
6 /* 不同频率的方波输出功能。 */
7 /********************************************************************/
8 #include <reg52.h>
9 #include <intrins.h>
10 #define uchar unsigned char
11
12 sbit SDA=P1^0;
13 sbit SCL=P1^1;
14
15 uchar g8563_Store[7]; /*全局数组变量声明*/
16 uchar code c8563_Store[7]={0x00,0x59,0x07,0x00,0x15,0x07,0x07};
17 /*写入时间初值:07-07-15,星期日 07:59:00*/
18
19 /********************************************
20 功能:延时
21 ********************************************/
22 void Delay()
23 {
24 1 _nop_();
25 1 _nop_(); /*根据晶振频率确定延时时间*/
26 1 }
27 /********************************************
28 功能:I2C开始
29 ********************************************/
30 void Start()
31 {
32 1 SDA=1;
33 1 SCL=1;
34 1 Delay();
35 1 SDA=0;
36 1 Delay();
37 1 SCL=0;
38 1 }
39 /********************************************
40 功能:I2C结束
41 ********************************************/
42 void Stop()
43 {
44 1 SDA=0;
45 1 SCL=0;
46 1 Delay();
47 1 SCL=1;
48 1 Delay();
49 1 SDA=1;
50 1 Delay();
51 1 }
52 /*********************************************************
53 功能:输出ACK,每个字节传输完成,输出ack=0,结束读数据,ack=1;
54 **********************************************************/
55 void WriteACK(uchar ack)
C51 COMPILER V8.02 PCF8563C 08/10/2007 21:32:41 PAGE 2
56 {
57 1 SDA=ack;
58 1 Delay();
59 1 SCL=1;
60 1 Delay();
61 1 SCL=0;
62 1 }
63 /********************************************
64 功能:等待ACK
65 ********************************************/
66 void WaitACK()
67 { uchar errtime=20;
68 1 SDA=1;
69 1 Delay(); /*读ACK*/
70 1 SCL=1;
71 1 Delay();
72 1 while(SDA)
73 1 { errtime--;
74 2 if(!errtime) Stop();
75 2 }
76 1 SCL=0;
77 1 Delay();
78 1 }
79 /********************************************
80 功能:写一个字节,入口:wdata=数据
81 ********************************************/
82 void writebyte(uchar wdata)
83 {
84 1 uchar i;
85 1 for(i=0;i<8;i++)
86 1 {
87 2 if(wdata&0x80) SDA=1;
88 2 else SDA=0;
89 2 wdata<<=1;
90 2 SCL=1;
91 2 Delay();
92 2 SCL=0;
93 2 }
94 1 WaitACK(); //I2C器件或通讯出错,将会退出I2C通讯
95 1 }
96 /********************************************
97 功能:读一个字节,出口:bytedata
98 ********************************************/
99 uchar Readbyte()
100 {
101 1 uchar i,bytedata;
102 1 SDA=1;
103 1 for(i=0;i<8;i++)
104 1 {
105 2 SCL=1;
106 2 bytedata<<=1;
107 2 bytedata|=SDA;
108 2 SCL=0;
109 2 Delay();
110 2 }
111 1 return(bytedata);
112 1 }
113 /********************************************
114 功能:输出数据->pcf8563
115 ********************************************/
116 void writeData(uchar address,uchar mdata)
117 {
C51 COMPILER V8.02 PCF8563C 08/10/2007 21:32:41 PAGE 3
118 1 Start();
119 1 writebyte(0xa2); /*写命令*/
120 1 writebyte(address); /*写地址*/
121 1 writebyte(mdata); /*写数据*/
122 1 Stop();
123 1 }
124 /********************************************
125 功能:输入数据<-pcf8563
126 ********************************************/
127 uchar ReadData(uchar address) /*单字节*/
128 { uchar rdata;
129 1 Start();
130 1 writebyte(0xa2); /*写命令*/
131 1 writebyte(address); /*写地址*/
132 1 Start();
133 1 writebyte(0xa3); /*读命令*/
134 1 rdata=Readbyte();
135 1 WriteACK(1);
136 1 Stop();
137 1 return(rdata);
138 1 }
139 /********************************************
140 功能:输入多个数据<-pcf8563
141 ********************************************/
142 void ReadData1(uchar address,uchar count,uchar * buff) /*多字节*/
143 { uchar i;
144 1 Start();
145 1 writebyte(0xa2); /*写命令*/
146 1 writebyte(address); /*写地址*/
147 1 Start();
148 1 writebyte(0xa3); /*读命令*/
149 1 for(i=0;i<count;i++)
150 1 {
151 2 buff[i]=Readbyte();
152 2 if(i<count-1) WriteACK(0);
153 2 }
154 1 WriteACK(1);
155 1 Stop();
156 1 }
157 /********************************************
158 功能:读入时间到内部缓冲区
159 ********************************************/
160 void P8563_Read()
161 { uchar time[7];
162 1 ReadData1(0x02,0x07,time);
163 1 g8563_Store[0]=time[0]&0x7f; /*秒*/
164 1 g8563_Store[1]=time[1]&0x7f; /*分*/
165 1 g8563_Store[2]=time[2]&0x3f; /*小时*/
166 1 g8563_Store[3]=time[3]&0x3f; /*日*/
167 1 g8563_Store[4]=time[4]&0x07; /*星期*/
168 1 g8563_Store[5]=time[5]&0x1f; /*月*/
169 1 g8563_Store[6]=time[6]&0xff; /*年*/
170 1 }
171 /********************************************
172 功能:读入时间到内部缓冲区----外部调用
173 ********************************************/
174 /*void P8563_gettime()
175 {
176 P8563_Read();
177 if(g8563_Store[0]==0)
178 P8563_Read(); //如果秒为0,为防止时间变化,再读一次
179 }*/
C51 COMPILER V8.02 PCF8563C 08/10/2007 21:32:41 PAGE 4
180 /********************************************
181 功能:写时间修改值
182 ********************************************/
183 void P8563_settime()
184 {
185 1 uchar i;
186 1 for(i=2;i<=8;i++) { writeData(i,g8563_Store[i-2]); }
187 1 }
188 /********************************************
189 功能:P8563的初始化
190 ********************************************/
191 void P8563_init1() //P8563的初始化
192 {
193 1 uchar i;
194 1 if((ReadData(0xa)&0x3f)!=0x8) /*检查是否第一次启动,是则初始化时间*/
195 1 {
196 2 for(i=0;i<=6;i++) g8563_Store[i]=c8563_Store[i]; /*初始化时间*/
197 2 P8563_settime();
198 2 writeData(0x0,0x00);
199 2 writeData(0xa,0x8); /*8:00报警*/
200 2 writeData(0x1,0x12); /*报警有效*/
201 2 writeData(0xd,0xf0);
202 2 }
203 1 }
204 /********************************************
205 功能:主程序
206 ********************************************/
207 main()
208
209 {
210 1 P8563_init1(); //P8563的初始化
211 1 P8563_Read(); //读出时间
212 1 while(1);
213 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 393 ----
CONSTANT SIZE = 7 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 10
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?