-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpcf8563.h
431 lines (367 loc) · 19.8 KB
/
pcf8563.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
/**
*****************************************************************************
* 时钟芯片PCF8563驱动
*
* (C) Copyright 2000-2020, ***
* All Rights Reserved
*****************************************************************************
*
* @File : pcf8563.h
* @By : Sam Chan
* @Version : V1.0
* @Date : 2012 / 08 / 28
*
*****************************************************************************
* Update
* @Version : V1.0.1
* @By : Sam Chan
* @Date : 2013 / 10 / 20
* @Brief : A、增加显示时间日期格式数组
* B、增加读取时间处理函数,读取到的时间日期信息直接转换成ASCII保存到时间格式数组中
* C、调用时间日期处理函数,显示或者打印到串口的话直接显示或者打印时间格式数组即可
*
* @Version : V1.0.2
* @By : Sam Chan
* @Date : 2014 / 02 / 26
* @Brief : 修正年结构为16位数值,数值位,比如20xx、19xx
*
* @Version : V1.0.3
* @By : Sam Chan
* @Date : 2014 / 03 / 09
* @Brief : 增加PCF8563是否存在检测函数
*
* @Version : V1.0.4
* @By : Sam Chan
* @Date : 2014 / 05 / 10
* @Brief : A、增加导入默认参数函数,方便移植
* B、增加对C++环境的支持
*
* @Version : V1.0.5
* @By : Sam Chan
* @Date : 2014 / 07 / 19
* @Brief : A、修正显示时间时bug,显示字符后有乱码现象或者显示了不该显示的字符
* B、增加直接设置时间函数,方便用类似于USMART这样的工具直接调整
*
* @Version : V2.0
* @By : Sam
* @Date : 2015 / 05 / 15
* @Brief : 全面修改代码,增加带BIN和BCD转换功能
*
*****************************************************************************
**/
#ifndef _pcf8563_h_
#define _pcf8563_h_
/**
****************************** Support C++ **********************************
**/
#ifdef __cplusplus
extern "C"{
#endif
/**
*****************************************************************************
**/
/******************************************************************************
外部函数头文件
应用到不同的外设头文件请在这里修改即可
******************************************************************************/
#include "stm8l10x.h"
/******************************************************************************
参数宏定义
******************************************************************************/
#define PCF8563_Check_Data (unsigned char)0x55 //检测用,可用其他数值
#define PCF8563_Write (unsigned char)0xa2 //写命令
#define PCF8563_Read (unsigned char)0xa3 //读命令,或者用(PCF8563_Write + 1)
//
//电源复位功能
//
#define PCF8563_PowerResetEnable (unsigned char)0x08
#define PCF8563_PowerResetDisable (unsigned char)0x09
//
//世纪位操作定义
//
#define PCF_Century_SetBitC (unsigned char)0x80
#define PCF_Century_19xx (unsigned char)0x03
#define PCF_Century_20xx (unsigned char)0x04
//
//数据格式
//
#define PCF_Format_BIN (unsigned char)0x01
#define PCF_Format_BCD (unsigned char)0x02
//
//设置PCF8563模式用
//
#define PCF_Mode_Normal (unsigned char)0x05
#define PCF_Mode_EXT_CLK (unsigned char)0x06
#define PCF_Mode_INT_Alarm (unsigned char)0x07
#define PCF_Mode_INT_Timer (unsigned char)0x08
/******************************************************************************
参数寄存器地址宏定义
******************************************************************************/
#define PCF8563_Address_Control_Status_1 (unsigned char)0x00 //控制/状态寄存器1
#define PCF8563_Address_Control_Status_2 (unsigned char)0x01 //控制/状态寄存器2
#define PCF8563_Address_CLKOUT (unsigned char)0x0d //CLKOUT频率寄存器
#define PCF8563_Address_Timer (unsigned char)0x0e //定时器控制寄存器
#define PCF8563_Address_Timer_VAL (unsigned char)0x0f //定时器倒计数寄存器
#define PCF8563_Address_Years (unsigned char)0x08 //年
#define PCF8563_Address_Months (unsigned char)0x07 //月
#define PCF8563_Address_Days (unsigned char)0x05 //日
#define PCF8563_Address_WeekDays (unsigned char)0x06 //星期
#define PCF8563_Address_Hours (unsigned char)0x04 //小时
#define PCF8563_Address_Minutes (unsigned char)0x03 //分钟
#define PCF8563_Address_Seconds (unsigned char)0x02 //秒
#define PCF8563_Alarm_Minutes (unsigned char)0x09 //分钟报警
#define PCF8563_Alarm_Hours (unsigned char)0x0a //小时报警
#define PCF8563_Alarm_Days (unsigned char)0x0b //日报警
#define PCF8563_Alarm_WeekDays (unsigned char)0x0c //星期报警
/******************************************************************************
参数屏蔽宏定义
******************************************************************************/
#define PCF8563_Shield_Control_Status_1 (unsigned char)0xa8
#define PCF8563_Shield_Control_Status_2 (unsigned char)0x1f
#define PCF8563_Shield_Seconds (unsigned char)0x7f
#define PCF8563_Shield_Minutes (unsigned char)0x7f
#define PCF8563_Shield_Hours (unsigned char)0x3f
#define PCF8563_Shield_Days (unsigned char)0x3f
#define PCF8563_Shield_WeekDays (unsigned char)0x07
#define PCF8563_Shield_Months_Century (unsigned char)0x1f
#define PCF8563_Shield_Years (unsigned char)0xff
#define PCF8563_Shield_Minute_Alarm (unsigned char)0x7f
#define PCF8563_Shield_Hour_Alarm (unsigned char)0x3f
#define PCF8563_Shield_Day_Alarm (unsigned char)0x3f
#define PCF8563_Shield_WeekDays_Alarm (unsigned char)0x07
#define PCF8563_Shield_CLKOUT_Frequency (unsigned char)0x03
#define PCF8563_Shield_Timer_Control (unsigned char)0x03
#define PCF8563_Shield_Timer_Countdown_Value (unsigned char)0xff
/******************************************************************************
PCF8563寄存器结构定义
******************************************************************************/
/**
==================================================================
全部寄存器结构
==================================================================
**/
typedef struct
{
unsigned char Control_Status_1; //控制寄存器1
unsigned char Control_Status_2; //控制寄存器2
unsigned char Seconds; //秒寄存器
unsigned char Minutes; //分钟寄存器
unsigned char Hours; //小时寄存器
unsigned char Days; //日期寄存器
unsigned char WeekDays; //星期寄存器,数值范围:0 ~ 6
unsigned char Months_Century; //月份寄存器,bit7为世纪位,0:指定世纪数为20xx;1:指定世纪数为19xx
unsigned char Years; //年寄存器
unsigned char Minute_Alarm; //分钟报警寄存器
unsigned char Hour_Alarm; //小时报警寄存器
unsigned char Day_Alarm; //日期报警寄存器
unsigned char WeekDays_Alarm; //星期报警寄存器,数值范围:0 ~ 6
unsigned char CLKOUT_Frequency; //频率管脚输出控制寄存器
unsigned char Timer_Control; //定时器控制寄存器
unsigned char Timer_Countdown_Value; //定时器计数寄存器
}_PCF8563_Register_Typedef;
/**
==================================================================
时间信息结构
==================================================================
**/
typedef struct
{
unsigned char RTC_Hours; //小时
unsigned char RTC_Minutes; //分钟
unsigned char RTC_Seconds; //秒钟
unsigned char Reseved; //保留
}_PCF8563_Time_Typedef;
/**
==================================================================
日期信息结构
==================================================================
**/
typedef struct
{
unsigned char RTC_Years; //年份
unsigned char RTC_Months; //月份
unsigned char RTC_Days; //日期
unsigned char RTC_WeekDays; //星期,数值范围:0 ~ 6
}_PCF8563_Date_Typedef;
extern _PCF8563_Time_Typedef PCF8563_Time;
extern _PCF8563_Date_Typedef PCF8563_Date;
/**
==================================================================
闹铃信息结构
==================================================================
**/
typedef struct
{
unsigned short Reseved; //保留
unsigned char RTC_AlarmDays; //日期闹铃
unsigned char RTC_AlarmWeekDays; //星期闹铃,数值范围:0 ~ 6
unsigned char RTC_AlarmHours; //小时闹铃
unsigned char RTC_AlarmMinutes; //分钟闹铃
unsigned char RTC_AlarmNewState; //闹铃开关
//其值有RTC_AlarmNewState_Open、RTC_AlarmNewState_Close、RTC_AlarmNewState_Open_INT_Enable
//只使用其中一个即可
unsigned char RTC_AlarmType; //报警类型,
//其值有RTC_AlarmType_Minutes、RTC_AlarmType_Hours、RTC_AlarmType_Days、RTC_AlarmType_WeekDays
//多个报警类型打开,请用或关系合并
}_PCF8563_Alarm_Typedef;
//
//闹铃开关
//
#define RTC_AlarmNewState_Open (u8)0x01
#define RTC_AlarmNewState_Close (u8)0x02 //闹铃关闭,并且关闭中断输出
#define RTC_AlarmNewState_Open_INT_Enable (u8)0x04 //闹铃开启并开启中断输出
//
//定义闹铃类型
//
#define RTC_AlarmType_Minutes (unsigned char)0x01
#define RTC_AlarmType_Hours (unsigned char)0x02
#define RTC_AlarmType_Days (unsigned char)0x04
#define RTC_AlarmType_WeekDays (unsigned char)0x08
/**
==================================================================
频率输出信息结构
==================================================================
**/
typedef struct
{
unsigned char CLKOUT_Frequency; //输出频率选择
//PCF_CLKOUT_F32768 --> 输出32.768KHz
//PCF_CLKOUT_F1024 --> 输出1024Hz
//PCF_CLKOUT_F32 --> 输出32Hz
//PCF_CLKOUT_F1 --> 输出1Hz
unsigned char CLKOUT_NewState; //输出状态
//PCF_CLKOUT_Close --> 输出被禁止并设成高阻抗
//PCF_CLKOUT_Open --> 输出有效
}_PCF8563_CLKOUT_Typedef;
//
//频率输出寄存器 --> 0x0d
//
#define PCF_CLKOUT_Open (unsigned char)(1<<7) //CLKOUT输出有效
#define PCF_CLKOUT_Close (unsigned char)(~(1<<7)) //CLKOUT输出被禁止并设成高阻抗
#define PCF_CLKOUT_F32768 (unsigned char)0x00 //输出32.768KHz
#define PCF_CLKOUT_F1024 (unsigned char)0x01 //输出1024Hz
#define PCF_CLKOUT_F32 (unsigned char)0x02 //输出32Hz
#define PCF_CLKOUT_F1 (unsigned char)0x03 //输出1Hz
/**
==================================================================
定时器信息结构
==================================================================
**/
typedef struct
{
unsigned char RTC_Timer_Value; //定时器计数器数值,设置定时时长,不需要的直接填0即可
unsigned char RTC_Timer_Frequency; //定时器工作频率
//PCF_Timer_F4096 --> 定时器时钟频率为4096Hz
//PCF_Timer_F64 --> 定时器时钟频率为64Hz
//PCF_Timer_F1 --> 定时器时钟频率为1Hz
//PCF_Timer_F160 --> 定时器时钟频率为1/60Hz
unsigned char RTC_Timer_NewState; //开启状态
//PCF_Timer_Close --> 关闭
//PCF_Timer_Open --> 开启
unsigned char RTC_Timer_Interrupt; //是否设置中断输出
//PCF_Time_INT_Close --> 关闭
//PCF_Time_INT_Open --> 开启
}_PCF8563_Timer_Typedef;
//
//定时器控制寄存器 --> 0x0e
//
#define PCF_Timer_Open (unsigned char)(1<<7) //定时器有效
#define PCF_Timer_Close (unsigned char)(~(1<<7)) //定时器无效
#define PCF_Timer_F4096 (unsigned char)0x00 //定时器时钟频率为4096Hz
#define PCF_Timer_F64 (unsigned char)0x01 //定时器时钟频率为64Hz
#define PCF_Timer_F1 (unsigned char)0x02 //定时器时钟频率为1Hz
#define PCF_Timer_F160 (unsigned char)0x03 //定时器时钟频率为1/60Hz
//
//中断输出开关
//
#define PCF_Time_INT_Open (unsigned char)(1<<0) //定时器中断有效
#define PCF_Time_INT_Close (unsigned char)(~(1<<0)) //定时器中断无效
/******************************************************************************
参数宏定义
******************************************************************************/
//
//控制/状态寄存器1 --> 0x00
//
#define PCF_Control_Status_NormalMode (unsigned char)(~(1<<7)) //普通模式
#define PCF_Control_Status_EXT_CLKMode (unsigned char)(1<<7) //EXT_CLK测试模式
#define PCF_Control_ChipRuns (unsigned char)(~(1<<5)) //芯片运行
#define PCF_Control_ChipStop (unsigned char)(1<<5) //芯片停止运行,所有芯片分频器异步置逻辑0
#define PCF_Control_TestcClose (unsigned char)(~(1<<3)) //电源复位功能失效(普通模式时置逻辑0)
#define PCF_Control_TestcOpen (unsigned char)(1<<3) //电源复位功能有效
//
//控制/状态寄存器2 --> 0x01
//
#define PCF_Control_TI_TF1 (unsigned char)(~(1<<4)) //当TF有效时INT有效,(取决于TIE的状态)
#define PCF_Control_TI_TF2 (unsigned char)(1<<4) //INT脉冲有效,(取决于TIE的状态)
//注意:若AF和AIE有有效时,则INT一直有效
#define PCF_Control_ClearAF (unsigned char)(~(1<<3)) //清除报警
#define PCF_Control_ClearTF (unsigned char)(~(1<<2))
//当报警发生时,AF被值逻辑1;在定时器倒计数结束时,
//TF被值逻辑1,他们在被软件重写前一直保持原有值,
//若定时器和报警中断都请求时,中断源有AF和TF决定,
//若要使清除一个标志位而防止另一标志位被重写,应运用逻辑
//指令AND
#define PCF_Alarm_INT_Open (unsigned char)(1<<1) //报警中断有效
#define PCF_Alarm_INT_Close (unsigned char)(~(1<<1)) //报警中断无效
//
//秒寄存器 --> 0x02
//
#define PCF_Accuracy_ClockNo (unsigned char)(1<<7) //不保证准确的时钟/日历数据
#define PCF_Accuracy_ClockYes (unsigned char)(~(1<<7)) //保证准确的时钟/日历数据
//
//分钟闹铃寄存器 --> 0x09
//
#define PCF_Alarm_MinutesOpen (unsigned char)(~(1<<7)) //分钟报警有效
#define PCF_Alarm_MinutesClose (unsigned char)(1<<7) //分钟报警无效
//
//小时闹铃寄存器 --> 0x0a
//
#define PCF_Alarm_HoursOpen (unsigned char)(~(1<<7)) //小时报警有效
#define PCF_Alarm_HoursClose (unsigned char)(1<<7) //小时报警无效
//
//日期闹铃寄存器 --> 0x0b
//
#define PCF_Alarm_DaysOpen (unsigned char)(~(1<<7)) //日报警有效
#define PCF_Alarm_DaysClose (unsigned char)(1<<7) //日报警无效
//
//星期闹铃寄存器 --> 0x0c
//
#define PCF_Alarm_WeekDaysOpen (unsigned char)(~(1<<7)) //星期报警有效
#define PCF_Alarm_WeekDaysClose (unsigned char)(1<<7) //星期报警无效
/******************************************************************************
外部功能函数
******************************************************************************/
void InitIIC(void);
void PCF8563_Write_Byte (unsigned char REG_ADD, unsigned char dat); //PCF8563某寄存器写入一个字节数据
unsigned char PCF8563_Read_Byte (unsigned char REG_ADD); //PCF8563某寄存器读取一个字节数据
void PCF8563_Write_nByte (unsigned char REG_ADD, unsigned char num, unsigned char *pBuff); //PCF8563写入多组数据
void PCF8563_Read_nByte (unsigned char REG_ADD, unsigned char num, unsigned char *pBuff); //PCF8563读取多组数据
unsigned char PCF8563_Check (void); //PCF8563检测是否存在
void PCF8563_Start (void); //PCF8563启动
void PCF8563_Stop (void); //PCF8563停止
void PCF8563_SetMode (unsigned char Mode); //PCF8563设置运行模式
void PCF8563_SetPowerReset (unsigned char NewState); //PCF8563设置电源复位功能开启与关闭
void PCF8563_SetCLKOUT (_PCF8563_CLKOUT_Typedef* PCF_CLKOUTStruct); //PCF8563设置输出频率
void PCF8563_SetTimer (_PCF8563_Timer_Typedef* PCF_TimerStruct); //PCF8563设置定时器
void PCF8563_Set_Times (unsigned char PCF_Format,\
unsigned char PCF_Century,\
unsigned char Year, unsigned char Month, unsigned char Date, unsigned char Week,\
unsigned char Hour, unsigned char Minute, unsigned char Second); //设置时间,主要用于后台调用,或者初始化时间用
void PCF8563_SetRegister (unsigned char PCF_Format, unsigned char PCF_Century, _PCF8563_Register_Typedef* PCF_DataStruct); //PCF8563写入寄存器
void PCF8563_GetRegister (unsigned char PCF_Format, unsigned char *PCF_Century, _PCF8563_Register_Typedef* PCF_DataStruct); //PCF8563读取寄存器
void PCF8563_SetTime (unsigned char PCF_Format, _PCF8563_Time_Typedef* PCF_DataStruct); //PCF8563写入时间信息
void PCF8563_GetTime (unsigned char PCF_Format, _PCF8563_Time_Typedef* PCF_DataStruct); //PCF8563读取时间信息
void PCF8563_SetDate (unsigned char PCF_Format, unsigned char PCF_Century, _PCF8563_Date_Typedef* PCF_DataStruct); //PCF8563写入日期信息
void PCF8563_GetDate (unsigned char PCF_Format, unsigned char *PCF_Century, _PCF8563_Date_Typedef* PCF_DataStruct); //PCF8563读取日期信息
void PCF8563_SetAlarm (unsigned char PCF_Format, _PCF8563_Alarm_Typedef* PCF_DataStruct); //PCF8563写入闹铃信息
void PCF8563_GetAlarm (unsigned char PCF_Format, _PCF8563_Alarm_Typedef* PCF_DataStruct); //PCF8563读取闹铃信息
/**
****************************** Support C++ **********************************
**/
#ifdef __cplusplus
}
#endif
/**
*****************************************************************************
**/
#endif /* end pcf8563.h */