新闻中心

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 下一页

评论


技术专区

关闭