|
#include <msp430.h>
int zhengzhuan_flag=1,b=0,c=0;
int sudu[10]={375,187,94,47,24},d=0;
/*
* main.c
*/
void clk_init(void);
void delay_ms(int ms);
void anjian_init(void);
void main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
clk_init();
anjian_init();
P1DIR=0XFF;
P1OUT=0X00;
TACTL= TASSEL_1 + ID_0 + MC_0 + TAIE;//選用aclk,0分頻,停止計數(shù)模式,允許主時鐘溢出中斷。
TA0R=65536-12000;//滿TAR值時,1秒進入一次中斷。
_EINT(); //全局中斷使能 _DINT();是禁止總中斷。
while(1) _NOP();//可以改為進入省電模式3,還沒試
}
/******************************
*
* 主時鐘溢出中斷
*
******************************/
#pragma vector = TIMER0_A1_VECTOR
__interrupt void Timer_A(void)
{
static int xiangwei=0;
switch(TAIV)
{
case 10:
if(zhengzhuan_flag==1)
{
switch(xiangwei)
{
case 1: P1OUT=0X01;break;
case 2: P1OUT=0X03;break;
case 3: P1OUT=0X02;break;
case 4: P1OUT=0X06;break;
case 5: P1OUT=0X04;break;
case 6: P1OUT=0X0C;break;
case 7: P1OUT=0X08;break;
case 8: P1OUT=0X09;break;
default: break;
}
}
else
{
switch(xiangwei)
{
case 1: P1OUT=0X09;break;
case 2: P1OUT=0X08;break;
case 3: P1OUT=0X0C;break;
case 4: P1OUT=0X04;break;
case 5: P1OUT=0X06;break;
case 6: P1OUT=0X02;break;
case 7: P1OUT=0X03;break;
case 8: P1OUT=0X01;break;
default: break;
}
}
xiangwei++;
if(xiangwei==9) xiangwei=0;
TA0R=65536-sudu[d];
}
}
/********************************
*
* p2口 定時掃描按鍵中斷
*
********************************/
#pragma vector = PORT2_VECTOR
__interrupt void PORT2_ISR(void)
{
delay_ms(1);
if((P2IN & 0x1f)!=0x1f)
{
while((P2IN & 0x1f)!=0x1f);
switch(P2IFG & 0x1f)
{
case 0x01: //啟動鍵按下,timer時鐘重新啟動。
{
TACTL= TASSEL_1 + ID_0 + MC_2 + TAIE;
TA0R=65536-12000;
d=0;
break;
}
case 0x02: //停止鍵按下,timer時鐘停止,4相輸出為零(無吸力)
{
TACTL = MC_0;
P1OUT=0x00;
break;
}
case 0x04: //正反轉(zhuǎn)鍵按下,
{
if(b==1)
{zhengzhuan_flag=1;delay_ms(3);}
else
{zhengzhuan_flag=0;delay_ms(3);}
b++;
if(b==2)b=0;
break;
}
case 0x08: //加速鍵按下
{
d++;
if(d==5)d=0;
break;
}
case 0x10: //暫停鍵按下,暫停或啟動timer計時器,但不清楚計時器的值。4相輸出保持不變
{
if(c==0) TACTL = MC_0;
else {TACTL= TASSEL_1 + ID_0 + MC_2 + TAIE;TA0R=65536-sudu[d];}
c++;
if(c==2) c=0;
break;
}
default: break;
}
}
P2IFG = 0;
}
/****************
*
*初始化按鍵 P2.0-2.4
*
********************/
void anjian_init(void)
{
P2DIR |= 0XE0;//0-4為輸入
P2OUT |= 0X1F;//0-4為置高
P2REN |= 0X1F;//0-4上拉電阻
P2IES |= 0X1F;//下降沿
P2IFG = 0;
P2IE |= 0X1F;
}
/****************
*
*毫秒級延時函數(shù)
*
********************/
void delay_ms(int ms)
{
int i,j;
for(j=0;j<ms;j++)
for(i=0;i<1000;i++);
}
/***********************
*
*系統(tǒng)時鐘初始化
*
***********************/
void clk_init(void)
{
BCSCTL2 = SELM_0 | DIVM_0 | DIVS_0;
if (CALBC1_1MHZ != 0xFF) {
/* Follow recommended flow. First, clear all DCOx and MODx bits. Then
* apply new RSELx values. Finally, apply new DCOx and MODx bit values.
*/
DCOCTL = 0x00;
BCSCTL1 = CALBC1_1MHZ; /* Set DCO to 1MHz */
DCOCTL = CALDCO_1MHZ;
}
BCSCTL1 |= XT2OFF | DIVA_0;
BCSCTL3 = XT2S_0 | LFXT1S_2 | XCAP_1;
}
|
|