📄 pcf8563.lst
字号:
133 2 scl=0;
134 2 delay_();
135 2 }
136 1 return rbyte; //读到的字节
137 1 }
138
139 /*----------------------------------------------------------------------------&
140 pcf8563
141 ----------------------------------------------------------------------------&&*/
142 struct Time //时间结构体,包括了秒,分,时,日,周,月,年
143 {
144 uchar second;
145 uchar minute;
146 uchar hour;
147 uchar day;
148 uchar week;
149 uchar month;
150 uchar year;
151 };
152 struct Time time; //用来装时间数据
153 /*******************************************************************************
154 功能描述:向地址addr的寄存器写入多个字节
155 参数说明:addr:寄存器地址
156 length:要写入的字节数
157 pbuf:指向数据缓冲区的指针
158 返回说明:操作结果,0表示成功,1表示失败
159 *******************************************************************************/
160 uchar pcfwrite(uchar addr,uchar length,uchar *pbuf )
161 {
162 1 uchar i=0;
163 1 start();
164 1 if(writebyte(0xa2)) return 1; /*写pcf8563的ID与读控制位,通信有错误返回
165 1 IIC写入一个字节以后,将会读取从机上的应答,如果为0说明写入成功,如果为1则写入失败,
166 1 这里判断写入字节后的返回值,为1则返回1,即(这个函数运行失败),否则继续向下运行*/
167 1 if(writebyte(addr)) return 1; //写寄存器地址
168 1 for(i=0;i<length;i++) //写入length个字节
169 1 {
170 2 if(writebyte(pbuf[i])) return 1;//写数据
171 2 }
172 1 stop();
173 1 return 0;
174 1 }
175 /*******************************************************************************
176 功能描述:从地址addr的寄存器读取多个字节
177 参数说明:addr:寄存器地址
178 length:要读出的字节数
179 pbuf:指向数据缓冲区的指针
C51 COMPILER V9.01 PCF8563 07/28/2012 10:12:55 PAGE 4
180 返回说明:操作结果,0表示成功,1表示失败
181 *******************************************************************************/
182 uchar pcfread(uchar addr,uchar length,uchar *pbuf)
183 {
184 1 uchar i=0;
185 1 start();//通信开始
186 1 if(writebyte(0xa2)) return 1;//写PCF8563的ID与读(写)控制位,通信有错误返回
187 1 if(writebyte(addr)) return 1;//写寄存器地址
188 1
189 1 start();//通信开始
190 1 if(writebyte(0xa3)) return 1;//写PCF8563的ID与(读)写控制位,通信有错误返回
191 1 for(i=0;i<length-1;i++) //写入前length-1个字节,并作出应答
192 1 {
193 2 pbuf[i]=readbyte();
194 2 ack(); //每读取一个字节,主机应答
195 2 }
196 1 pbuf[i]=readbyte(); //写入最后一个字节且不应答
197 1 nack();
198 1 stop();
199 1 return 0;
200 1 }
201 /*******************************************************************************
202 功能描述:将BCD码转换为十进制的数值
203 参数说明:x:待转换的BCD码字节
204 返回说明:转换后的值
205 注:将BCD格式数据转为实际的值,如29的BCD格式为0x29,实
206 *******************************************************************************/
207 uchar bcdval(uchar x)
208 {return (x>>4)*10+(x&0x0f);//bcd码转为十进制
209 1 } //高四位乘以十加上低四位
210 /*******************************************************************************
211 功能描述:将十进制的数值转换为BCD码
212 参数说明:x:待转换的BCD码字节
213 返回说明:转换后的值
214 注:将BCD格式数据转为实际的值,如29的BCD格式为0x29,实
215 *******************************************************************************/
216 uchar valbcd(uchar x) //十进制数转为BCD码
217 {return (x/10)*16+(x%10);//十位乘以16加上个位
218 1 }
219 /*******************************************************************************
220 功能描述:读取时间
221 返回结果:操作结果,0表示成功,1表示失败
222 注:从PCF8563中读到的时间值,被装载到全局的外部结构体
223 *******************************************************************************/
224 uchar readtime()
225 {
226 1 uchar temp[7];//用于装载读回来的秒-年的7个字节的数据
227 1 if(!pcfread(0x02,7,temp))/*读取时间;时间寄存器的地址是02,
228 1 从02这个地址中读取7个字节放到temp中*/
229 1 {
230 2 //以下对读取到temp数组中的时间数据进行截取
231 2 //并转换为十进制写入到time中去
232 2 time.second=bcdval(temp[0]&0x7f);//秒,通过与操作屏蔽多余的位
233 2 time.minute=bcdval(temp[1]&0x7f);//分,获取真正的时间
234 2 time.hour =bcdval(temp[2]&0x3f);//时,bcd--是将bad编码转换成十进制数的函数
235 2 time.day =bcdval(temp[3]&0x3f);//日
236 2 time.week =bcdval(temp[4]&0x07);//星期
237 2 time.month =bcdval(temp[5]&0x1f);//月
238 2 time.year =bcdval(temp[6] );//年
239 2 return 0;//返回0,运行成功
240 2 }
241 1 else return 1;
C51 COMPILER V9.01 PCF8563 07/28/2012 10:12:55 PAGE 5
242 1 }
243 /*******************************************************************************
244 功能描述:设置时间
245 返回结果:操作结果,0表示成功,1表示失败
246 注:在设置时间前先将事间数据填充到time中去,随后调用此函数,时间
247 数据即被写入到PCF8563中,并以新设置的时间继续走时
248 *******************************************************************************/
249 uchar settime()
250 {
251 1 uchar i,temp[7];
252 1 for(i=0;i<7;i++)
253 1 {
254 2 temp[i]=valbcd(((uchar *)(&time))[i]);//将time中的十进制时间数据转换为BCD
255 2 } //转换后装到temp[7]临时数组中
256 1 return pcfwrite(0x02,7,temp);//将temp数组的数据写入到时间寄存器中
257 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 540 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 26
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 + -