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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6005|回復: 9
打印 上一主題 下一主題
收起左側

STM32F103 PCF8574硬件IIC程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:466381 發表于 2020-11-1 16:43 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本程序來自(杜洋工作室),使用了IIC1,親測可用,分享給大家學習,杜洋的程序風格很好 值得學習

單片機源程序如下:
  1. /*********************************************************************************************
  2. 模板制作:  杜洋工作室/洋桃電子
  3. 出品:               
  4. 程序名:        
  5. 硬件支持:        STM32F103C8   外部晶振8MHz RCC函數設置主頻72MHz   

  6. 修改日志:  
  7. 1-        
  8.         
  9.                                                         
  10. 說明:
  11. # 本模板加載了STM32F103內部的RCC時鐘設置,并加入了利用滴答定時器的延時函數。
  12. # 可根據自己的需要增加或刪減。

  13. *********************************************************************************************/
  14. #include "stm32f10x.h" //STM32頭文件
  15. #include "sys.h"
  16. #include "delay.h"
  17. //#include "led.h"
  18. //#include "TM1637.h"
  19. #include "PCF8574.h"


  20. u16 kmmp=0;
  21. u8 f[5];
  22. uc8 ShuZi[]="0123456789";
  23. int main (void){//主程序
  24.         RCC_Configuration(); //時鐘設置
  25.         I2C_Configuration();
  26.         while(1){
  27.                 PCF1602Init();
  28.                 StrinWrite(2,0,"TORT Test");
  29.                 while(1)
  30.                 {
  31.                                 delay_ms(100);
  32.                                 f[0]=ShuZi[kmmp%10000/1000];
  33.                                 f[1]=ShuZi[kmmp%1000/100];
  34.                                 f[2]=ShuZi[kmmp%100/10];
  35.                                 f[3]=ShuZi[kmmp%10];
  36.                                 StrinWrite(4,1,f);
  37.                                 kmmp++;
  38.                 }

  39.         }
  40. }
  41. /*
  42. void TIM3_IRQHandler(void){ //TIM3中斷處理函數
  43.     if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET){        //判斷是否是TIM3中斷
  44.         TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
  45.                                 
  46.                         HYM++;
  47.         }
  48. }
  49. */
  50. /*********************************************************************************************
  51. * 杜洋工作室
  52. * 洋桃電子
  53. *********************************************************************************************/
  54. /*

  55. 【變量定義】
  56. u32     a; //定義32位無符號變量a
  57. u16     a; //定義16位無符號變量a
  58. u8     a; //定義8位無符號變量a
  59. vu32     a; //定義易變的32位無符號變量a
  60. vu16     a; //定義易變的 16位無符號變量a
  61. vu8     a; //定義易變的 8位無符號變量a
  62. uc32     a; //定義只讀的32位無符號變量a
  63. uc16     a; //定義只讀 的16位無符號變量a
  64. uc8     a; //定義只讀 的8位無符號變量a

  65. #define ONE  1   //宏定義

  66. delay_us(1); //延時1微秒
  67. delay_ms(1); //延時1毫秒
  68. delay_s(1); //延時1秒
  69. */
