查看: 601|回复: 0

MSP430实现800Hz蜂鸣器和秒表

[复制链接]

该用户从未签到

发表于 2020-11-14 19:53:13 | 显示全部楼层 |阅读模式
分享到:

只是一个简单的课设题目,觉得自己写的代码还将就!

#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中断
}


回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条



手机版|小黑屋|与非网

GMT+8, 2024-3-29 13:34 , Processed in 0.105495 second(s), 14 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.