#include <msp430g2553.h>
/*
* main.c
*/
void GPIO_Init();
void P1_IODect();
void P13_Onclick();
void main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
GPIO_Init();//初始化GPIO
_enable_interrupts();//等同于——ENIT,使能总中断
while (1)
{
_delay_cycles(100000);//与CPU时钟相关的长延时
P1OUT^=BIT0;//LED亮灭状态改变
}
}
/***********************************************************************************************
*名称: GPIO_Init()
* 功能: 设定按键和LED控制IO的方向,启用按键IO的上啦电阻
* 入口参数: 无
* 出口参数: 无
* 说明: 无
* 范例: 无
***********************************************************************************************/
void GPIO_Init()
{
//设定P1.0和P1.6的输出初始值
P1DIR |= BIT0;
P1OUT |= BIT0;
//配合机械按键,启用内部上拉电阻
P1REN |= BIT3;
P1OUT |= BIT3;
//配置P1.3中断参数
P1DIR &= ~BIT3;
P1IES |= BIT3;
P1IE |= BIT3;
}
/*******************************************************************************************************************
/*名称: PORT1_ISR()
* 功能: 响应P1口的外部中断函数服务
* 入口参数: 无
* 出口参数: 无
* 说明: P1.0~P1.8共用了PORT1中断,所以在PORT_ISR()中必须查询标志位P1IFG才能知道具体是哪个
* IO引发了外部中断。P1IFG必须手动清除,否则将持续引发PORT1中断。
* 范例: 无
*
*******************************************************************************************************************/
#pragma vector = PORT1_VECTOR
__interrupt void PORT1_ISR(void)//注:前面的下划线有两ge
{
//启用Port1事件监测函数
P1_IODect();//监测通过,则会调用事件处理函数
P1IFG=0; //退出中断钱必须手动清除IO口中断标志
}
/********************************************************************************************************/
/*名称: P1_IODect()
* 功能: 判断具体引发中断的IO,并调用响应的IO的中断事件处理函数
* 入口函数: 无
* 出口函数: 无
* 说明: 该函数兼容所有8个IO的监测,请根据实际输入IO激活“监测代码”。在本例中,
* 仅有P1.3被用作输入IO,所以其他7个IO的监测代码没有被激活。
*范例: 无
********************************************************************************************************/
void P1_IODect()
{
unsigned int Push_Key=0;
//排除输出IO口的干扰后,锁定唯一被触发的中断标志位
Push_Key=P1IFG&(~P1DIR);
//延时一段时间,避开机械抖动区域
__delay_cycles(10000);//消抖延时
//判断按键状态是否与延时前一致
if ((P1IN&Push_Key)==0)
{
//判断具体哪个IO被按下,调用该IO的事件处理函数
switch(Push_Key)
{
// case BIT0: P10_Onclick(); break;
// case BIT1: P11_Onclick(); break;
// case BIT2: P12_Onclick(); break;
case BIT3: P13_Onclick(); break;
//case BIT4: P14_Onclick(); break;
//case BIT5: P15_Onclick(); break;
//case BIT6: P16_Onclick(); break;
//case BIT7: P17_Onclick(); break;
default : break; //任何情况下都应加上default
}
}
}
/*名称: P13_Onclick()
* 功能: P13的中断事件处理函数,即当P1.3键被按下后,下一步该干什么
* 入口参数: 无
* 出口参数: 无
* 说明: 使用事件处理函数的形式,可以增强代码的移植性和可读性
* 范例: 无
*/
void P13_Onclick()
{
//Freq仅在P13_Onclick()中使用,但是又需要退出函数时不被清除
static unsigned int Freq=0;//静态全局变量的典型应用场合
Freq++;
if (Freq>3) Freq=0;
//根据Freq 的值,改变DCO设定频率
switch (Freq){
case 0: DCOCTL = CALDCO_1MHZ; BCSCTL1 = CALBC1_1MHZ; break;
case 1: DCOCTL = CALDCO_8MHZ; BCSCTL1 = CALBC1_8MHZ; break;
case 2: DCOCTL = CALDCO_12MHZ; BCSCTL1= CALBC1_12MHZ; break;
case 3: DCOCTL=CALDCO_16MHZ; BCSCTL1= CALBC1_16MHZ; break;
default: break;
}
}
本来只有4个错误,后来越改错误越多,简直摸不着头脑!请懂的朋友帮忙!!
错误已经截图上传! |