历史上的今天
返回首页

历史上的今天

今天是:2025年02月24日(星期一)

正在发生

2020年02月24日 | 初学MSP430——按键中断控制小灯翻转

2020-02-24 来源:eefocus

**

/*

* Copyright (c)...

* All rights reserved.

*

* 文件名称:main.c

* 文件标识:NO

* 硬件描述:开发板上P1.3接按键,P1.0接了LED(用跳线帽连接)。

* 功能描述:每次按下按键后,控制P1.0、P1.6 LED闪烁情况

*

* 当前版本:V1.0

* 作者:输入作者(或修改者)名字

* 完成日期:2015年2月6日

*

* 取代版本:NO

* 原作者:TI

* 完成日期:2013-4-8

*/

#include "MSP430G2553.h"

//-----在main()函数前提前申明子函数-----

void P1_IODect();                                   //P1口的外部中断事件检测函数

void P13_Onclick();                             //P1.3按键的中断事件处理函数

void GPIO_Init();                                   //GPIO初始化函数

/*

* 名 称:main()

* 功 能:控制全局

* 输入参数:NO

* 输出参数:NO

*   返回值:NO

* 说 明:NO

* 范 例:NO

*/

void main(void)

{

    WDTCTL = WDTPW + WDTHOLD;   //关闭看门狗定时器

    DCOCTL = CALDCO_8MHZ;       BCSCTL1 = CALBC1_8MHZ;//设定DCO时钟为MCLK 8Mhz

    GPIO_Init();                                    //初始化GPIO

    _enable_interrupts();                           //等同_EINT,使能总中断

    while(1)

    {

    }

}

/*

* 名 称:GPIO_Init()

* 功 能:设定按键和LED控制IO的方向,启用按键IO的上拉电阻

* 输入参数:NO

* 输出参数:NO

*   返回值:NO

* 说 明:NO

* 范 例:NO

*/

void GPIO_Init()

{

    //-----设定P1.0和P1.6的输出初始值-----

    P1DIR |= BIT0+BIT6;                 //设定P1.0为输出

    P1OUT ^= ~(BIT0+BIT6);             //设定P1.0初值

    //-----配合机械按键,启用内部上拉电阻-----

    P1REN |= BIT3;                     //启用P1.3内部上下拉电阻

    P1OUT |= BIT3;                     //将电阻设置为上拉

    //-----配置P1.3中断参数-----

    P1DIR &= ~BIT3;                    // P1.3设为输入(可省略)

    P1IES |= BIT3;                     // P1.3设为下降沿中断

    P1IE  |= BIT3 ;                    // 允许P1.3中断

}

/*

 * 名    称:PORT1_ISR()

 * 功    能:响应P1口的外部中断服务

* 输入参数:NO

* 输出参数:NO

*   返回值:NO

* 说 明:P1.0~P1.8共用了PORT1中断,所以在PORT1_ISR()中必须查询标志位P1IFG才能知道

*               具体是哪个IO引发了外部中断。P1IFG必须手动清除,否则将持续引发PORT1中断。

* 范 例:NO

*/

#pragma vector = PORT1_VECTOR

__interrupt void PORT1_ISR(void)

{

    //-----启用Port1事件检测函数-----

    P1_IODect();                                //检测通过,则会调用事件处理函数

    P1IFG=0;                                    //退出中断前必须手动清除IO口中断标志

}

/*

* 名       称:P1_IODect()

* 功       能:判断具体引发中断的IO,并调用相应IO的中断事件处理函数

* 输入参数:NO

* 输出参数:NO

*   返回值:NO

* 说       明:该函数兼容所有8个IO的检测,请根据实际输入IO激活“检测代码”。

*               本例中,仅有P1.3被用作输入IO,所以其他7个IO的“检测代码”没有被“激活”。

* 范 例:NO

*/

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()

* 功    能:P1.3的中断事件处理函数,即当P1.3键被按下后,下一步干什么

* 输入参数:NO

* 输出参数:NO

*   返回值:NO

* 说    明:使用事件处理函数的形式,可以增强代码的移植性和可读性

* 范 例:NO

*/

void P13_Onclick()

{

    //-----Change仅在P13_Onclick()中使用,但是又需要退出函数时不被清除-----

    static unsigned int Change = 0;             // 静态全局变量的典型应用场合

    //-----变量从0~3循环移位-----

    Change ++;

    if (Change > 3)

    {

        Change = 0;

    }

    //-----根据Change的值,改变p1.0、p1.6这两个端口的电平高低-----

    switch(Change)

    {

        case 0:     P1OUT ^= BIT0;          break;  //P1.0 通过异或取反

        case 1:     P1OUT ^= BIT6;          break;  //P1.6 通过异或取反

        case 2:     P1OUT |= BIT6 + BIT0;   break;//P1.0 、P1.6 均属出高电平

        case 3:     P1OUT &= ~(BIT6 + BIT0);break;//P1.0 、P1.6 均属出低电平

        default:                            break;

    }

}


**

推荐阅读

