社区导航

 
查看: 1262|回复: 4

[讨论] 求各位大神看看程序的缺点,还有怎么改进。。。。

[复制链接]

97

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-1-9 08:08:41 | 显示全部楼层 |阅读模式




/*设计项目:p1.1 p2.1按键产生中断
* 设计人员:
* 设计时间:2016.1.6
* 硬件描述:
* 软件描述:
* 说明:主程序执行外接流水灯,P1.1按键产生中断执行P4.7间隔闪亮,P2.1按键产生中断执行P1.0间隔闪亮
*/
#include <msp430.h>
#include"intrinsics.h"
unsigned char ledtable[]={BIT0,BIT2,BIT3,BIT4,BIT5,BIT6,BIT7};
unsigned int interrupt1,interrupt2,cycle;                                  //定义全局变量
/*
* main.c
*/
/**函数使用前声明*/
void cycles_led();
void GPIO_init();
/*
* 函数名:main函数
* 返回值:无
* 功能:程序执行主体:led依次循环点亮
* 说明:循环
*/
int main(void) {
WDTCTL = WDTPW | WDTHOLD;        // Stop watchdog timer
GPIO_init();
cycles_led();
return 0;
}

/*
* 函数名:cycles_led
* 出口参数:无
* 入口参数:无
* 功能:main执行死循环程序
* 说明:
*/
void cycles_led()
{
while(1)
  {
        for(cycle=0;cycle<7;cycle++)
        {
                P3OUT = ledtable[cycle];
            _delay_cycles(100000);
        }
  }
}
/*
* 函数名:GPIO_init
* 入口参数:无
* 出口参数:无
* 功能:端口初始化
* 说明:P2外接流水灯,P2.1按键下降沿触发中断,P1.1按键下降沿触发中断,P1.1,P4.7板载led
*/
void GPIO_init()
{
        P3DIR |= (BIT0+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7);//设置输出方向
        P3OUT =0X00;
        P1DIR |= BIT0;
        P1OUT |=BIT0;
        P4DIR |= BIT7;
        P4OUT |=BIT7;

        P1OUT = BIT0;                                  //输出端置位
        P3OUT =(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7);
        P4OUT = BIT7;

        P2REN |=BIT1;//配置上拉电阻
        P2OUT |= BIT1;
        P1REN |= BIT1;
        P1OUT |=BIT1;


        P1IES |= BIT1; //下降沿触发中断
        P1IFG &= ~BIT1;//中断标志位


        P2IES |= BIT1;
        P2IFG &= ~BIT1;
        P1IE |= BIT1;  //中断使能
        P2IE |= BIT1;
        //P1DS = 0XFF;
        //P2DS = 0XFF;
        //P2IFG &= ~BIT1;
        //P1IFG &= ~BIT1;
        __bis_SR_register(GIE);    //中断总允许    休眠模式
}
/*
* 函数名:中断服务程序1
* 入口参数:
* 出口参数:
* 功能:
* 说明:
*/
#pragma  vector = PORT1_VECTOR
interrupt void PORT1(void)
{    P1IFG &= ~BIT1;
        for(interrupt1=0;interrupt1<3;interrupt1++)
        {
     P4OUT |= BIT7;
        _delay_cycles(100000);
        P4OUT &= ~BIT7;
        _delay_cycles(100000);
        }
                  //P1.1中断标志位清除
}
/*
* 函数名:中断服务程序2
* 入口参数:
* 出口参数:
* 功能:
* 说明:
*/
#pragma vector = PORT2_VECTOR  //NAME
interrupt void PORT2(void)
{
        P2IFG &= ~BIT1;
        for(interrupt2=0;interrupt2<3;interrupt2++)
   {
        P1OUT |= BIT0;
    _delay_cycles(100000);
    P1OUT &= ~BIT0;
    _delay_cycles(100000);
   }
}


此帖出自电子竞赛论坛
更多信息请关注微博:晴天reg


回复

使用道具 举报

1020

TA的帖子

1

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2017-1-9 10:12:29 | 显示全部楼层
中断服务程序里不要有延时,可以设置标志位,main函数内部循环查询标志位置位情况进行判断,进而执行你的任务,相当于刷新,main/while,建议开一个定时器,也是置位标志,循环里就可以当做参考周期了
没时间解释辣么多了,快上车!!!


回复

使用道具 举报

527

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2017-1-9 11:26:30 | 显示全部楼层
在中断里面用延时 这个是大忌

点评

就是中断程序里要尽量简单,执行完之后要尽量回到主程序。  详情 回复 发表于 2017-1-10 11:20


回复

使用道具 举报

3602

TA的帖子

11

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

发表于 2017-1-9 20:48:04 | 显示全部楼层
中断函数执行时间要短,只需要对少数几个变量赋值。主程序根据变量值得变化,就知道产生了哪个中断,执行对应程序。要延时,可以在主函数里,这也不太好,最好有计数变量。根据这个值的变化,结合中断信息,去改变io的状态。


回复

使用道具 举报

97

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-1-10 11:20:17 | 显示全部楼层
yl20084784 发表于 2017-1-9 11:26
在中断里面用延时 这个是大忌

就是中断程序里要尽量简单,执行完之后要尽量回到主程序。
更多信息请关注微博:晴天reg


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-12-17 18:20 , Processed in 0.184154 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表