只是一个简单的课设题目,觉得自己写的代码还将就! #include <msp430.h>
#include <stdint.h>
#include "dr_lcdseg.h" //调用段式液晶驱动头文件 int second = 0, secSum = 0, minSum = 0; int count = 0; void GPIO_init(); //按键S7为reset
void P40_Onclick()
{
second = 0;
secSum = 0;
minSum = 0;
}
//按键S5为开始
void P42_Onclick()
{
TA0CTL |= MC_1;
} //按键S3为暂停
void P44_Onclick()
{
TA0CTL &= ~MC_1;
} void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
P1DIR |= BIT5; //控制蜂鸣器输出
P4DIR |= BIT5; //控制LED输出 initLcdSeg(); //初始化段式液晶
TA0CTL |= MC_1 + TASSEL_2 + TACLR;
GPIO_init(); //IO口初始化
//时钟为SMCLK,比较模式,开始时清零计数器
TA0CCTL0 = CCIE; //比较器中断使能
TA0CCR0 = 1250; //比较值设为1250,相当于1/800s的时间间隔
__bis_SR_register(GIE); //进入低功耗并开启总中断
while (1)
{
LCDSEG_SetDigit(1, secSum % 10);
LCDSEG_SetDigit(2, secSum / 10);
//第四位显示一横
LCDSEG_SetDigit(3, 16);
LCDSEG_SetDigit(4, minSum % 10);
LCDSEG_SetDigit(5, minSum / 10);
}
} //TimerA的中断函数
#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer_A(void)
{
second++;
//中断20次之后为1s
if (second == 800)
{
//秒数加1
secSum++;
//当秒数为60时,分钟数加1
if (secSum == 60)
{
secSum = 0;
minSum++;
}
second = 0;
} count++;
if (count == 1600)
{
P1OUT ^= BIT5; //形成鸣叫效果
P4OUT ^= BIT5; //形成闪灯效果
}
if (count > 3200)
{
P1OUT ^= BIT5; //关闭蜂鸣器
P4OUT ^= BIT5; //灯灭
count = 0;
}
} // P4中断函数
#pragma vector=PORT4_VECTOR
__interrupt void Port_4(void)
{
_DINT();
unsigned int Push_Key = 0;
//----排除输出IO的干扰后,锁定唯一被触发的中断标志位----
Push_Key = P4IFG & (~P4DIR);
//----延时一段时间,避开机械抖动区域----
__delay_cycles(327); //延时ms if (P4IFG != 0)
{
//----判断具体哪个IO被按下,调用该IO的事件处理函数
switch (Push_Key)
//代码4:不用P1IN来判断,以确保有且只有1按键响应
{
case BIT0: //按键S7
P40_Onclick();
break;
case BIT2: //按键S5
P42_Onclick();
break;
case BIT4: //按键S3
P44_Onclick();
break;
default:
break; //任何情况下
}
}
P4IFG = 0; //退出中断前必须手动清除IO口中断标志
} void GPIO_init()
{
//----配合机械按键,启用内部上拉电阻----
//启用P4.0、P4.2、P4.4内部上下拉电阻
P4REN |= BIT0 + BIT2 + BIT4;
P4OUT |= BIT0 + BIT2 + BIT4; //将电阻设置为上拉 //----配置P4.0、P4.2、P4.4中断参数----
P4DIR &= ~(BIT0 + BIT2 + BIT4); //将按键设为输入
P1IES |= BIT0 + BIT2 + BIT4; //P4.0、P4.2、P4.4设置为下降沿中断
P4IE |= BIT0 + BIT2 + BIT4; //允许P4.0、P4.2、P4.4中断
}
|