找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2801|回复: 1
收起左侧

FPC8563 STM32驱动程序,写的很详细有注释

[复制链接]
ID:323744 发表于 2019-11-10 14:21 | 显示全部楼层 |阅读模式
  1. #include "stm32f10x.h"
  2. #include <io.h>
  3. #include <delay.h>
  4. #include <sys.h>
  5. #include <usart.h>
  6. #include <pcf8563.h>
  7. #define LED1 PBout(14)// PB14
  8. #define LED2 PBout(15)// PE15

  9. u8 Time_send[5];
  10. void Structure_time_Array()
  11. {
  12. Datetime_Structure DateTime;
  13. Time_send[0]=DateTime.year;        
  14. Time_send[0]=DateTime.month;
  15. Time_send[0]=DateTime.day;
  16. Time_send[0]=DateTime.hour;
  17. Time_send[0]=DateTime.min;
  18. Time_send[0]=DateTime.second;
  19. }

  20.          u8 x;
  21. int main()
  22. {        

  23.     delay_init();        //delay 函数初始化
  24.    uart_init(9600);         //串口初始化为115200波特率
  25.          io_init();
  26.         IIC_Init();
  27.         delay_ms(10);

  28.   PCF8563_set_time(0x13,0x0b,0x0a,0x0b,0x1d,0x1e);
  29.   while(1)
  30.         {
  31.                
  32. //    Datetime_Structure rtc_get_time();
  33. //                Structure_time_Array();
  34. //                delay_ms(100);
  35. //                Usart_Send_Array_tx(Time_send,5);
  36.                
  37.                 Usart_Send(PCF8563_Read_Byte(0x02));
  38.         delay_ms(1000);
  39.                                                                                           
  40.         }

  41. }
