定时器寄存器配置的跑马灯程序

描述

  跑马灯是一种电脑编程工具,利用涂鸦等效果显示文字。电脑中的跑马灯,跑马灯在编程中,通常指有时需要用一矩形条显示少量用户特别关心的信息,这条信息串首尾相连,向一个方向循环滚动。证券业中常用“跑马灯”来显示不断变化的股票行情;实际应用中也常通过“跑马灯”来监视是否死机。一般是指各种发光二极管,如主板和主机箱上的指示灯。开机后用来指示各种工作状态。

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

  [cpp] view plain copy/***********************************************

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

  的不同组合而进行点亮“流动”

  ------------------------------------------------

  拨码开关设置:将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;

  }

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分