MSP430F149学习之路——LED
2020-06-20 来源:eefocus
1 #include 2 3 void int_clk(); 4 void delay(int i); 5 void main() 6 { 7 WDTCTL = WDTPW + WDTHOLD; 8 int_clk(); 9 P6DIR = 0XFF; 10 P6OUT = 0Xff; 11 while(1) 12 { 13 P6OUT = 0XFF; 14 delay(20000); 15 P6OUT = 0x00; 16 delay(20000); 17 } 18 } 19 20 void int_clk() 21 { 22 BCSCTL1 &= ~XT2OFF; 23 BCSCTL2 |= SELM_1 + SELS; 24 do 25 { 26 IFG1 &= ~OFIFG; 27 for(int i=0;i<100;i++) 28 _NOP(); 29 }while((IFG1 & OFIFG)!=0); 30 IFG1 &= ~OFIFG; 31 } 32 33 void delay(int i) 34 { 35 while(i--); 36 } 提示:IAR的配置要正确 升级版本: 1 /*********************************************** 2 程序功能:实现流水灯以三种流动方式和四种流动速度 3 的不同组合而进行点亮'流动' 4 ------------------------------------------------*/ 5 #include 6 int flag=0,i=0,j=0,dir=0,speed=0; 7 void int_clk(); 8 void delay(int i); 9 void main() 10 { 11 WDTCTL = WDTPW + WDTHOLD; 12 int_clk(); 13 P6DIR = 0XFF; 14 P6OUT = 0XFF; 15 16 TACCTL0 = CCIE; //使能CCR0中断 17 TACCR0 = 50000; 18 TACTL = TASSEL_2 + MC_1 + ID_3; //定时器A选择SMCLK,增计数,8分频 19 20 _EINT(); 21 LPM0; 22 } 23 /******************************************* 24 函数名称:Timer_A 25 功 能:定时器A的中断服务函数,在这里通过标志 26 控制流水灯的流动方向和流动速度 27 参 数:无 28 返回值 :无 29 ********************************************/ 30 #pragma vector=TIMERA0_VECTOR 31 __interrupt void Timer_A(void) 32 { 33 if(flag == 0) 34 { 35 P6OUT = ~(0x80>>(i++)); //灯的点亮顺序D8 -> D1 36 } 37 else if(flag == 1) 38 { 39 P6OUT = ~(0x01<<(i++)); //灯的点亮顺序D1 -> D8 40 } 41 else 42 { 43 if(dir) //灯的点亮顺序 D8 -> D1,D1 -> D8,循环绕圈 44 P6OUT = ~(0x80>>(i++)); 45 else 46 P6OUT = ~(0x01<<(i++)); 47 } 48 49 if(i == 8) 50 { 51 i = 0; 52 dir = ~dir; 53 } 54 delay(200); 55 j++; 56 if(j == 40) 57 { 58 i = 0; 59 j = 0; 60 flag++; 61 if(flag == 4) flag = 0; 62 switch(speed) 63 { 64 case 0: 65 // TACTL &=~ (ID0 + ID1); 66 TACTL |= ID_3; 67 break; 68 case 1: 69 // TACTL &=~ (ID0 + ID1); 70 TACTL |= ID_2; 71 break; 72 case 2: 73 // TACTL &=~ (ID0 + ID1); 74 TACTL |= ID_1; 75 break; 76 case 3: 77 // TACTL &=~ (ID0 + ID1); 78 TACTL |= ID_0; 79 break; 80 default: 81 break; 82 } 83 if(flag != 3) speed++; 84 if(speed == 4) speed = 0; 85 } 86 } 87 void int_clk() 88 { 89 BCSCTL1 &= ~XT2OFF; 90 BCSCTL2 |= SELM_1 + SELS; //DCO在800KHZ左右 91 do 92 { 93 IFG1 &= ~OFIFG; 94 for(int i=0;i<100;i++) 95 _NOP(); 96 }while((IFG1 & OFIFG)!=0); 97 IFG1 &= ~OFIFG; 98 } 99 100 void delay(int i) 101 { 102 while(i--); 103 }