找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3519|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

MSP430單片機(jī)+BS8112A-3程序源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:623606 發(fā)表于 2019-10-14 08:22 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
采用仿II2C通訊,該芯片II2C通訊略有區(qū)別,已調(diào)試通過,僅供參考

單片機(jī)源程序如下:
  1. //==============================================================================         
  2. //本程序只供學(xué)習(xí)使用,未經(jīng)作者許可,不得用于其它任何用途
  3. //  文 件 名   : keyboard.c
  4. //  版 本 號(hào)   :  
  5. //  作    者   :  
  6. //  生成日期   :
  7. //  最近修改   :
  8. //  功能描述   : FPC觸摸按鍵  IIC 接口例程(MSP430F149系列)
  9. //  驅(qū)動(dòng)IC     : BS8112A-3
  10. //              說明: 硬件說明
  11. //              ----------------------------------------------------------------
  12. //              GND     電源地
  13. //              VCC     接3.3v電源
  14. //              SCL     IIC時(shí)鐘信號(hào)線
  15. //              SDA     IIC數(shù)據(jù)線
  16. //              IRQ     中斷請(qǐng)求
  17. //              ----------------------------------------------------------------
  18. //             說明:軟件說明-IIC時(shí)序
  19. //             -------------------------------------------------------------------
  20. //             1,該芯片IIC驅(qū)動(dòng)時(shí)序有點(diǎn)特殊,該芯片是不回ACK的,需要主設(shè)備發(fā)出,實(shí)際主設(shè)備發(fā)9位,見使用手冊(cè)7位地址+1位讀寫位+1位ACK
  21. //             2, 主機(jī)發(fā)完后,需要等待從設(shè)備處理完成,根據(jù)實(shí)際需求在發(fā)送ACK時(shí)增加幾個(gè)延時(shí)也可以,本代碼沒加,從波形看也沒問題
  22. //            ------------------------------------------------------------------
  23. // 修改歷史   :
  24. // 日    期   :
  25. // 修改內(nèi)容   : 創(chuàng)建文件
  26. //==================================================================================
  27. #include <msp430F249.h>
  28. #include "Keyboard.h"
  29. #include "timer.h"

  30. #define  Key_BS8112_IIC
  31. #define  BS8112_DELAY    {delay_us(10);}
  32. //==============================================================
  33. //        Function Name: void BS8112_IO_Init(void)
  34. //        Parameters:    none
  35. //        Return value:  none
  36. //        Description:     this function is used to generate IIC start signal
  37. //        Tips:IIC數(shù)據(jù)有效性,在時(shí)鐘高電平周期內(nèi),數(shù)據(jù)必須保持穩(wěn)定
  38. //       GND     電源地
  39. //       VCC     接3.3v電源
  40. //       SCL     P16(時(shí)鐘)
  41. //       SDA     P15(數(shù)據(jù))  
  42. //       IRQ     P17  中斷請(qǐng)求
  43. //============================================================
  44. void BS8112_IO_Init(void)
  45. {
  46.         P1DIR  |=   BS8112_SCL+BS8112_SDA;     //1輸出,0輸入
  47.         P1OUT  &=  ~(BS8112_SCL+BS8112_SDA);   //初始化為輸出值為0

  48.         P1DIR &=~BS8112_IRQ;                     //0輸入
  49. }
  50. //==============================================================
  51. //        Function Name: void I2CStart(void)
  52. //        Parameters:    none
  53. //        Return value:  none
  54. //        Description:     this function is used to generate IIC start signal
  55. //        Tips:IIC數(shù)據(jù)有效性,在時(shí)鐘高電平周期內(nèi),數(shù)據(jù)必須保持穩(wěn)定
  56. //    數(shù)據(jù)線信號(hào)僅在時(shí)鐘電平為低時(shí)改變
  57. //        iic的起始:在SCL為高時(shí),SDA由高變低,為起始條件
  58. //    時(shí)序 CLK      0   delay    1    delay     0    為一個(gè)周期,在高電平時(shí)數(shù)據(jù)有效必須穩(wěn)定,只能在低電平時(shí)可以改變數(shù)據(jù)值
  59. //============================================================
  60. void BS8112_I2CStart(void)
  61. {
  62.     BS8112_I2C_SDA_OUT();
  63.         BS8112_I2C_SDA_HIGH;   // SDA=1
  64.           BS8112_I2C_SCL_HIGH;           // SCL=1  
  65.           BS8112_DELAY;          //delay
  66.           BS8112_I2C_SDA_LOW;    //SDA= 0
  67.           BS8112_DELAY;          //delay
  68.           BS8112_I2C_SCL_LOW;            // SCL=0
  69.           BS8112_DELAY;          //delay
  70. }
  71. //==============================================================
  72. //        Function Name: void I2CStop(void)
  73. //        Parameters:    none
  74. //        Return value:  none
  75. //        Description:     this function is used to generate IIC stop signal
  76. //        Tips:SCL為高時(shí),SDA由低變高跳變,為終止條件
  77. //    時(shí)序 CLK      0   delay    1    delay     0    為一個(gè)周期,在高電平時(shí)數(shù)據(jù)有效必須穩(wěn)定,只能在低電平時(shí)可以改變數(shù)據(jù)值
  78. //============================================================

  79. void BS8112_I2CStop(void)
  80. {
  81.         BS8112_I2C_SDA_LOW;   // SDA=0
  82.           BS8112_I2C_SCL_HIGH;              // SCL=1
  83.           BS8112_DELAY;//delay
  84.           BS8112_I2C_SDA_HIGH;  // SDA=1
  85.           BS8112_DELAY;//delay
  86. }
  87. //==============================================================
  88. //        Function Name: void BS8112_I2CAck(void)
  89. //        Parameters:    none
  90. //        Return value:  none
  91. //        Description:     this function is used to generate IIC ACK signal
  92. //        Tips:不管主機(jī)還是從機(jī),接收到數(shù)據(jù)后(數(shù)據(jù)或地址),都有回應(yīng)一個(gè)ACK 信號(hào)
  93. //    成功接收回應(yīng)0
  94. //    時(shí)序 CLK      0   delay    1    delay     0    為一個(gè)周期,在高電平時(shí)數(shù)據(jù)有效必須穩(wěn)定,只能在低電平時(shí)可以改變數(shù)據(jù)值
  95. //============================================================

  96. void BS8112_I2CAck(void)
  97. {
  98.           BS8112_I2C_SCL_LOW;         // SCL=0
  99.           BS8112_I2C_SDA_LOW;                    // SDA=0  
  100.           BS8112_DELAY;                //delay
  101.           BS8112_I2C_SCL_HIGH;        // SCL=1
  102.           BS8112_DELAY;                //delay
  103.           BS8112_I2C_SCL_LOW;         // SCL=0
  104. }
  105. //==============================================================
  106. //        Function Name: void BS8112_IIC_NAck(void)
  107. //        Parameters:    none
  108. //        Return value:  none
  109. //        Description:     this function is used to generate IIC ACK signal
  110. //        Tips:不管主機(jī)還是從機(jī),接收到數(shù)據(jù)后(數(shù)據(jù)或地址),都有回應(yīng)一個(gè)ACK 信號(hào)
  111. //    接收不成功回應(yīng)1
  112. //    時(shí)序 CLK      0   delay    1    delay     0    為一個(gè)周期,在高電平時(shí)數(shù)據(jù)有效必須穩(wěn)定,只能在低電平時(shí)可以改變數(shù)據(jù)值
  113. //============================================================

  114. void BS8112_I2CNoAck(void)
  115. {
  116.           BS8112_I2C_SCL_LOW;          // SCL=0,   此句可以不要,因?yàn)楸旧砭褪?,寫上是為了更明確IIC通訊
  117.         BS8112_I2C_SDA_HIGH;                    // SDA=1
  118.           BS8112_DELAY;                 //delay
  119.           BS8112_I2C_SCL_HIGH;         // SCL=1
  120.           BS8112_DELAY;                 //delay
  121.           BS8112_I2C_SCL_LOW;          // SCL=0
  122. }
  123. //==============================================================
  124. //        Function Name:unsigned char BS8112_I2CRcvAck(void)
  125. //        Parameters:    none
  126. //        Return value:  none
  127. //        Description:     this function is used to wait ACK signal
  128. //        Tips: 1: indicate receive  failure  if the ACK signal is 1
  129. //            0: indicate receive  success  if the ACK signal is 0
  130. //    時(shí)序 CLK      0   delay    1    delay     0    為一個(gè)周期,在高電平時(shí)數(shù)據(jù)有效必須穩(wěn)定,只能在低電平時(shí)可以改變數(shù)據(jù)值
  131. //============================================================
  132. unsigned char BS8112_I2CRcvAck(void)
  133. {
  134.         unsigned int delay=0;
  135.         BS8112_I2C_SDA_IN();     
  136.         BS8112_I2C_SCL_LOW;          //SCL=0
  137.         BS8112_I2C_SDA_HIGH;                    //SDA
  138.         BS8112_DELAY;             //delay
  139.           BS8112_I2C_SCL_HIGH;     //SCL=1
  140.           BS8112_DELAY;             //delay
  141.           while(BS8112_I2C_SDA_GET())
  142.           {
  143.                   delay++;
  144.                 if(delay>500)
  145.                 {
  146.                         BS8112_I2C_SDA_OUT();
  147.                         BS8112_I2CStop();
  148.                        
  149.                         return 1;
  150.                 }
  151.           }
  152.           BS8112_I2C_SCL_LOW;      //SCL=0
  153.           BS8112_I2C_SDA_OUT();
  154.           return 0;
  155. }
  156. //==============================================================
  157. //        Function Name: void BS8112_IIC_Send_Byte(u8 txd)
  158. //        Parameters:    none
  159. //        Return value:  none
  160. //        Description:     this function is used to send a byte
  161. //        Tips:
  162. //    時(shí)序 CLK      0   delay    1    delay     0    為一個(gè)周期,在高電平時(shí)數(shù)據(jù)有效必須穩(wěn)定,只能在低電平時(shí)可以改變數(shù)據(jù)值
  163. //============================================================
  164. void BS8112_I2CSendByte(unsigned char data)
  165. {
  166.   unsigned char i;
  167.   for(i=0; i<8; i++)
  168.   {
  169.           BS8112_I2C_SCL_LOW;      //SCL=0
  170.     if(data&0x80)  
  171.         {
  172.                 BS8112_I2C_SDA_HIGH;         //SDA
  173.     }
  174.     else
  175.         {
  176.                 BS8112_I2C_SDA_LOW;          //SDA
  177.     }

  178.     BS8112_DELAY;             //delay
  179.         BS8112_I2C_SCL_HIGH;     //SCL=1
  180.     BS8112_DELAY;                         //delay
  181.     data <<= 1;
  182.   }
  183. }
  184. //==============================================================
  185. //        Function Name:unsigned char BS8112_I2CReceiveByte(void)
  186. //        Parameters:     
  187. //        Return value:  none
  188. //        Description:     this function is used to receive a byte
  189. //        Tips:
  190. //    時(shí)序 CLK      0   delay    1    delay     0    為一個(gè)周期,在高電平時(shí)數(shù)據(jù)有效必須穩(wěn)定,只能在低電平時(shí)可以改變數(shù)據(jù)值
  191. //============================================================
  192. unsigned char BS8112_I2CReceiveByte(void)
  193. {
  194.           unsigned char re_data;
  195.           int i;
  196.           re_data = 0;       
  197.           BS8112_I2C_SDA_IN();                                   //設(shè)置輸入
  198.           BS8112_DELAY;             //delay
  199.           for(i=0; i<8; i++)
  200.           {
  201.                     re_data <<= 1;
  202.                         BS8112_I2C_SCL_LOW;       //SCL=0   
  203.                     BS8112_DELAY;              //delay
  204.                         BS8112_I2C_SCL_HIGH;      //SCL=1   
  205.                     BS8112_DELAY;              //delay
  206.                     if(BS8112_I2C_SDA_GET())
  207.                 re_data |= 0x01;
  208.    
  209.   }
  210.   BS8112_I2C_SCL_LOW;
  211.   BS8112_I2C_SDA_OUT(); //接收完置成輸出
  212.   return re_data;
  213. }
  214. #define BS8112_DRIVERS
  215. //==============================================================
  216. //        Function Name:void BS8112_I2CReceiveByte(unsigned char temp)
  217. //        Parameters:    none
  218. //        Return value:  none
  219. //        Description:     this function is used to receive a byte
  220. //        Tips:
  221. //============================================================

  222. unsigned char  BS8112_GetSlaveState(void)
  223. {
  224.           unsigned int  delay=0;
  225.           BS8112_I2C_SCL_IN();                                //設(shè)置時(shí)鐘信號(hào)線輸入
  226.           while(!BS8112_I2C_SCL_GET())                  //等待時(shí)鐘信號(hào)被從設(shè)備拉高,繼續(xù)發(fā)送數(shù)據(jù)
  227.           {
  228.                     delay++;
  229.                   if(delay>5000)
  230.                   {
  231.                           BS8112_I2CStop();
  232.                           BS8112_I2C_SCL_OUT();
  233.                           return 0;//忙
  234.                   }
  235.           }
  236.           BS8112_I2C_SCL_OUT();
  237.           return 1;//空閑
  238. }
  239. //==============================================================
  240. //        Function Name:unsigned char BS8112_ReadData(unsigned char addr)
  241. //        Parameters:    addr:要讀取的狀態(tài)寄存器或控制寄存器的地址
  242. //                 0x08: 讀取狀態(tài)寄存器0的數(shù)據(jù),包含按鍵1-按鍵8的按鍵的狀態(tài)
  243. //                 0x09: 讀取狀態(tài)寄存器1的數(shù)據(jù),包含按鍵9-按鍵16的按鍵的狀態(tài)
  244. //                 0xB0:
  245. //                 0XB1:
  246. //                 ....
  247. //                 0XC0:
  248. //        Return value:  none
  249. //        Description:     this function is used to get the sate of the REG
  250. //        Tips:
  251. //     1,該函數(shù)讀取觸摸按鍵的狀態(tài)數(shù)據(jù)寄存器, 0 表示沒有觸摸,1表示有觸摸
  252. //     2,地址,根據(jù)數(shù)據(jù)手冊(cè),給的7位的地址0XA0,實(shí)際應(yīng)該是高7位,故要左移一位
  253. //============================================================

  254. unsigned char BS8112_ReadData(unsigned char addr)
  255. {
  256.         unsigned char value=0;
  257.         BS8112_I2CStart();             //IIC啟動(dòng)
  258.         BS8112_I2CSendByte(0xA0);      //地址+寫
  259.         BS8112_I2CAck();               //發(fā)送第9位ACK位,同時(shí)增加幾個(gè)延時(shí),等待從設(shè)備處理數(shù)據(jù)

  260.         BS8112_I2CSendByte(addr);       //發(fā)送寄存器地址
  261.         BS8112_I2CAck();               //發(fā)送第9位ACK位,同時(shí)增加幾個(gè)延時(shí),等待從設(shè)備處理數(shù)據(jù)

  262.         BS8112_I2CStart();             //IIC啟動(dòng)
  263.         BS8112_I2CSendByte(0xA1);      //地址+讀
  264.         BS8112_I2CAck();               //發(fā)送第9位ACK位,同時(shí)增加幾個(gè)延時(shí),等待從設(shè)備處理數(shù)據(jù)

  265.         value=BS8112_I2CReceiveByte();
  266.         BS8112_I2CNoAck();               //發(fā)送第9位ACK位,同時(shí)增加幾個(gè)延時(shí),等待從設(shè)備處理數(shù)據(jù)
  267.         BS8112_I2CStop();
  268.         return value;
  269. }

  270. #define BS8112_APP
  271. //==============================================================
  272. //        Function Name:unsigned char BS8112_Init(void)
  273. //        Parameters:    none
  274. //        Return value:  none
  275. //        Description:     this function is used to inite the BS8112
  276. //        Tips:
  277. //  初始化相關(guān)寄存器,共17個(gè)寄存器
  278. //  寫寄存器通訊結(jié)構(gòu)如下:
  279. //  start +  slave address +0xB0 + DATA1 +DATA2 + ......+DATA17 +CheckSum
  280. //============================================================

  281. unsigned char BS8112_Init(void)
  282. {
  283.         unsigned char  data[18]={0x00,0x00,0x83,0xF3,0x98,
  284.                     //K1,  K2,   K3,     K4,   K5,        
  285.                     LOFS,LOFS-2,LOFS-4,LOFS-2,LOFS,
  286.                     //K6,  K7,   K8,     K9,   K10, K11, K12,    校驗(yàn)和
  287.                     LOFS,LOFS-2,LOFS-4,LOFS-2,LOFS,  63,LOFS|0x40,0x00};
  288.         unsigned char i;
  289.         unsigned int sum=0;
  290.         BS8112_IO_Init();
  291.         BS8112_I2CStart();           //IIC啟動(dòng)
  292.         BS8112_I2CSendByte(0xA0);    //地址+寫
  293.         BS8112_I2CAck();             //發(fā)送第9位ACK位,同時(shí)增加幾個(gè)延時(shí),等待從設(shè)備處理數(shù)據(jù)
  294.        
  295.         BS8112_I2CSendByte(0xB0);    //發(fā)送寄存器地址
  296.         BS8112_I2CAck();             //發(fā)送第9位ACK位,同時(shí)增加幾個(gè)延時(shí),等待從設(shè)備處理數(shù)據(jù)
  297.         for(i=0;i<17;i++)
  298.         {
  299.                 sum+=data[i];
  300.                 BS8112_I2CSendByte(data[i]); //發(fā)送數(shù)8位數(shù)據(jù)
  301.                 BS8112_I2CAck();             //發(fā)送第9位ACK位,同時(shí)增加幾個(gè)延時(shí),等待從設(shè)備處理數(shù)據(jù)
  302.         }
  303.         BS8112_I2CSendByte((unsigned char)sum); //發(fā)送校驗(yàn)和
  304.         BS8112_I2CAck();                 //發(fā)送第9位ACK位,同時(shí)增加幾個(gè)延時(shí),等待從設(shè)備處理數(shù)據(jù)
  305.         BS8112_I2CStop();
  306.        
  307.         return 1;

  308. }

  309. //==============================================================
  310. //        Function Name:unsigned char BS8112_GetKeyStateReg(unsigned char dat)
  311. //        Parameters:    dat:要讀取的狀態(tài)數(shù)據(jù)的寄存器地址
  312. //               
  313. //        Return value:  none
  314. //        Description:     this function is used to get the sate of the REG
  315. //        Tips:
  316. //     1,該函數(shù)讀取觸摸按鍵的狀態(tài)數(shù)據(jù)寄存器, 0 表示沒有觸摸,1表示有觸摸
  317. //     0x08: 讀取狀態(tài)寄存器0的數(shù)據(jù),包含按鍵1-按鍵8的按鍵的狀態(tài)
  318. //           0x09: 讀取狀態(tài)寄存器1的數(shù)據(jù),包含按鍵9-按鍵16的按鍵的狀態(tài)
  319. //============================================================

  320. unsigned int BS8112_GetKeyValue(void)
  321. {
  322.         unsigned int KeyStatus=0;
  323.         unsigned int Key_Val_H=0;
  324.         unsigned int Key_Val_L=0;

  325.         Key_Val_L = BS8112_ReadData(0x08);  //按鍵1-8的狀態(tài)信息
  326.         BS8112_DELAY;
  327.                 BS8112_DELAY;
  328.     Key_Val_H = BS8112_ReadData(0x09);  //按鍵9-16的狀態(tài)信息
  329.     KeyStatus = (Key_Val_H<<8) | Key_Val_L;
  330.     return KeyStatus;

  331. }
  332. //==============================================================
  333. //        Function Name:unsigned char BS8112_DetectKey(void)
  334. //        Parameters:     
  335. //        Return value:  none
  336. //        Description:     this function is used to get the sate of the REG
  337. //        Tips:
  338. //    檢測(cè)是否有按鍵按下,正常情況下該腳是NMOS上拉輸出高,當(dāng)有按鍵時(shí)輸出低電平
  339. //============================================================

  340. unsigned char BS8112_DetectKey(void)
  341. {
  342.         if(!BS8112_DETEC_OUT())//當(dāng)被拉低時(shí),有按鍵
  343.         {
  344.                 return 1;    //表示檢測(cè)到按鍵
  345.         }
  346.         return 0;       //表示沒有檢測(cè)到按鍵
  347. }
  348. //========================================================================================
復(fù)制代碼

所有資料51hei提供下載:
bs8112a-3.zip (4.06 KB, 下載次數(shù): 71)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表