新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ZLG7290矩陣鍵盤控制forMSP40

        ZLG7290矩陣鍵盤控制forMSP40

        作者: 時間:2016-11-27 來源:網絡 收藏
        基于ZLG7290的矩陣鍵盤控制,適用于MSP430,采用中斷模式查詢按鍵。ZLG7290還具有數碼管顯示功能,本人水平有限,這里未能實現。
        [cpp]view plaincopyprint?
        1. /*****************************************************************
        2. //文件名:ZLG7290.c
        3. //描述:該文件定義與ZLG7290有關的各種接口、函數,適用于MSP430F149
        4. //編寫人:小邪@清水
        5. //版本號:1.01
        6. *****************************************************************/
        7. #include"msp430x14x.h"
        8. #include"ZLG7290.h"
        9. /*****************************************************************
        10. //關于接口的一些定義
        11. //需要根據實際應用做出改變
        12. *****************************************************************/
        13. #defineIIC_Enable!(P2IN&BIT2)
        14. #defineSCL_UPPORTDIR&=~SCL
        15. #defineSDA_UPPORTDIR&=~SDA
        16. #defineSCL_DOWNPORTDIR|=SCL
        17. #defineSDA_DOWNPORTDIR|=SDA
        18. #definePORTDIRP3DIR//設置為P3口
        19. #definePORTINP3IN
        20. #definePORTOUTP3OUT
        21. #defineSDABIT0//設置SDA為Px.0
        22. #defineSCLBIT1//設置SCL為Px.1
        23. #defineRESBIT2//設置RES為P2.7(對應430的中斷)
        24. #defineCHIP0x70//ZLG7290的IIC地址
        25. /*************************************************************************
        26. //名稱:IIC_delay()
        27. //參數:無
        28. //返回值:無
        29. //功能:完成IIC設置中所需要的延時
        30. *************************************************************************/
        31. voidIIC_delay()
        32. {
        33. inti;
        34. i=0xff;
        35. while(i)
        36. {
        37. i--;
        38. _NOP();
        39. }
        40. i=0xff;
        41. while(i)
        42. {
        43. i--;
        44. _NOP();
        45. }
        46. }
        47. /*************************************************************************
        48. //名稱:SendToBus()
        49. //參數:要發送的數據
        50. //返回值:無
        51. //功能:向線上發送數據(SCL必須在進入函數前置為低)
        52. *************************************************************************/
        53. voidSendToBus(BYTEm)
        54. {
        55. BYTEi;
        56. for(i=0;i<8;i++)
        57. {
        58. if(m&0x80)
        59. SDA_UP;
        60. else
        61. SDA_DOWN;
        62. SCL_UP;
        63. IIC_delay();
        64. SCL_DOWN;
        65. m<<=1;
        66. }
        67. return;
        68. }
        69. /*************************************************************************
        70. //名稱:BackAns()
        71. //參數:無
        72. //返回值:成功標志,若成功則為1,否則為0
        73. //功能:接收應答信號
        74. *************************************************************************/
        75. BYTEBackAns()
        76. {
        77. BYTEflag;
        78. SDA_UP;
        79. IIC_delay();
        80. SCL_UP;
        81. flag=0;
        82. IIC_delay();
        83. if((PORTIN&SDA))
        84. {
        85. flag=1;
        86. }
        87. SCL_DOWN;
        88. returnflag;
        89. }
        90. /*************************************************************************
        91. //名稱:Start()
        92. //參數:無
        93. //返回值:無
        94. //功能:發送一個起始信號
        95. *************************************************************************/
        96. voidStart()
        97. {
        98. PORTOUT&=(~SCL)&(~SDA);
        99. SCL_UP;
        100. IIC_delay();
        101. SDA_UP;
        102. IIC_delay();
        103. SDA_DOWN;//開始位
        104. IIC_delay();
        105. SCL_DOWN;
        106. IIC_delay();
        107. }
        108. /*************************************************************************
        109. //名稱:Stop()
        110. //參數:無
        111. //返回值:無
        112. //功能:發送一個停止信號
        113. *************************************************************************/
        114. voidStop()
        115. {
        116. SDA_DOWN;
        117. IIC_delay();
        118. SCL_UP;//停止位
        119. IIC_delay();
        120. SDA_UP;
        121. IIC_delay();
        122. SCL_DOWN;
        123. IIC_delay();
        124. }
        125. /*************************************************************************
        126. //名稱:Write_IIC_Byte()
        127. //參數:data-待寫入的數據,startaddr-待寫入的首地址
        128. //返回值:無
        129. //功能:向線上寫一個字節
        130. *************************************************************************/
        131. voidWrite_IIC_Byte(BYTEdata,BYTEstartaddr)
        132. {
        133. do
        134. {
        135. Start();
        136. SendToBus(CHIP);//選片地址
        137. if(BackAns())//從機的回答信息
        138. continue;
        139. SendToBus(startaddr);//選擇芯片上的內在地址
        140. if(BackAns())
        141. continue;
        142. SendToBus(data);//傳輸數據
        143. if(!BackAns())
        144. break;
        145. }
        146. while(1);
        147. Stop();
        148. }
        149. /*************************************************************************
        150. //名稱:ReadFromBus()
        151. //參數:無
        152. //返回值:讀出的數據
        153. //功能:從線上讀出數據
        154. *************************************************************************/
        155. BYTEReadFromBus()
        156. {
        157. inti,temp;
        158. temp=0;
        159. SDA_UP;//讀取數據之前要把SDA拉高
        160. IIC_delay();
        161. for(i=0;i<8;i++)
        162. {
        163. SCL_UP;
        164. IIC_delay();
        165. temp<<=1;
        166. if(PORTIN&SDA)
        167. temp|=0x01;
        168. else
        169. temp&=0xfe;
        170. SCL_DOWN;
        171. IIC_delay();
        172. }
        173. returntemp;
        174. }

        175. 上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 大悟县| 凤凰县| 彰武县| 朝阳区| 孟津县| 揭东县| 屏南县| 洛南县| 资溪县| 辛集市| 牟定县| 井冈山市| 稷山县| 都安| 伽师县| 仙游县| 洛扎县| 佛教| 北票市| 武宁县| 慈利县| 贞丰县| 陇南市| 灵丘县| 公主岭市| 霞浦县| 杭锦旗| 大埔区| 揭西县| 蕲春县| 阳城县| 庄浪县| 仲巴县| 菏泽市| 新沂市| 陆河县| 江阴市| 茂名市| 晋城| 锡林浩特市| 金川县|