复制代码
  1. #include <sys.h>
  2. #include <pcf8563.h>
  3. #include <delay.h>

  4. #define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
  5. #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}

  6. //IO操作函数         
  7. #define IIC_SCL    PBout(6) //SCL
  8. #define IIC_SDA    PBout(7) //SDA         
  9. #define READ_SDA   PBin(7)  //输入SDA

  10. //初始化IIC
  11. void IIC_Init(void)
  12. {                                             
  13.         GPIO_InitTypeDef GPIO_InitStructure;
  14.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        //使能GPIOB时钟
  15.            
  16.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
  17.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
  18.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  19.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  20.         GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);         //PB6,PB7 输出高
  21. }

  22. //产生IIC起始信号
  23. void IIC_Start(void)
  24. {
  25.         SDA_OUT();     //sda线输出
  26.         IIC_SDA=1;                    
  27.         IIC_SCL=1;
  28.         delay_us(4);
  29.          IIC_SDA=0;//START:when CLK is high,DATA change form high to low
  30.         delay_us(4);
  31.         IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
  32. }         
  33. //产生IIC停止信号
  34. void IIC_Stop(void)
  35. {
  36.         SDA_OUT();//sda线输出
  37.         IIC_SCL=0;
  38.         IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
  39.          delay_us(4);
  40.         IIC_SCL=1;
  41.         IIC_SDA=1;//发送I2C总线结束信号
  42.         delay_us(4);                                                                  
  43. }
  44. //等待应答信号到来
  45. //返回值:1,接收应答失败
  46. //        0,接收应答成功
  47. u8 IIC_Wait_Ack(void)
  48. {
  49.         u8 ucErrTime=0;
  50.         SDA_IN();      //SDA设置为输入  
  51.         IIC_SDA=1;delay_us(1);           
  52.         IIC_SCL=1;delay_us(1);         
  53.         while(READ_SDA)
  54.         {
  55.                 ucErrTime++;
  56.                 if(ucErrTime>250)
  57.                 {
  58.                         IIC_Stop();
  59.                         return 1;
  60.                 }
  61.         }
  62.         IIC_SCL=0;//时钟输出0            
  63.         return 0;  
  64. }
  65. //产生ACK应答
  66. void IIC_Ack(void)
  67. {
  68.         IIC_SCL=0;
  69.         SDA_OUT();
  70.         IIC_SDA=0;
  71.         delay_us(2);
  72.         IIC_SCL=1;
  73.         delay_us(2);
  74.         IIC_SCL=0;
  75. }
  76. //不产生ACK应答                    
  77. void IIC_NAck(void)
  78. {
  79.         IIC_SCL=0;
  80.         SDA_OUT();
  81.         IIC_SDA=1;
  82.         delay_us(2);
  83.         IIC_SCL=1;
  84.         delay_us(2);
  85.         IIC_SCL=0;
  86. }                                                                              
  87. //IIC发送一个字节
  88. //返回从机有无应答
  89. //1,有应答
  90. //0,无应答                          
  91. void IIC_Send_Byte(u8 txd)
  92. {                        
  93.     u8 t;   
  94.         SDA_OUT();            
  95.     IIC_SCL=0;//拉低时钟开始数据传输
  96.     for(t=0;t<8;t++)
  97.     {              
  98.       
  99.                 if((txd&0x80)>>7)
  100.                         IIC_SDA=1;
  101.                 else
  102.                         IIC_SDA=0;
  103.                 txd<<=1;           
  104.                 delay_us(2);   //对TEA5767这三个延时都是必须的
  105.                 IIC_SCL=1;
  106.                 delay_us(2);
  107.                 IIC_SCL=0;        
  108.                 delay_us(2);
  109.     }         
  110. }            
  111. //读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
  112. u8 IIC_Read_Byte(unsigned char ack)
  113. {
  114.         unsigned char i,receive=0;
  115.         SDA_IN();//SDA设置为输入
  116.     for(i=0;i<8;i++ )
  117.         {
  118.         IIC_SCL=0;
  119.         delay_us(2);
  120.                     IIC_SCL=1;
  121.         receive<<=1;
  122.    if(READ_SDA)receive++;   
  123.                 delay_us(1);
  124.    }                                         
  125.     if (!ack)
  126.         IIC_NAck();//发送nACK
  127.     else
  128.         IIC_Ack(); //发送ACK   
  129.     return receive;
  130. }

  131. void PCF8563_Write_Byte(unsigned char REG_ADD, unsigned char dat)
  132. {
  133.         
  134.   IIC_Start();
  135.         IIC_Send_Byte(PCF8563_Write);//发送写命令并检查应答位
  136.   while(IIC_Wait_Ack());
  137.         IIC_Send_Byte(REG_ADD);
  138.         IIC_Wait_Ack();
  139.         IIC_Send_Byte(dat);        //发送数据
  140.         IIC_Wait_Ack();
  141.         IIC_Stop();
  142.         
  143. }
  144. //读取地数据
  145. // reg——add  要读取的寄存器
  146. unsigned char PCF8563_Read_Byte(unsigned char REG_ADD)
  147. {        
  148.         u8 ReData;

  149.         IIC_Start( );        
  150.         IIC_Send_Byte(PCF8563_Write);//发送写命令并检查应答位        
  151.   while(IIC_Wait_Ack( ));        
  152.   IIC_Send_Byte(REG_ADD);        //确定要操作的寄存器
  153.         IIC_Wait_Ack();
  154.         IIC_Start();        //启动总线
  155.         IIC_Send_Byte(PCF8563_Read);        //发送读取命令
  156.         IIC_Wait_Ack();
  157.         ReData = IIC_Read_Byte(0);                //读取数据,加发送非应答
  158.         IIC_Stop();        
  159.         return ReData;
  160. }

  161. //函数名称:void rtc_set_time(u8 year,u8 month,u8 day,u8 hour,u8 min,u8 second)
  162. //功    能:设置RTC芯片PCF8563的时间
  163. //输    入:year month day hour min second:年月日时分秒
  164. //输    出:无
  165. void PCF8563_set_time(u8 year,u8 month,u8 day,u8 hour,u8 min,u8 second)
  166. {
  167.     PCF8563_Write_Byte(TIME_SECOND,second);
  168.           delay_us(20);
  169.     PCF8563_Write_Byte(TIME_MINUTE,min);
  170.                 delay_us(20);
  171.     PCF8563_Write_Byte(TIME_HOUR,hour);
  172.                 delay_us(20);
  173.     PCF8563_Write_Byte(TIME_DAY,day);
  174.                 delay_us(20);
  175.     PCF8563_Write_Byte(TIME_MONTH,month);
  176.                 delay_us(20);
  177.     PCF8563_Write_Byte(TIME_YEAR,year);
  178.                 delay_us(20);
  179.         
  180. }

  181. //函数名称:Datetime_Structure rtc_get_time(void)
  182. //功    能:读取RTC芯片PCF8563的时间
  183. //输    入:无
  184. //输    出:Datetime_Structure结构体变量
  185.   Datetime_Structure rtc_get_time(void)
  186. {
  187.     u32 m_unTempTime;
  188.     Datetime_Structure getTime_Struct;

  189.     /*get time---second****************/
  190.     m_unTempTime = PCF8563_Read_Byte(TIME_SECOND)&0x7f;
  191.     m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
  192.     getTime_Struct.second = m_unTempTime;

  193.     /*get time---minute****************/
  194.     m_unTempTime = PCF8563_Read_Byte(TIME_MINUTE)&0x7f;
  195.     m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
  196.     getTime_Struct.min = m_unTempTime;

  197.     /*get time---hour****************/
  198.     m_unTempTime = PCF8563_Read_Byte(TIME_HOUR)&0x3f;
  199.     m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
  200.     getTime_Struct.hour = m_unTempTime;

  201.     /*get time---day****************/
  202.     m_unTempTime = PCF8563_Read_Byte(TIME_DAY)&0x3f;
  203.     m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
  204.     getTime_Struct.day = m_unTempTime;        

  205.     /*get time---month****************/
  206.     m_unTempTime = PCF8563_Read_Byte(TIME_MONTH)&0x1f;
  207.     m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
  208.     getTime_Struct.month = m_unTempTime;               

  209.     /*get time---year****************/
  210.     m_unTempTime = PCF8563_Read_Byte(TIME_YEAR)&0xff;
  211.     m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
  212.     getTime_Struct.year = m_unTempTime;               

  213.     return getTime_Struct;
  214. }

复制代码
全部资料51hei下载地址:
库函数i2c_pcf8563.7z (186.05 KB, 下载次数: 66)

评分

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

查看全部评分

回复

使用道具 举报

ID:169063 发表于 2020-10-28 17:12 | 显示全部楼层
非常感谢,是我需要代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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