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

本文介绍了一个使用MSP430微控制器实现流水灯控制的程序。该程序通过配置定时器A,实现了灯光以不同方向和速度流动的效果。通过调整代码中的参数,可以灵活地改变灯光的流动方式。

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

  1. /*********************************************** 
  2. 程序功能:实现流水灯以三种流动方式和四种流动速度 
  3.           的不同组合而进行点亮"流动" 
  4. ------------------------------------------------ 
  5. 拨码开关设置:将LED位拨至ON,其余拨至OFF 
  6. 测试说明:观察流水灯流动顺序和速度的变化 
  7. ************************************************/  
  8. #include  <msp430x14x.h>  
  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<<(i++));    //灯的点亮顺序D1 -> D8  
  54.     }  
  55.     else   
  56.     {  
  57.         if(dir)                  //灯的点亮顺序  D8 -> D1,D1 -> D8,循环绕圈                          
  58.         {  
  59.             P2OUT = ~(0x80>>(i++));  
  60.         }  
  61.         else  
  62.         {  
  63.             P2OUT = ~(0x01<<(i++));  
  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. }  

本文转自emouse博客园博客,原文链接:http://www.cnblogs.com/emouse/archive/2010/07/20/2198224.html,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值