key01.c
上传用户:xs588588
上传日期:2021-03-30
资源大小:242k
文件大小:3k
源码类别:

DSP编程

开发平台:

C/C++

  1. #include <msp430x14x.h>
  2. void Delay(void);
  3. int KeyScan(void);
  4. int KeyProcess(void);
  5. void Init_Port(void)
  6. {
  7.     //将P1口所有的管脚在初始化的时候设置为输入方式
  8.     P1DIR = 0;
  9.  
  10.     //将P1口所有的管脚设置为一般I/O口
  11.     P1SEL = 0;
  12.     
  13.     // 将P1.4 P1.5 P1.6 P1.7设置为输出方向
  14.     P1DIR |= BIT4;
  15.     P1DIR |= BIT5;
  16. P1DIR |= BIT6;
  17.     P1DIR |= BIT7;
  18. //先输出低电平
  19. P1OUT = 0x00;
  20.     return;
  21. }
  22. int KeyScan(void)
  23. {
  24. int nP10,nP11,nP12,nP13;
  25. int nRes = 0;
  26. for(;;)
  27. {
  28. //读取各个管脚的状态
  29. nP10 = P1IN & BIT0;
  30. nP11 = (P1IN & BIT1) >> 1;
  31. nP12 = (P1IN & BIT2) >> 2;
  32. nP13 = (P1IN & BIT3) >> 3;
  33. //是否有键被按下
  34. if(nP10 == 0 || nP11 == 0 || nP12 == 0 || nP13 == 0)
  35. {
  36. //有键被按下
  37. break;
  38. }
  39. }
  40.     Delay(); //延时一点时间,消除抖动
  41. //读取各个管脚的状态
  42. nP10 = P1IN & BIT0;
  43. nP11 = (P1IN & BIT1) >> 1;
  44. nP12 = (P1IN & BIT2) >> 2;
  45. nP13 = (P1IN & BIT3) >> 3;
  46. //是否有键被按下
  47. if(nP10 == 0 || nP11 == 0 || nP12 == 0 || nP13 == 0)
  48. {
  49. //有键被按下,进行键盘输入分析
  50. nRes = KeyProcess();
  51. }
  52. else return -1;//没有输入,为干扰
  53. return nRes;
  54. }
  55. void Delay(void)
  56. {
  57. int i;
  58. for(i = 100;i--;i > 0) ;//延时一点时间
  59. }
  60. int KeyProcess(void)
  61. {
  62. int nRes = 0;
  63. int nP10;
  64. int nP11;
  65. int nP12;
  66. int nP13;
  67. //P1.4输出低电平
  68. P1OUT &= ~(BIT4);
  69. nP10 = P1IN & BIT0;
  70. if (nP10 == 0) nRes = 13;
  71. nP11 = (P1IN & BIT1) >> 1;
  72. if (nP11 == 0) nRes = 14;
  73. nP12 = (P1IN & BIT2) >> 2;
  74. if (nP12 == 0) nRes = 15;
  75. nP13 = (P1IN & BIT3) >> 3;
  76. if (nP13 == 0) nRes = 16;
  77. //P1.5输出低电平
  78. P1OUT &= ~(BIT4);
  79. nP10 = P1IN & BIT0;
  80. if (nP10 == 0) nRes = 9;
  81. nP11 = (P1IN & BIT1) >> 1;
  82. if (nP11 == 0) nRes = 10;
  83. nP12 = (P1IN & BIT2) >> 2;
  84. if (nP12 == 0) nRes = 11;
  85. nP13 = (P1IN & BIT3) >> 3;
  86. if (nP13 == 0) nRes = 12;
  87. //P1.6输出低电平
  88. P1OUT &= ~(BIT4);
  89. nP10 = P1IN & BIT0;
  90. if (nP10 == 0) nRes = 5;
  91. nP11 = (P1IN & BIT1) >> 1;
  92. if (nP11 == 0) nRes = 6;
  93. nP12 = (P1IN & BIT2) >> 2;
  94. if (nP12 == 0) nRes = 7;
  95. nP13 = (P1IN & BIT3) >> 3;
  96. if (nP13 == 0) nRes = 8;
  97. //P1.7输出低电平
  98. P1OUT &= ~(BIT4);
  99. nP10 = P1IN & BIT0;
  100. if (nP10 == 0) nRes = 1;
  101. nP11 = (P1IN & BIT1) >> 1;
  102. if (nP11 == 0) nRes = 2;
  103. nP12 = (P1IN & BIT2) >> 2;
  104. if (nP12 == 0) nRes = 3;
  105. nP13 = (P1IN & BIT3) >> 3;
  106. if (nP13 == 0) nRes = 4;
  107. P1OUT = 0x00;//恢复以前值。
  108. //读取各个管脚的状态
  109. nP10 = P1IN & BIT0;
  110. nP11 = (P1IN & BIT1) >> 1;
  111. nP12 = (P1IN & BIT2) >> 2;
  112. nP13 = (P1IN & BIT3) >> 3;
  113. for(;;)
  114. {
  115. if(nP10 == 1 && nP11 == 1 && nP12 == 1 && nP13 == 1)
  116. {
  117. //等待松开按键
  118. break;
  119. }
  120. }
  121. return nRes;
  122. }
  123. void Init_CLK(void)
  124. {
  125.     unsigned int i;
  126.     BCSCTL1 = 0X00; //将寄存器的内容清零
  127. //XT2震荡器开启
  128. //LFTX1工作在低频模式
  129. //ACLK的分频因子为1
  130.     do 
  131.     {
  132. IFG1 &= ~OFIFG;                       // 清除OSCFault标志
  133. for (i = 0x20; i > 0; i--);                
  134.     }
  135.     while ((IFG1 & OFIFG) == OFIFG);      // 如果OSCFault =1   
  136.     BCSCTL2 = 0X00; //将寄存器的内容清零
  137.     BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1
  138.     BCSCTL2 += SELS; //SMCLK的时钟源为TX2CLK,分频因子为1
  139. }