社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 882|回复: 0

[资料分享] MSP430学习笔记2-跑马灯程序,熟悉定时器寄存器的配置

[复制链接]

3360

TA的帖子

421

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

荣誉会员勋章

发表于 2013-11-29 18:50:36 | 显示全部楼层 |阅读模式
这个例子主要还是熟悉有关定时器A的寄存器配置以及IAR的配置方式。



  • /***********************************************
  • 程序功能:实现流水灯以三种流动方式和四种流动速度
  •           的不同组合而进行点亮"流动"
  • ------------------------------------------------
  • 拨码开关设置:将LED位拨至ON,其余拨至OFF
  • 测试说明:观察流水灯流动顺序和速度的变化
  • ************************************************/
  • #include  <msp430x14x.h>
  • typedef unsigned int  uint;
  • uint i = 0,j = 0,dir = 0;
  • uint flag = 0,speed = 0;  //flag--灯光流动方式,speed--灯光流动速度
  • /****************主函数****************/
  • void main(void)
  • {
  •     /*下面六行程序关闭所有的IO口*/
  •     P1DIR = 0XFF;P1OUT = 0XFF;
  •     P2DIR = 0XFF;P2OUT = 0XFF;
  •     P3DIR = 0XFF;P3OUT = 0XFF;
  •     P4DIR = 0XFF;P4OUT = 0XFF;
  •     P5DIR = 0XFF;P5OUT = 0XFF;
  •     P6DIR = 0XFF;P6OUT = 0XFF;
  •     WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗
  •     P6DIR |= BIT2;P6OUT |= BIT2;    //关闭电平转换
  •     P5OUT &= ~BIT7;
  •     CCTL0 = CCIE;                   //使能CCR0中断
  •     CCR0 = 50000;
  •     TACTL = TASSEL_2 + ID_3 + MC_1; //定时器A的时钟源选择SMCLK,8分频增计数模式
  •     P2DIR = 0xff;                   //设置P2口方向为输出
  •     P2OUT = 0xff;
  •     _EINT();                        //使能全局中断
  •     LPM0;                           //CPU进入LPM0模式各时钟全部工作
  • }
  • /*******************************************
  • 函数名称:Timer_A
  • 功    能:定时器A的中断服务函数,在这里通过标志
  •           控制流水灯的流动方向和流动速度
  • 参    数:无
  • 返回值  :无
  • ********************************************/
  • #pragma vector = TIMERA0_VECTOR
  • __interrupt void Timer_A (void)
  • {
  •     if(flag == 0)
  •     {
  •         P2OUT = ~(0x80>>(i++));    //灯的点亮顺序D8 -> D1
  •     }
  •     else if(flag == 1)
  •     {
  •         P2OUT = ~(0x01<<(i++));    //灯的点亮顺序D1 -> D8
  •     }
  •     else
  •     {
  •         if(dir)                  //灯的点亮顺序  D8 -> D1,D1 -> D8,循环绕圈                        
  •         {
  •             P2OUT = ~(0x80>>(i++));
  •         }
  •         else
  •         {
  •             P2OUT = ~(0x01<<(i++));
  •         }
  •     }
  •     if(i == 8)
  •     {
  •         i = 0;
  •         dir = ~dir;
  •     }
  •     j++;
  •     if(j == 10)
  •     {
  •         i = 0;
  •         j = 0;
  •         flag++;
  •         if(flag == 4) flag = 0;
  •         switch(speed)//根据speed的值来选择相应的速度,速度的选择主要通过改变分频来实现
  •         {
  •         case 0:
  •             TACTL &=~ (ID0 + ID1);//这个地方其实没必要,意思是清零TACTL的78两位
  •             //ID1的值是0x0080   ID2的值是0x0040通过计算就可以得出
  •             TACTL |= ID_3;//改为八分频
  •             break;
  •         case 1:
  •             TACTL &=~ (ID0 + ID1);
  •             TACTL |= ID_2;
  •             break;
  •         case 2:
  •             TACTL &=~ (ID0 + ID1);
  •             TACTL |= ID_1;
  •             break;
  •         case 3:
  •             TACTL &=~ (ID0 + ID1);
  •             TACTL |= ID_0;
  •             break;
  •         default:
  •             break;
  •         }
  •         if(flag != 3)   speed++;
  •         if(speed == 4) speed = 0;
  •     }
  • }

作者:haozi_1989
此帖出自MSP430论坛


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-6-19 14:48 , Processed in 0.084859 second(s), 18 queries , Gzip On, Redis On.

快速回复 返回顶部 返回列表