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

DSP编程

开发平台:

C/C++

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