復制代碼
  1. #include "PCF8574.h"
  2. #include "delay.h"

  3. void I2C_GPIO_Init(void)
  4. { //I2C接口初始化
  5.         GPIO_InitTypeDef  GPIO_InitStructure;        
  6.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);      
  7.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); //啟動I2C功能
  8.   GPIO_InitStructure.GPIO_Pin = SCL | SDA; //選擇端口號                     
  9.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //選擇IO接口工作方式      
  10.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //設置IO接口速度(2/10/50MHz)   
  11.         GPIO_Init(I2CPORT, &GPIO_InitStructure);
  12. }

  13. void I2C_Configuration(void){ //I2C初始化
  14.         I2C_InitTypeDef  I2C_InitStructure;
  15.         I2C_GPIO_Init(); //先設置GPIO接口的狀態
  16.         I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;//設置為I2C模式
  17.         I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  18.         I2C_InitStructure.I2C_OwnAddress1 = HostAddress; //主機地址(從機不得用此地址)
  19.         I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;//允許應答
  20.         I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; //7位地址模式
  21.         I2C_InitStructure.I2C_ClockSpeed = BusSpeed; //總線速度設置        
  22.         I2C_Init(I2C1,&I2C_InitStructure);
  23.         I2C_Cmd(I2C1,ENABLE);//開啟I2C                                       
  24. }



  25. void PCFSendAByte(u8 addr,u8 dat)
  26. {
  27.         I2C_GenerateSTART(I2C1,ENABLE); //發送開始信號
  28.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); //等待完成
  29.         I2C_Send7bitAddress(I2C1,addr,I2C_Direction_Transmitter);
  30.         //while(I2C_GetFlagStatus(I2C2,I2C_FLAG_AF));
  31.         while(SUCCESS != I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//EV6
  32. //        I2C_SendData(I2C1,addr); //發送從器件內部寄存器地址
  33.         //while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成       
  34.         I2C_SendData(I2C1,dat); //發送要寫入的內容
  35.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成       
  36.         I2C_GenerateSTOP(I2C1,ENABLE); //發送結束信號       
  37. }       

  38. /***************以下為1602****************/
  39. void WriteCom1602(u8 com)
  40. {
  41.         u8 tmp,mmp;
  42.         I2C_GenerateSTART(I2C1,ENABLE); //發送開始信號
  43.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); //等待完成
  44. //        I2C_SendData(I2C1,WriteADDR); //發送從器件內部寄存器地址               
  45. //        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成       
  46.         I2C_Send7bitAddress(I2C1,WriteADDR,I2C_Direction_Transmitter);
  47.         //while(I2C_GetFlagStatus(I2C2,I2C_FLAG_AF));
  48.         while(SUCCESS != I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//EV6
  49.        
  50.         tmp=com&0xf0;
  51.         I2C_SendData(I2C1,CSReset|COMSet);       //EN=0 RS.RW=0 無數據
  52.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成       
  53.         mmp=tmp|CSReset|COMSet;       
  54.         I2C_SendData(I2C1,mmp);
  55.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成       
  56.         mmp|=CSSet;                    //EN=1 RS.RW=0 有數據(高四位)
  57.         I2C_SendData(I2C1,mmp);
  58.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  59.         mmp&=(0xf0|COMSet);            
  60.         I2C_SendData(I2C1,mmp);         
  61.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  62.         tmp=com<<4;
  63.         I2C_SendData(I2C1,CSReset|COMSet);       //EN=0 RS.RW=0 無數據
  64.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成       
  65.         mmp=tmp|CSReset|COMSet;       
  66.         I2C_SendData(I2C1,mmp);
  67.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成       
  68.         mmp|=CSSet;                    //EN=1 RS.RW=0 有數據(高四位)
  69.         I2C_SendData(I2C1,mmp);
  70.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  71.         mmp&=(0xf0|COMSet);            
  72.         I2C_SendData(I2C1,mmp);         
  73.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  74.         I2C_GenerateSTOP(I2C1,ENABLE);//產生停止信號       
  75. }

  76. void WriteDat1602(u8 dat)
  77. {
  78.         u8 tmp,mmp;
  79.         I2C_GenerateSTART(I2C1,ENABLE); //發送開始信號
  80.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); //等待完成
  81.         //I2C_SendData(I2C1,WriteADDR); //發送從器件內部寄存器地址               
  82.         //while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成       
  83.                 I2C_Send7bitAddress(I2C1,WriteADDR,I2C_Direction_Transmitter);
  84.         //while(I2C_GetFlagStatus(I2C2,I2C_FLAG_AF));
  85.         while(SUCCESS != I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//EV6
  86.        

  87.         tmp=dat&0xf0;
  88.         I2C_SendData(I2C1,CSReset|DATSet);       //EN=0 RS.RW=0 無數據
  89.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成       
  90.         mmp=tmp|CSReset|DATSet;       
  91.         I2C_SendData(I2C1,mmp);
  92.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成       
  93.         mmp|=CSSet;                    //EN=1 RS.RW=0 有數據(高四位)
  94.         I2C_SendData(I2C1,mmp);
  95.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  96.         mmp&=(0xf0|DATSet);            
  97.         I2C_SendData(I2C1,mmp);         
  98.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  99.         tmp=dat<<4;
  100.         I2C_SendData(I2C1,CSReset|DATSet);       //EN=0 RS.RW=0 無數據
  101.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成       
  102.         mmp=tmp|CSReset|DATSet;       
  103.         I2C_SendData(I2C1,mmp);
  104.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成       
  105.         mmp|=CSSet;                    //EN=1 RS.RW=0 有數據(高四位)
  106.         I2C_SendData(I2C1,mmp);
  107.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  108.         mmp&=(0xf0|DATSet);            
  109.         I2C_SendData(I2C1,mmp);         
  110.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  111.         I2C_GenerateSTOP(I2C1,ENABLE);//產生停止信號       
  112. }

  113. void PCF1602Init()
  114. {
  115.         WriteCom1602(0x28);
  116.         delay_ms(15);
  117.         WriteCom1602(0x28);
  118.         delay_ms(15);
  119.         WriteCom1602(0x28);
  120.         delay_ms(15);
  121.         PCFSendAByte(WriteADDR,0x04);
  122.         delay_ms(15);
  123.         WriteCom1602(0x28);
  124.         WriteCom1602(0x0c);
  125.         WriteCom1602(0x01);
  126.         delay_ms(5);
  127. }

  128. void SetXY(u8 x,u8 y)
  129. {
  130.         u8 addr;
  131.         addr=0x80+0x40*y+x;
  132.         WriteCom1602(addr);
  133. }

  134. void StrinWrite(u8 x,u8 y,u8 *string)
  135. {
  136.         SetXY(x,y);
  137.         while(*string)
  138.         {
  139.                 WriteDat1602(*string++);
  140.         }
  141. }
