×
嵌入式 > 技术百科 > 详情

MSP430学习笔记2-跑马灯程序,熟悉定时器寄存器的配置

发布时间:2020-06-18 发布时间:
|

这个例子主要还是熟悉有关定时器A的寄存器配置以及IAR的配置方式。

  1. /*********************************************** 

  2. 程序功能:实现流水灯以三种流动方式和四种流动速度 

  3.           的不同组合而进行点亮"流动" 

  4. ------------------------------------------------ 

  5. 拨码开关设置:将LED位拨至ON,其余拨至OFF 

  6. 测试说明:观察流水灯流动顺序和速度的变化 

  7. ************************************************/  

  8. #include    

  9. typedef unsigned int  uint;  

  10. uint i = 0,j = 0,dir = 0;  

  11. uint flag = 0,speed = 0;  //flag--灯光流动方式,speed--灯光流动速度  

  12. /****************主函数****************/  

  13. void main(void)  

  14. {  

  15.     

  16.     /*下面六行程序关闭所有的IO口*/  

  17.     P1DIR = 0XFF;P1OUT = 0XFF;  

  18.     P2DIR = 0XFF;P2OUT = 0XFF;  

  19.     P3DIR = 0XFF;P3OUT = 0XFF;  

  20.     P4DIR = 0XFF;P4OUT = 0XFF;  

  21.     P5DIR = 0XFF;P5OUT = 0XFF;  

  22.     P6DIR = 0XFF;P6OUT = 0XFF;  

  23.     

  24.     WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗  

  25.     P6DIR |= BIT2;P6OUT |= BIT2;    //关闭电平转换  

  26.     P5OUT &= ~BIT7;  

  27.       

  28.     CCTL0 = CCIE;                   //使能CCR0中断  

  29.     CCR0 = 50000;  

  30.     TACTL = TASSEL_2 + ID_3 + MC_1; //定时器A的时钟源选择SMCLK,8分频增计数模式  

  31.     P2DIR = 0xff;                   //设置P2口方向为输出  

  32.     P2OUT = 0xff;  

  33.    

  34.     _EINT();                        //使能全局中断  

  35.     LPM0;                           //CPU进入LPM0模式各时钟全部工作  

  36. }  

  37. /******************************************* 

  38. 函数名称:Timer_A  

  39. 功    能:定时器A的中断服务函数,在这里通过标志 

  40.           控制流水灯的流动方向和流动速度 

  41. 参    数:无 

  42. 返回值  :无 

  43. ********************************************/  

  44. #pragma vector = TIMERA0_VECTOR  

  45. __interrupt void Timer_A (void)  

  46. {    

  47.     if(flag == 0)  

  48.     {  

  49.         P2OUT = ~(0x80>>(i++));    //灯的点亮顺序D8 -> D1  

  50.     }  

  51.     else if(flag == 1)  

  52.     {  

  53.         P2OUT = ~(0x01< D8  

  54.     }  

  55.     else   

  56.     {  

  57.         if(dir)                  //灯的点亮顺序  D8 -> D1,D1 -> D8,循环绕圈                          

  58.         {  

  59.             P2OUT = ~(0x80>>(i++));  

  60.         }  

  61.         else  

  62.         {  

  63.             P2OUT = ~(0x01<

  64.         }  

  65.     }  

  66.     

  67.     if(i == 8)   

  68.     {  

  69.         i = 0;  

  70.         dir = ~dir;  

  71.     }  

  72.     

  73.     j++;  

  74.     if(j == 10)   

  75.     {  

  76.         i = 0;  

  77.         j = 0;  

  78.         flag++;  

  79.         if(flag == 4) flag = 0;  

  80.         switch(speed)//根据speed的值来选择相应的速度,速度的选择主要通过改变分频来实现  

  81.         {  

  82.         case 0:  

  83.             TACTL &=~ (ID0 + ID1);//这个地方其实没必要,意思是清零TACTL的78两位  

  84.             //ID1的值是0x0080   ID2的值是0x0040通过计算就可以得出  

  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. }  

 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
VR十大误区:眼睛离屏幕太近真的会瞎吗?