微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 矩阵键盘控制forMSP430

矩阵键盘控制forMSP430

时间:11-27 来源:互联网 点击:
  1. /*****************************************************************
  2. //文件名:Keypad.c
  3. //描述:该文件定义与矩阵键盘有关的各种接口、函数,适用于MSP430F149
  4. //编写人:小邪@清水
  5. //版本号:1.01
  6. *****************************************************************/
  7. #include
  8. #include"12864.h"
  9. ucharkeyPressed;//按键是否被按下:1--是,0--否
  10. ucharkeyval;//存放键值
  11. ucharkeyFlag;//按键是否已放开:1--是,0--否
  12. //设置键盘逻辑键值与程序计算键值的映射
  13. //12313(enter)
  14. //45614(up)
  15. //78915(down)
  16. //11(.)012(back)16(clear)
  17. ucharkey_Map[]={1,2,3,13,4,5,6,14,7,8,9,15,11,0,12,16};
  18. /*************************************************************************
  19. //名称:InitKeypad
  20. //参数:延时的时间n
  21. //返回值:无
  22. //功能:初始化矩阵键盘的IO口
  23. *************************************************************************/
  24. voidInitKeypad(void)
  25. {
  26. P1DIR=0xf0;//P1.0~P1.3设置为输入状态,P1.4~P1.7设置为输出状态
  27. P1OUT|=0xf0;//P1.4~P1.7输出高电平
  28. keyFlag=0;
  29. keyPressed=0;
  30. keyval=0;
  31. }
  32. /*************************************************************************
  33. //名称:CheckKey
  34. //参数:无
  35. //返回值:无
  36. //功能:扫描矩阵键盘,获取键值
  37. *************************************************************************/
  38. voidCheckKey(void)
  39. {
  40. ucharrow,col,tmp1,tmp2;
  41. tmp1=0x80;
  42. for(row=0;row<4;row++)//行扫描
  43. {
  44. P1OUT=0xf0;//P1.4~P1.7输出全1
  45. P1OUT-=tmp1;//P1.4~p1.7输出四位中有一个为0
  46. tmp1>>=1;
  47. if((P1IN&0x0f)<0x0f)//是否P1IN的P1.0~P1.3中有一位为0
  48. {
  49. tmp2=0x01;//tmp2用于检测出那一位为0
  50. for(col=0;col<4;col++)//列检测
  51. {
  52. if((P1IN&tmp2)==0x00)//是否是该列,等于0为是
  53. {
  54. keyval=key_Map[row*4+col];//获取键值
  55. return;//退出循环
  56. }
  57. tmp2<=1;//tmp2右移1位
  58. }
  59. }
  60. }
  61. }
  62. /*************************************************************************
  63. //名称:delay
  64. //参数:无
  65. //返回值:无
  66. //功能:延时15ms的时间,用于消抖
  67. *************************************************************************/
  68. voiddelay()
  69. {
  70. uinttmp;
  71. for(tmp=12000;tmp>0;tmp--);
  72. }
  73. /*************************************************************************
  74. //名称:KeyEvent
  75. //参数:无
  76. //返回值:无
  77. //功能:检测按键,获取键值
  78. *************************************************************************/
  79. voidKeyEvent(void)
  80. {
  81. uchartmp;
  82. P1OUT&=0x00;//设置P1OUT全为0,等待按键输入
  83. tmp=P1IN;//获取p1IN
  84. if((keyPressed==0x00)&&((tmp&0x0f)<0x0f))//如果有键按下
  85. {
  86. keyPressed=1;//如果有按键按下,设置keyPressed标识
  87. delay();//消除抖动
  88. CheckKey();//调用checkKey(),获取键值
  89. }
  90. elseif((keyPressed==1)&&((tmp&0x0f)==0x0f))//如果按键已经释放
  91. {
  92. keyPressed=0;//清除keyPressed标识
  93. keyFlag=1;//设置keyFlag标识
  94. }
  95. else
  96. {
  97. keyval=17;
  98. }
  99. }
  100. /*************************************************************************
  101. //名称:KeyScan
  102. //参数:储存矩阵键盘结果的数组的指针
  103. //返回值:无
  104. //功能:将矩阵键盘扫描到的数据存储到数组中
  105. *************************************************************************/
  106. voidKeyScan(uchar*keyscan)
  107. {
  108. uchari,n,flag;
  109. i=0;
  110. flag=0;
  111. for(;;)
  112. {
  113. KeyEvent();
  114. if(keyFlag==1)keyFlag=0;
  115. if(keyval>=0&&keyval<=9)keyscan[i]=keyval+0;//按下数字键
  116. if(keyval==11)keyscan[i]=.;//按下小数点
  117. if(keyval==12)//按下退格键
  118. {
  119. keyscan[i-1]=;//清除前一位
  120. i=i-2;//数组指针前移两位
  121. flag=1;//小数点标志位置1
  122. }
  123. if(keyval==13)//按下确定键
  124. {
  125. keyscan[i]=;
  126. break;
  127. }
  128. if(keyval==16)
  129. {
  130. for(n=0;n
  131. WriteStr(0x90,keyscan,(i+1)/2);
  132. i=-1;
  133. }
  134. if(keyval==17)i--;//无键按下
  135. keyval=17;
  136. i++;
  137. //在这里写入显示keyscan数组的语句,长度为i
  138. WriteStr(0x90,keyscan,(i+1)/2);
  139. if(flag==1)//有小数点键按下
  140. {
  141. //在这里写入在显示末尾写入空格的语句
  142. Send(1,);
  143. flag=0;
  144. }
  145. }
  146. }
  147. /*************************************************************************
  148. //名称:Str2Float
  149. //参数:储存浮点数据result,储存键盘结果的数组指针
  150. //返回值:result
  151. //功能:将矩阵键盘扫描到的数据转化为浮点数
  152. *************************************************************************/
  153. floatStr2Float(uchar*keyscan)
  154. {
  155. floatresult;
  156. uchari;
  157. uintdot;
  158. i=0;
  159. dot=0;
  160. for(i=0;;i++)
  161. {
  162. if(keyscan[i]==.)
  163. {
  164. if(keyscan[i+2]==)keyscan[i+2]=0;
  165. if(i==1)result=(keyscan[0]-0)+(keyscan[2]-0)*0.1+(keyscan[3]-0)*0.01;
  166. if(i==2)result=(keyscan[0]-0)*10+(key

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top