2042|0

2781

帖子

417

TA的资源

五彩晶圆(中级)

楼主
 

MSP430学习笔记2-跑马灯程序,熟悉定时器寄存器的配置 [复制链接]

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



  • /***********************************************
  • 程序功能:实现流水灯以三种流动方式和四种流动速度
  •           的不同组合而进行点亮"流动"
  • ------------------------------------------------
  • 拨码开关设置:将LED位拨至ON,其余拨至OFF
  • 测试说明:观察流水灯流动顺序和速度的变化
  • ************************************************/
  • #include  
  • 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
 
点赞 关注
个人签名

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表