/********************************************************************
用按键控制蜂鸣器发音的音调。
K1按下后用2KHz方波驱动蜂鸣器及数码管显示数字,流水灯指示LED值
K2按下后用4KHz方波驱动蜂鸣器及数码管显示数字,流水灯指示LED值
K3按下后用6KHz方波驱动蜂鸣器及数码管显示数字,流水灯指示LED值
K4按下后停止发音及数码管显示数字,流水灯指示LED值
********************************************************************/
#include "msp430x14x.h"
#include "BoardConfig.h"
#define keyin (P1IN & 0x0f)
#define uchar unsigned char
#define uint unsigned int
uchar scandata[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(void);
uchar temp,keyval=0;
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
BoardConfig(0x80); //打开流水灯 数码管 关掉电平转换
P1IES =0x0f;
P1IE =0x0f; //打开P1中断及下降沿中断
uchar i;
P1DIR =BIT7;
P1OUT =0; //KEY端口设置P1.7为输出
P2DIR =0xff;
P2OUT =0xff; //流水灯的控制端口设置为输出
P3DIR |=BIT4;
P3OUT =BIT4; //按健指示LED,有按照输入时闪亮一下
P4DIR |=0xff;
P4OUT |=0x3f;
P5DIR |=0xff;
P5OUT =0xfe; //数码管显示控制端口及位选控制
P6DIR |=BIT7;
// P6OUT =BIT7;
BCSCTL1 ^=XT2OFF;
do
{
IFG1 &=~OFIFG;
for(i=0xff;i>0;i--);
}
while((IFG1 & OFIFG));
BCSCTL2 |=SELM_2+SELS;
TACTL |=TASSEL_2+MC_1+ID_3;
//CCTL0 |= CCIE;
_EINT();
while(1)
{
LPM1;
P4OUT =scandata[keyval];
//P3OUT ^=BIT4;
// delay();
// P3OUT |=BIT4;
}
}
/*********************************************************************
延时程序
*********************************************************************/
void delay()
{
uint i,tmp;
for(i=7;i>0;i--)
{
for(tmp=1200;tmp>0;tmp--);
}
}
/**********************************************************************
计数器A中断
**********************************************************************/
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
P6OUT ^=BIT7; //中断一次蜂鸣器开关触发一次
}
/*************************************************************************
PORT1.0-1.3引脚中断,判断哪一个开关产生的中断,同时控掉不同的定时器计数值,产生
不同时间的方波,蜂鸣器发出不同的声音
************************************************************************/
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
if(P1IFG & 0x0f)
{
switch(P1IFG)
{
case 0x01:
if(keyin !=0x0f)
{
_NOP();
if(keyin !=0x0f)
{
// temp =keyin;
while(keyin !=0x0f);
LPM1_EXIT;
keyval =1;
CCR0 =5000;
CCTL0 |= CCIE;
P2OUT =0xfe;
P1IFG =0;
break;
}
}
case 0x02:
if(keyin !=0x0f)
{
_NOP();
if(keyin !=0x0f)
{
// temp =keyin;
while(keyin !=0x0f);
LPM1_EXIT;
keyval =2;
CCR0 =2500;
CCTL0 |= CCIE;
P2OUT =0xfd;
P1IFG =0;
break;
}
}
case 0x04:
if(keyin !=0x0f)
{
_NOP();
if(keyin !=0x0f)
{
// temp =keyin;
while(keyin !=0x0f);
LPM1_EXIT;
keyval =3;
CCR0 =1250;
CCTL0 |= CCIE;
P2OUT =0xfb;
P1IFG =0;
break;
}
}
case 0x08:
if(keyin !=0x0f)
{
_NOP();
if(keyin !=0x0f)
{
temp =keyin;
while(keyin !=0x0f);
LPM1_EXIT;
keyval =4;
CCR0 =650;
CCTL0 |= CCIE;
P2OUT =0xf7;
P1IFG =0;
break;
}
}
default:
while(keyin !=0x0f);
keyval =0;
P1IFG =0;
break;
}
}
}