3920|4

69

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

求各位大神看看程序的缺点,还有怎么改进。。。。 [复制链接]





/*设计项目: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);
   }
}


此帖出自电子竞赛论坛

最新回复

中断函数执行时间要短,只需要对少数几个变量赋值。主程序根据变量值得变化,就知道产生了哪个中断,执行对应程序。要延时,可以在主函数里,这也不太好,最好有计数变量。根据这个值的变化,结合中断信息,去改变io的状态。  详情 回复 发表于 2017-1-9 20:48
点赞 关注
个人签名

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

 
 

回复
举报

1310

帖子

3

TA的资源

一粒金砂(高级)

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

RTEMS

 
 
 

回复

483

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
在中断里面用延时 这个是大忌
此帖出自电子竞赛论坛

点评

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

回复

3471

帖子

11

TA的资源

五彩晶圆(高级)

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

回复

69

帖子

0

TA的资源

一粒金砂(中级)

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

就是中断程序里要尽量简单,执行完之后要尽量回到主程序。
此帖出自电子竞赛论坛
个人签名

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

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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