一 /*利用WDT的定时器模式控制led小灯L1以1s的间隔时间闪灭*/
#include "io430.h"
int main( void )
{
// Stop watchdog timer to prevent time out reset
//WDTCTL = WDTPW + WDTHOLD;
P6DIR |= BIT2;P6OUT |= BIT2; //关电平转换,P6.2连接了开发板上
//的电平转换芯片的使能端,与实际功能无关
WDTCTL=WDT_ADLY_1000;//设置看门狗ACLK定时器1000ms定时
IE1|=WDTIE;//开看门狗定时器中断
P2DIR|=BIT0;
P2OUT|=BIT0;
__enable_interrupt();//_EINT();//开总中断
while(1)
{
LPM0;//进入低功耗模式一,CPUOFF
}
return 0;
}
#pragma vector = WDT_VECTOR
__interrupt void watchdog_timer()
{
P2OUT=~P2OUT;
}
二 /*定时器A增计数模式下,ALK=32768HZ,MCLK=SMCLK=DCOCLK=800KHZ
利用定时器溢出中断TAIE实现小灯L1每0.5秒闪灭一次,时钟选择ALK,8分频
注意:TTAIE指TAR计数器溢出,从65535 到0的变化,由 TAIFG 引起的,
TAIFG 一般进 TIMERA1_VECTOR中断向量;
*/
#include "io430.h"
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P2DIR|=BIT0;
P2OUT|=BIT0;
__enable_interrupt();
TACTL=TASSEL_1+MC_1+ID_3+TAIE;//选择ACK,增计数模式,
//8分频,使能定时器中断
CCR0=4095;
//CCIE
while(1)
{
LPM0;
}
430分能上什么大学
return 0;
}
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A()
{
switch(TAIV)
{
case 2:break;
case 4:break;
case 10:P2OUT=~P2OUT;break;
}
}
三 /*定时器A增计数模式下,ALK=32768HZ,MCLK=SMCLK=DCOCLK=800KHZ
实现小灯L1每0.5秒闪灭一次,时钟选择SMCLK,使用CCIE中断。
注意:CCIE指捕获到相应信号(捕获模式下) ;定时时间到(比较模式下),
由CCIFG引起的。CCIFG的话要看用的是哪个定时器,如果是CCR0的话就进TIMERA0_VECTOR,
如果是CR1,CCR2……则进TIMERA1_VECTOR*/
#include "io430.h"
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P2DIR|=BIT0;
P2OUT|=BIT0;
__enable_interrupt();//使能中断
TACTL=TASSEL_2+TACLR+MC_1+ID_3;//时钟选择SMCLK,计数器清零,增计数模式,8分频
CCTL0=CCIE;//CCR0中断允许
CCR0=50000;
while(1)
{
LPM0;
}
return 0;
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A()
{
P2OUT=~P2OUT;
}
四 /*使用CCR0定时中断。CCR0的值是可以改变的,当CCR0增加到0ffffh后自动把它清为0.
实验效果为:
灯先闪的越来越慢,后突然变得很快,再慢慢变慢。
CCR0的值越大定时越长,当CCR0超过65535时会自动清理,使得定时时间很短。
而通过高低电平的实时改变也可以用来做相应管脚的PWM输出*/
#include "io430.h"
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P2DIR|=BIT0;
P2OUT|=BIT0;
__enable_interrupt();
TACTL=TASSEL_2+TACLR+MC_1+ID_3;//时钟选择SMCLK,计数器清零,增计数模式,8分频
CCTL0=CCIE;
CCR0=50000;
while(1)
{
LPM0;
}
return 0;
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A()
{
P2OUT=~P2OUT;
CCR0+=1000;
}
五/*定时器连续计数模式举例:
1、在需要65536个时钟周期的定时器应用场合常用连续计数模式。
定时器从当前值计数到0FFFFH后又从0开始计数。当定时器
从0FFFFH到0时设置标志位TAIFG。
2、连续计数模式下,也可以通过改变TACCRx的值,产生独立的
时间间隔,例如,可以在相应的比较寄存器TACCRx上加上一个时间差,
不断地增加TACCRx的值,使定时器每到一定的时间间隔都能与TACCRx的值
相等,从而使中断标志位置位,申请中断。
以下代码验证了上面两种情况*/
#include "io430.h"
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P2DIR=BIT0+BIT1;
P2OUT=BIT0+BIT1;
TACTL=TASSEL_1+TACLR+MC_2+TAIE;//ACK,连续计数模式
CCTL0=CCIE;
CCR0=32768/4;
__enable_interrupt();
while(1)
{
LPM0;
}
return 0;
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Time_A()
{
P2OUT^=BIT0;
CCR0+=32768/4;
}
#pragma vector=TIMERA1_VECTOR
__interrupt void Time_a()
{
switch(TAIV)
{
case 2:break;
case 4:break;
case 10:P2OUT^=BIT1;break;
}
}
六 /*任务要求:
利用定时器A产生4路周期信号,周期分别是4s,2s,1s和0.25s,四路周期
信号分别从P2.0--P2.3口输出。*/
#include "io430.h"
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P2DIR=BIT0+BIT1+BIT2+BIT3;
P2OUT=BIT0+BIT1+BIT2+BIT3;
TACTL=TASSEL_1+MC_2+TAIE;//ACK,连续计数模式,定时器溢出中断
CCTL0=CCIE;
CCTL1=CCIE;
CCTL2=CCIE;
CCR0=32768/8;
CCR1=32768/2;
CCR2=32768;
__enable_interrupt();
while(1)
{
LPM0;
}
return 0;
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0()
{
P2OUT^=BIT3;
CCR0+=32768/8;
}
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1()
{
switch(TAIV)
{
case 2:
CCR1+=32768/2;
P2OUT^=BIT2;
break;
case 4:
CCR2+=32768;
P2OUT^=BIT1;
break;
case 10:
P2OUT^=BIT0;
break;
}
}
七 四乘四按键
#include "io430.h"
#define uchar unsigned char
#define unit unsigned int
void delay(unit time)
{unit i;
while(time--)
for(i=100;i>0;i-1);
}
uchar keyscan(void)
{
uchar KeyNum;
P1OUT=0X0F;
#define uchar unsigned char
#define unit unsigned int
void delay(unit time)
{unit i;
while(time--)
for(i=100;i>0;i-1);
}
uchar keyscan(void)
{
uchar KeyNum;
P1OUT=0X0F;
if((P1IN&0X0F)!=0X0F)
{
delay(100);
if((P1IN&0X0F)!=0X0F)
{
P1OUT=0XE0; //判断哪列被拉低
if((P1IN&0X0F)==0X0E) //判断哪行被拉低
KeyNum= 0;
if((P1IN&0X0F)==0X0d)
KeyNum= 1;
if((P1IN&0X0F)==0X0b)
KeyNum= 2;
if((P1IN&0X0F)==0X07)
KeyNum= 3;
{
delay(100);
if((P1IN&0X0F)!=0X0F)
{
P1OUT=0XE0; //判断哪列被拉低
if((P1IN&0X0F)==0X0E) //判断哪行被拉低
KeyNum= 0;
if((P1IN&0X0F)==0X0d)
KeyNum= 1;
if((P1IN&0X0F)==0X0b)
KeyNum= 2;
if((P1IN&0X0F)==0X07)
KeyNum= 3;
P1OUT=0XD0;
if((P1IN&0X0F)==0X0E)
KeyNum= 4;
if((P1IN&0X0F)==0X0d)
KeyNum= 5;
if((P1IN&0X0F)==0X0b)
KeyNum= 6;
if((P1IN&0X0F)==0X07)
KeyNum= 7;
P1OUT=0XB0;
if((P1IN&0X0F)==0X0E)
KeyNum= 8;
if((P1IN&0X0F)==0X0d)
KeyNum= 9;
if((P1IN&0X0F)==0X0E)
KeyNum= 4;
if((P1IN&0X0F)==0X0d)
KeyNum= 5;
if((P1IN&0X0F)==0X0b)
KeyNum= 6;
if((P1IN&0X0F)==0X07)
KeyNum= 7;
P1OUT=0XB0;
if((P1IN&0X0F)==0X0E)
KeyNum= 8;
if((P1IN&0X0F)==0X0d)
KeyNum= 9;
if((P1IN&0X0F)==0X0b)
KeyNum= 10;
if((P1IN&0X0F)==0X07)
KeyNum= 11;
P1OUT=0X70;
if((P1IN&0X0F)==0X0E)
KeyNum= 12;
if((P1IN&0X0F)==0X0d)
KeyNum= 13;
if((P1IN&0X0F)==0X0b)
KeyNum= 14;
if((P1IN&0X0F)==0X07)
KeyNum= 15;
}
KeyNum= 10;
if((P1IN&0X0F)==0X07)
KeyNum= 11;
P1OUT=0X70;
if((P1IN&0X0F)==0X0E)
KeyNum= 12;
if((P1IN&0X0F)==0X0d)
KeyNum= 13;
if((P1IN&0X0F)==0X0b)
KeyNum= 14;
if((P1IN&0X0F)==0X07)
KeyNum= 15;
}
else
{
KeyNum=KeyNum;
}
}
return KeyNum;
}
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P2SEL=0X00;
P2DIR=0XFF;
P1SEL=0X00;
{
KeyNum=KeyNum;
}
}
return KeyNum;
}
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P2SEL=0X00;
P2DIR=0XFF;
P1SEL=0X00;
P1DIR=0XF0;
while(1)
{
P2OUT=keyscan();
}
while(1)
{
P2OUT=keyscan();
}
发布评论