MSP430--数字IO 流水灯程序

2019-07-25 14:24发布

1.数字IO共有6组,其中P1,P2可以设置外部中断。
2.通用寄存器:
PxIN,PxOUT,PxDIR,PxSEL
   上电默认PxDIR为0,即默认为输入。PxSEL若为1,则表示数字IO用作外设功能,这时候P1或P2的中断功能丢失。
3.P1的寄存器:每个地址对应8位寄存器,对应IO的8个PIN.
  1.     026h P1SEL  
  2.     025h P1IE: 中断使能  
  3.     024h P1IES:中断响应上升沿变化(0),响应下降沿变化(1)  
  4.     023h P1IFG:中断发生就置位为1,中断执行后要手动清除  
  5.     022h P1DIR  
  6.     021h P1OUT  
  7.     020h P1IN read only  
复制代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
春风的暖暖
2019-07-25 17:06
4.流水灯电路:P2端口输出低电平时二极管发光。P2DIR=0XF8,对应表示P27-P23均为输出,若这时P2OUT=0XFF,则L1-L5都会亮。

5.流水灯程序:实现流水灯以三种流动方式和四种流动速度的不同组合而进行点亮"流动"
  1.     #include  <msp430x14x.h>  
  2.       
  3.       
  4.     typedef unsigned int  uint;  
  5.       
  6.       
  7.     uint i = 0,j = 0,dir = 0;  
  8.     uint flag = 0,speed = 0;  //flag--灯光流动方式,speed--灯光流动速度  
  9.       
  10.       
  11.     /****************主函数****************/  
  12.     void main(void)  
  13.     {  
  14.         
  15.         /*给IO一个初始的状态*/  
  16.         P1DIR = 0XFF;P1OUT = 0XFF;  
  17.         P2DIR = 0XFF;P2OUT = 0XFF;  
  18.         P3DIR = 0XFF;P3OUT = 0XFF;  
  19.         P4DIR = 0XFF;P4OUT = 0XFF;  
  20.         P5DIR = 0XFF;P5OUT = 0XFF;  
  21.         P6DIR = 0XFF;P6OUT = 0XFF;  
  22.         
  23.         WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗  
  24.         P6DIR |= BIT2;P6OUT |= BIT2;    //关闭电平转换  
  25.         P5OUT &= ~BIT7;  
  26.          
  27.         CCTL0 = CCIE;                   //使能CCR0中断  
  28.         CCR0 = 50000;  
  29.         TACTL = TASSEL_2 + ID_3 + MC_1; //定时器A的时钟源选择SMCLK,增计数模式  
  30.         P2DIR = 0xff;                   //设置P2口方向为输出  
  31.         P2OUT = 0xff;  
  32.       
  33.         _EINT();                        //使能全局中断  
  34.         LPM0;                           //CPU进入LPM0模式  
  35.     }  
  36.       
  37.       
  38.     /*******************************************
  39.     函数名称:Timer_A  
  40.     功    能:定时器A的中断服务函数,在这里通过标志
  41.               控制流水灯的流动方向和流动速度
  42.     参    数:无
  43.     返回值  :无
  44.     ********************************************/  
  45.     #pragma vector = TIMERA0_VECTOR  
  46.     __interrupt void Timer_A (void)  
  47.     {   
  48.         if(flag == 0)  
  49.         {  
  50.             P2OUT = ~(0x80>>(i++));    //灯的点亮顺序D8 -> D1  
  51.         }  
  52.         else if(flag == 1)  
  53.         {  
  54.             P2OUT = ~(0x01<<(i++));    //灯的点亮顺序D1 -> D8  
  55.         }  
  56.         else   
  57.         {  
  58.             if(dir)                  //灯的点亮顺序D8->D1,D1->D8,循环绕圈                          
  59.             {  
  60.                 P2OUT = ~(0x80>>(i++));  
  61.             }  
  62.             else  
  63.             {  
  64.                 P2OUT = ~(0x01<<(i++));  
  65.             }  
  66.         }  
  67.         
  68.         if(i == 8)   
  69.         {  
  70.             i = 0;  
  71.             dir = ~dir;  
  72.         }  
  73.         
  74.         j++;  
  75.         if(j == 40) //循环5次就改变flag改变流动方向  
  76.         {  
  77.             i = 0;  
  78.             j = 0;  
  79.             flag++;  
  80.             if(flag == 4) flag = 0;  
  81.             switch(speed)  
  82.             {  
  83.             case 0:  
  84.                 TACTL &=~ (ID0 + ID1);  
  85.                 TACTL |= ID_3;  
  86.                 break;  
  87.             case 1:  
  88.                 TACTL &=~ (ID0 + ID1);  
  89.                 TACTL |= ID_2;  
  90.                 break;  
  91.             case 2:  
  92.                 TACTL &=~ (ID0 + ID1);  
  93.                 TACTL |= ID_1;  
  94.                 break;  
  95.             case 3:  
  96.                 TACTL &=~ (ID0 + ID1);  
  97.                 TACTL |= ID_0;  
  98.                 break;  
  99.             default:  
  100.                 break;  
  101.             }  
  102.             if(flag != 3)   speed++;  
  103.             if(speed == 4) speed = 0;  
  104.         }   
  105.     }  
复制代码

一周热门 更多>