復制代碼


所有程序51hei提供下載:
PCF8574.7z (191.02 KB, 下載次數: 172)


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

使用道具 舉報

沙發
ID:588301 發表于 2021-4-28 15:45 | 只看該作者
PCF8574文件呢
回復

使用道具 舉報

板凳
ID:328014 發表于 2021-4-28 21:16 | 只看該作者

Basic\delay 這個目錄里面
回復

使用道具 舉報

地板
ID:81196 發表于 2021-4-30 14:32 | 只看該作者
這個一直沒使用過,聽說是會出問題,你多測試測試再往成熟產品上用
回復

使用道具 舉報

5#
ID:966725 發表于 2021-9-17 12:32 | 只看該作者
贊一個,好文,寫的很詳細
回復

使用道具 舉報

6#
ID:881674 發表于 2021-10-24 14:46 | 只看該作者
贊一個,好文,寫的很詳細
回復

使用道具 舉報

7#
ID:169559 發表于 2021-10-27 13:31 | 只看該作者
ST我是用的是模擬I2C,硬件也調通了,但是一直沒敢正式用。
回復

使用道具 舉報

8#
ID:297735 發表于 2022-7-20 23:05 | 只看該作者
sfd123 發表于 2021-10-27 13:31
ST我是用的是模擬I2C,硬件也調通了,但是一直沒敢正式用。

可以發下您軟件IIC的源程序嘛   謝謝您了
回復

使用道具 舉報

9#
ID:461428 發表于 2022-12-8 19:15 | 只看該作者
除了51單片機的IIC程序我調通了,32的無論模擬還是硬件自帶的IIC我都沒調通,斷斷續續整了10幾天,無奈,放棄了
回復

使用道具 舉報

10#
ID:1110016 發表于 2024-1-24 23:39 | 只看該作者
請教一下,從機地址是哪一行?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天天操操操 | 成人精品在线观看 | 美国一级片在线观看 | 中文字幕在线观看国产 | 日本亚洲欧美 | 欧美成人a | 国产成人精品久久二区二区91 | 亚洲高清久久 | 国产精品区一区二区三区 | 国产一区二区三区在线免费观看 | 久久精品中文字幕 | 国产精品毛片在线 | 亚洲综合国产 | 亚洲在线 | 欧美久久一区二区三区 | 欧美日韩国产一区二区三区 | 日韩中文一区二区 | 国产精品久久久久久久久久久免费看 | 黄色在线免费网站 | 国产一区二区三区在线视频 | 日日骚网 | 天天干,夜夜操 | 久久久激情视频 | 亚洲精品久久久久久久久久久久久 | 亚洲国产成人av好男人在线观看 | 亚洲精品日韩精品 | 精品久久久久香蕉网 | 综合网视频 | av毛片| 国产精品精品视频一区二区三区 | 成人免费网站在线 | 免费色网址 | 欧美激情精品久久久久 | 欧美精品福利视频 | 久久黄色精品视频 | 琪琪午夜伦伦电影福利片 | 涩在线| 欧美色综合网 | 久久精品亚洲欧美日韩久久 | 国产一区二区三区在线 | 一级片在线视频 |