史海拾趣

Global Navigation Systems公司的发展小趣事
远程无线防盗报警(发射)电路通常包括入侵探测器、微型无线报警发射机和无线报警接收控制器三大部分。当入侵探测器检测到异常情况(如门窗被非法打开)时,会触发微型无线报警发射机发出编码报警电信号。这个信号通过无线方式传输给远程的无线报警接收控制器,接收控制器解码后触发报警装置(如警铃、灯光等)进行报警,并可能通过GSM模块等通讯方式将报警信息发送给用户或监控中心。
铨力(ALLPOWER)公司的发展小趣事

在国内市场取得一定成绩后,铨力公司开始将目光转向国际市场。通过参加国际展览、与海外客户建立合作关系等方式,公司逐渐打开了海外市场的大门。同时,铨力还积极寻求与国际知名企业的合作机会,通过技术交流和资源整合,不断提升自身的技术水平和市场竞争力。

国兴(GOODSKY)公司的发展小趣事

随着新能源汽车市场的快速发展,铨力公司看到了新的发展机遇。于是,公司开始布局新能源汽车领域,研发和生产新能源汽车所需的电源和充电设备。通过不断创新和拓展市场,铨力在新能源汽车领域也取得了显著的成绩,为公司的发展注入了新的动力。

这五个故事展示了铨力(ALLPOWER)公司在电子行业中的发展历程和取得的成就。从创立初期的太阳能电源产品研发,到技术突破和产品升级,再到国际市场的拓展和产业链整合,以及新能源汽车领域的布局,铨力始终保持着创新的精神和进取的态度,不断推动着公司的发展。

迦美信芯(CanaanTek)公司的发展小趣事

在导航芯片领域,迦美信芯也取得了显著成就。由公司董事长兼CTO倪文海主导开发的兼容“GPS+北斗导航”的射频芯片,被国内主要基带厂商广泛采用,占据了北斗细分市场60%的份额。这一成就不仅彰显了迦美信芯在导航芯片领域的强大实力,也为其在物联网和汽车电子等领域的应用奠定了坚实基础。

Allied Controls Incorporated公司的发展小趣事

迦美信芯通讯技术有限公司成立于2008年,总部位于被誉为“中国硅谷”的上海张江高科技园区。自成立以来,公司便专注于射频领域集成电路的研发和销售。凭借对技术的深入理解和不懈追求,迦美信芯逐渐在射频前端市场占据了一席之地。

Cembre SPA公司的发展小趣事

为了满足全球客户的需求,Cembre SPA制定了国际化战略,开始在全球范围内拓展业务。公司设立了多个海外分支机构,与当地的合作伙伴建立了紧密的合作关系。通过全球化的销售网络和本地化的服务支持,Cembre SPA的产品逐渐打入了国际市场,赢得了全球客户的信赖。

问答坊 | AI 解惑

寻求高手

有个单子要交,需要用到单片机,高薪寻求高手合作。有意请加QQ:85288499,请注明:单片机…

查看全部问答>

verilog英文版教材

verilog英文版教材 …

查看全部问答>

逆变电源

一款简单的逆变电路…

查看全部问答>

多功能数码手套

这是专为I玩转T数码产品而设计的手套,这个皮手套在拇指、食指和中指上有特别设计。 拇指的指套是用魔术贴横向粘住的,当需要操作闹钟,不,手机等设备时,可以撕开,露出拇指,方便操作。食指的指套上就只是多了一层防滑皮 中指上则有一个小钮, ...…

查看全部问答>

问个比较弱的问题~

没有GUI的根文件系统,能不能使用中文?如果能怎么加?…

查看全部问答>

我有一个WINDOWS MOBILE的PDA,用的三星CPU,有高手能把这个系统改成WINCE.NET么?当然是要付费的,价钱商量.

我有一个WINDOWS MOBILE的PDA,用的三星CPU,有高手能把这个系统改成WINCE.NET么?当然是要付费的,价钱商量. 联系我QQ:86163938  MSN:myfm3a@hotmail.com 急…

查看全部问答>

风力发电机充电控制

400W风力发电机,需要做一个整流,充电电路,电池是24V100AH,请帮助!…

查看全部问答>

在已有数据的nor flash再次写入数据

在已有数据的nor flash再次写入数据,只是在其中的部分位置写入数据,给个例子最好了!!!…

查看全部问答>

udhcpd 分配ip 时如何处理 保留ip

    我用udhcpd 做为server端 来分配ip,请问 udhcpd 对保留地址如何处理,是写入udhcpd.leases 中吗?如果是以什么样的格式写入. 如果不是该如何处理? …

查看全部问答>

变频恒压供水的基本知识

一、变频恒压供水的特点1. 节能,可以实现节电20%-40%,能实现绿色用电。2. 占地面积小,投入少,效率高。3. 配置灵活,自动化程度高,功能齐全,灵活可靠。4. 运行合理,由于是软起和软停,不但可以消除水锤效应,而且电机轴 ...…

查看全部问答>