找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3378|回复: 0
收起左侧

PCF8563T标准驱动源程序

[复制链接]
ID:52711 发表于 2019-8-10 22:20 | 显示全部楼层 |阅读模式
龙啸九天的标准IIC程序,PCF8563T

单片机源程序如下:
  1. /**————————————————————
  2. 2 〖说明〗I2C总线驱动程序(用两个普通IO模拟I2C总线)
  3. 3 包括100Khz(T=10us)的标准模式(慢速模式)选择,
  4. 4 和400Khz(T=2.5us)的快速模式选择,
  5. 5 默认11.0592Mhz的晶振。

  6. 9 〖版本〗V1.00A Build 0803
  7. 10 ————————————
  8. /**/
  9. #include <reg66x.h>    /* special function registers       */
  10. #include <INTRINS.H>


  11. #define uchar unsigned char
  12. #define uint unsigned int
  13. #define Byte unsigned char
  14. #define Word unsigned int
  15. #define bool bit
  16. #define true 1
  17. #define false 0
  18. uchar SystemError;

  19. #define SomeNOP()  _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  20. extern void delay(int n);
  21. /**--------------------------------------------------------------------------------
  22. 30 调用方式:void I2CStart(void) ﹫2001/07/0 4
  23. 31 函数说明:私有函数,I2C专用
  24. 32 ---------------------------------------------------------------------------------*/
  25. void I2CStart(void)
  26. {
  27. EA=0;
  28. SDA=1; SCL=1; SomeNOP();//INI
  29. SDA=0; SomeNOP(); //START
  30. SCL=0;
  31. }

  32. /**--------------------------------------------------------------------------------
  33. 42 调用方式:void I2CStop(void) ﹫2001/07/0 4
  34. 43 函数说明:私有函数,I2C专用
  35. 44 ---------------------------------------------------------------------------------*/
  36. void I2CStop(void)
  37. {
  38. SCL=0; SDA=0; SomeNOP(); //INI
  39. SCL=1; SomeNOP(); SDA=1; //STOP
  40. EA=1;
  41. }

  42. /**--------------------------------------------------------------------------------
  43. 53 调用方式:bit I2CAck(void) ﹫2001/07/0 4
  44. 54 函数说明:私有函数,I2C专用,等待从器件接收方的应答
  45. 55 ---------------------------------------------------------------------------------*/
  46. bool WaitAck(void)
  47. {
  48. uchar errtime=255;//因故障接收方无ACK,超时值为255。
  49. SDA=1;SomeNOP();
  50. SCL=1;SomeNOP();
  51. while(SDA) {errtime--; if (!errtime) {I2CStop();SystemError=0x11;return false;}}
  52. SCL=0;
  53. return true;
  54. //第1 页
  55. //文件: PCF8563T.C 2001-11-27, 18:39:20
  56. }

  57. /**--------------------------------------------------------------------------------
  58. 67 调用方式:void SendAck(void) ﹫2001/07/0 4
  59. 68 函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
  60. 69 ---------------------------------------------------------------------------------*/
  61. void SendAck(void)
  62. {
  63. SDA=0; SomeNOP();
  64. SCL=1; SomeNOP();
  65. SCL=0;
  66. }

  67. /**--------------------------------------------------------------------------------
  68. 78 调用方式:void SendAck(void) ﹫2001/07/0 4
  69. 79 函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
  70. 80 }**--------------------------------------------------------------------------------
  71. */
  72. void SendNotAck(void)
  73. {
  74. SDA=1; SomeNOP();
  75. SCL=1; SomeNOP();
  76. SCL=0;
  77. }

  78. /**--------------------------------------------------------------------------------
  79. 89 调用方式:void I2CSend(uchar ch) ﹫2001/07/0 5
  80. 90 函数说明:私有函数,I2C专用
  81. 91 ---------------------------------------------------------------------------------*/
  82. void I2CSendByte(Byte ch)
  83. {
  84. uchar i=8;
  85. while (i--)
  86. {
  87. SCL=0;_nop_();
  88. SDA=(bit)(ch&0x80); ch<<=1; SomeNOP();
  89. SCL=1; SomeNOP();
  90. }
  91. SCL=0;
  92. }

  93. /**--------------------------------------------------------------------------------
  94. 105 调用方式:uchar I2CReceive(void) ﹫2001/07/0 5
  95. 106 函数说明:私有函数,I2C专用
  96. 107 ---------------------------------------------------------------------------------*/
  97. Byte I2CReceiveByte(void)
  98. {
  99. uchar i=8;
  100. Byte ddata=0;
  101. SDA=1;
  102. while (i--)
  103. {
  104. ddata<<=1;
  105. SCL=0;SomeNOP();
  106. SCL=1;SomeNOP();
  107. ddata|=SDA;
  108. }
  109. SCL=0;
  110. return ddata;
  111. }


  112. //---------------------------------------------------------------------------
  113. //开始PCF8563T驱动程序
  114. //第2 页
  115. //文件: PCF8563T.C 2001-11-27, 18:39:20
  116. /**--------------------------------------------------------------------------------
  117. 128 调用方式:void GetPCF8563(uchar firsttype,uchar count,uchar *buff) ﹫2001/08/0 7
  118. 129 函数说明:读取时钟芯片PCF8563的时间,设置要读的第一个时间类型firsttype,并设置读取
  119. 130 的字节数,则会一次把时间读取到buff中。顺序是:
  120. 131 0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
  121. 132 ---------------------------------------------------------------------------------*/
  122. void GetPCF8563(uchar firsttype,uchar count,uchar *buff)
  123. {
  124. uchar i;
  125. I2CStart();
  126. I2CSendByte(0xA2);
  127. WaitAck();
  128. I2CSendByte(firsttype);
  129. WaitAck();

  130. I2CStart();
  131. I2CSendByte(0xA3);
  132. WaitAck();

  133. for (i=0;i<count;i++)
  134. {
  135. buff[i]=I2CReceiveByte();
  136. if (i!=count-1) SendAck();//除最后一个字节外,其他都要从MASTER发应答。
  137. }

  138. SendNotAck();
  139. I2CStop();
  140. }


  141. /**--------------------------------------------------------------------------------
  142. 158 调用方式:void SetPCF8563(uchar timetype,uchar value) ﹫2001/08/0 7
  143. 159 函数说明:调整时钟。timetype是要改的时间类型,value是新设置的时间值(BCD格式)。
  144. 160 0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
  145. 161 ---------------------------------------------------------------------------------*/
  146. void SetPCF8563(uchar timetype,uchar value)
  147. {
  148. I2CStart();
  149. I2CSendByte(0xA2);
  150. WaitAck();
  151. I2CSendByte(timetype);
  152. WaitAck();
  153. I2CSendByte(value);
  154. WaitAck();
  155. I2CStop();
  156. }

  157. /**--------------------------------------------------------------------------------
  158. 175 调用方式:void SetAlarmHour(uchar count) ﹫2001/08/0 7
  159. 176 函数说明:设置报警闹钟在一天的第count点报警。例如:count=23,则在晚上11点报警。
  160. 177 ---------------------------------------------------------------------------------
  161. void SetAlarm(uchar alarmtype,uchar count)
  162. {
  163. SetPCF8563(0x01,0x02);
  164. SetPCF8563(alarmtype,count);
  165. }
  166. */
  167. /**--------------------------------------------------------------------------------
  168. 85 调用方式:void CleanAlarm(void) ﹫2001/08/0 7
  169. 186 函数说明:清除所有报警设置。
  170. 187 ---------------------------------------------------------------------------------
  171. void CleanAlarm(void)
  172. {
  173. //第3 页
  174. //文件: PCF8563T.C 2001-11-27, 18:39:20
  175. SetPCF8563(0x01,0x00);
  176. SetPCF8563(0x09,0x80);
  177. SetPCF8563(0x0A,0x80);
  178. SetPCF8563(0x0B,0x80);
  179. SetPCF8563(0x0C,0x80);
  180. // SetPCF8563(0x0D,0x00);
  181. // SetPCF8563(0x0E,0x03);
  182. }
  183. */

  184. /*--------------------------------------------------------------------------------
  185. 201 调用方式:uchar read1380(uchar command )
  186. 202 函数说明:read1380()返回当前时间, command指要返回的时间类型。
  187. 203 秒:81H 分钟:83H 小时:85H 日期:87H 星期:89H 星期几:8BH 年:8D H
  188. 204 ---------------------------------------------------------------------------------*/
  189. // uchar read1380 (uchar command)
  190. // {
  191. // uchar time;
  192. // GetPCF8563(command,1,&time);
  193. // return time;
  194. // }

  195. //---------------------------------------------------------------------------
  196. //开始CAT1161驱动程序
  197. //第2 页
  198. //文件: CAT1161.C 2001-11-27, 18:39:20
  199. /**--------------------------------------------------------------------------------
  200. 128 调用方式:void GetCAT1161(uchar catadd,uchar count,uchar *buff) ﹫2001/08/0 7
  201. 129 函数说明:读取时钟芯片PCF8563的时间,设置要读的第一个时间类型firsttype,并设置读取
  202. 130 的字节数,则会一次把时间读取到buff中。顺序是:
  203. 131 0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
  204. 132 ---------------------------------------------------------------------------------
  205. void GetCAT1161(uchar catadd,uchar *buff)
  206. {
  207. // uchar i;
  208. I2CStart();
  209. I2CSendByte(0xA0);
  210. WaitAck();
  211. I2CSendByte(catadd);
  212. WaitAck();

  213. I2CStart();
  214. I2CSendByte(0xA1);
  215. WaitAck();
  216. I2CSendByte(catadd);
  217. WaitAck();
  218. // for (i=0;i<count;i++)
  219. // {
  220. *buff=I2CReceiveByte();
  221. // if (i!=count-1) SendAck();//除最后一个字节外,其他都要从MASTER发应答。
  222. // }

  223. SendNotAck();
  224. I2CStop();
  225. }


  226. /**--------------------------------------------------------------------------------
  227. 158 调用方式:void SetCAT1161(uchar timetype,uchar value) ﹫2001/08/0 7
  228. 159 函数说明:调整时钟。timetype是要改的时间类型,value是新设置的时间值(BCD格式)。
  229. 160 0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
  230. 161 ---------------------------------------------------------------------------------
  231. void SetCAT1161(uchar catadd,uchar value)
  232. {
  233. I2CStart();
  234. I2CSendByte(0xA0);
  235. WaitAck();
  236. I2CSendByte(catadd);
  237. WaitAck();
  238. I2CSendByte(value);
  239. WaitAck();
  240. I2CStop();
  241. }
  242. */
  243. //---------------------------------------------------------------------------
  244. //开始AT24C02驱动程序
  245. /**--------------------------------------------------------------------------------
  246. 128 调用方式:void AT24C02(uchar firstadd,uchar count,uchar *buff) ﹫2001/08/0 7
  247. 129 函数说明:

  248. 132 ---------------------------------------------------------------------------------*/
  249. void ReadAT24C02(uchar *buff)

  250. {

  251. unsigned char i=0;
  252. unsigned char nLen=26;
  253. I2CStart();
  254. I2CSendByte(0xA0);
  255. WaitAck();
  256. I2CSendByte(0x00);  //ram的第一个地址
  257. WaitAck();

  258. I2CStart();
  259. I2CSendByte(0xA1);
  260. WaitAck();

  261. while(--nLen)
  262. {

  263.   buff[i]=I2CReceiveByte(); //读出内容
  264.   i++;   //指针加1
  265.   SendAck();   //发确认信号
  266. }
  267. buff[i]=I2CReceiveByte();   //读一字节
  268. SendNotAck();   //没有确认信号


  269. I2CStop();
  270. }


  271. /**--------------------------------------------------------------------------------
  272. 158 调用方式:void SetAT24C02(uchar firstadd,uchar count,uchar *buff) ﹫2005/12/28
  273. 159 函数说明:
  274. 161 ---------------------------------------------------------------------------------*/
  275. void WriteAT24C02(uchar *buff)

  276. {
  277.   unsigned char i,temp,Addr;
  278.   unsigned char k=0;
  279.   unsigned char nLen=26;
  280.   Addr=0x00;
  281. I2CStart();
  282. I2CSendByte(0xA0);
  283. WaitAck();
  284. I2CSendByte(Addr);
  285. WaitAck();
  286. for(i = 0;i < nLen;i++)
  287.         {
  288.                  if(Addr%8==0)   //每页8字节  //换页
  289.                          {
  290.                           I2CStop();
  291.                                delay(10000);
  292.                                SomeNOP();
  293.                           I2CStart();
  294.                           I2CSendByte(0xA0);
  295.                           WaitAck();
  296.                           I2CSendByte(Addr);
  297.                           WaitAck();
  298.                          }
  299.                  temp = buff[k];
  300.                  I2CSendByte(temp);
  301.                  WaitAck();
  302.                  k++;
  303.                 Addr++;
  304.         }

  305. I2CStop();
  306. }
复制代码

以上程序51hei提供下载:
pcf8563t.rar (2.37 KB, 下载次数: 92)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表