2548|4

98

帖子

0

资源

一粒金砂(中级)

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





/*设计项目:p1.1 p2.1按键产生中断
* 设计人员:
* 设计时间:2016.1.6
* 硬件描述:
* 软件描述:
* 说明:主程序执行外接流水灯,P1.1按键产生中断执行P4.7间隔闪亮,P2.1按键产生中断执行P1.0间隔闪亮
*/
#include
#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);
   }
}


此帖出自电子竞赛论坛
个人签名

More information,please add the weibo ID :_Tang辉,chat number :951141617


回复

1293

帖子

3

资源

一粒金砂(高级)

中断服务程序里不要有延时,可以设置标志位,main函数内部循环查询标志位置位情况进行判断,进而执行你的任务,相当于刷新,main/while,建议开一个定时器,也是置位标志,循环里就可以当做参考周期了
个人签名

RTEMS


回复

539

帖子

0

资源

纯净的硅(初级)

在中断里面用延时 这个是大忌

点评

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

回复

3652

帖子

11

资源

五彩晶圆(高级)

中断函数执行时间要短,只需要对少数几个变量赋值。主程序根据变量值得变化,就知道产生了哪个中断,执行对应程序。要延时,可以在主函数里,这也不太好,最好有计数变量。根据这个值的变化,结合中断信息,去改变io的状态。

回复

98

帖子

0

资源

一粒金砂(中级)

yl20084784 发表于 2017-1-9 11:26
在中断里面用延时 这个是大忌

就是中断程序里要尽量简单,执行完之后要尽量回到主程序。
个人签名

More information,please add the weibo ID :_Tang辉,chat number :951141617


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

关闭
站长推荐上一条 1/4 下一条

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表