久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3641|回復: 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, 下載次數: 74)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:169063 發表于 2020-10-28 17:12 | 只看該作者
非常感謝,是我需要代碼
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久国产精品人 | 日本激情一区二区 | 精品国产一区二区在线 | 国产精品影视 | 久久日韩精品 | www.久| 国产福利精品一区 | 日韩精品a在线观看图片 | 久久久久国产 | 亚洲福利在线观看 | 国产在线视频一区二区董小宛性色 | 人人九九精 | 无码国模国产在线观看 | 国内精品视频在线观看 | 在线观看亚洲精品视频 | 一区精品视频在线观看 | 国内自拍视频在线观看 | 丁香婷婷综合激情五月色 | 欧美日韩黄色一级片 | 久久精品99| 毛片一级片 | 日韩一区二区在线视频 | 夜夜夜久久久 | 一区二区三区高清在线观看 | 欧美成视频 | 欧美日韩18 | 九九精品在线 | 亚洲国产成人精品女人久久久 | 色999视频| av网站免费观看 | 国产精品伦理一区二区三区 | 成人欧美一区二区三区白人 | 国产第一区二区 | 激情亚洲 | 日韩一区在线播放 | 国产精品性做久久久久久 | 国产激情精品一区二区三区 | 黄色免费av | 欧美极品视频在线观看 | 中文日韩在线视频 | 国产成人免费视频 |