我用我的MSP430F5438A寫了個程序, 運行了下完全OK, 用示波器可以看到占空比的連續變化
//this is source code using MSP430F5438A, the Aclock is using XT1=32.768K, the will help to get second counts
#include <msp430.h>
#include <stdlib.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
uchar num1, num2, num3, num4;
uint count,count1,temp=0;
uchar const table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar const table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
void Init_Port(void)
{
P7DIR |= Ox01 ; // set the P7.0 as output;
// P7OUT &= ~0x01 ;// turn on the LED;
//INTERNAL_PULL_UP ;
// ROW_IN_COL_OUT ;
P1OUT = 0xF0 ;
P1DIR = 0xF0 ;
P6DIR &=~0x01;
P6REN |= 0x01;
P6OUT = 0x01;
P9OUT = 0x0F ;
P9DIR = 0x0F ;
P8DIR = 0xFF;
P8OUT = 0xFF;
}
void Display(num1,num2,num3,num4)
{
P8OUT = table[num1];
P9OUT &= ~BIT0;
__delay_cycles(100);
P9OUT |= BIT0;
P8OUT = table[num2];
P9OUT &= ~BIT1;
__delay_cycles(100);
P9OUT |= BIT1;
P8OUT = table[num3];
P9OUT &= ~BIT2;
__delay_cycles(100);
P9OUT |= BIT2;
P8OUT = table[num4];
P9OUT &= ~BIT3;
__delay_cycles(100);
P9OUT |= BIT3;
}
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
Init_Port();
P1DIR |= 0x30; // just to check waveform P2.2&P2.3 O/P using scope
P1SEL |= 0x30; // P2.2 and P2.3 options select
TA0CCR0 = 512-1; // PWM Period
TA0CCTL3 = OUTMOD_7; // CCR1 reset/set
TA0CCR3 = 384; // CCR1 PWM duty cycle
TA0CCTL4 = OUTMOD_7; // CCR2 reset/set
TA0CCR4 = 128; // CCR2 PWM duty cycle
TA0CTL = TASSEL_1 + MC_1 + TACLR; // SMCLK, up mode, clear TAR
TA1CCTL0 = CCIE; // CCR0 interrupt enabled
TA1CCR0 = 32768-1;
TA1CTL = TASSEL_1 + MC_1 + TACLR; // ACLK, upmode, clear TAR
//TBCCTL0 = CCIE; // TBCCR0 interrupt enabled
//TBCCR0 = 30;
//TBCTL = TBSSEL_1 + MC_1 + TBCLR; // ACLK, upmode, clear TBR
__bis_SR_register(GIE); // Enter LPM0, enable interrupts
while(1)
{
TA0CCR4=temp;
Display(num1,num2,num3,num4);// if LPM0 is enable, the routine will not be preformed;
if (!(P6IN&0x01))
{
__delay_cycles(10);
if (!(P6IN&0x01))
{
temp+=5;
if (temp==512)
temp=128;
while(!(P6IN&0x01));
}
}
}
}
// Timer1 A0 interrupt service routine
#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER1_A0_ISR(void)
{
count++;
if(count==2) //the light intensity increase 1every other 2sec
{
count=0;
temp++;
num1=temp/1000; //°ÑÕa¸ö±äá¿ÏÔê¾3öà′
num2=temp%1000/100;
num3=temp%100/10;
num4=temp%10;
if (temp==512)
temp=0;
}
count1++;
if (count1==10)
{
count1=0;
P7OUT^=0x01; //Output LED flahes every other 10 sec;
}
}
|