3092|5

11

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

利用msp430g2553做独立按键,出现问题,求教 [复制链接]

我用g2553做了四个独立的按键,希望没次按下一个键就用数码管显示相应的四位数,但是后来我发现按键只工作了一次就不在工作,后来发现时当中断发生后程序就死循环在display()函数里面了,怎么办?好像如果要用到动态扫描显示LED之后,中断执行一次后就死循环在动态扫描里面出不来了,大家有更好一点的方法吗?求教
程序:
/*
* main.c
*/
/********
程序功能:74hc595演示基本位选段选
入口参数:无
出口参数:P1.0 SHCLK   P1.1 wei   P1.2  duan   P1.3  STCLK    P1.4/P1.5/P1.6/P1.7为独立键盘的I/O口
*/
#include  
#define uchar unsigned char
unsigned seg[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x00,0xff};//0~9,以及全亮很全灭的段选
void delay()
{
        volatile float i=0;
        for(i=0;i<30;i++){}
}
void display(uchar first,uchar second,uchar third,uchar fourth)    //四位数的显示函数
{
        unsigned char wei,duan;
                unsigned int i;

                WDTCTL = WDTPW + WDTHOLD;   //关闭看看门狗
           P1DIR |= 0x0f;    // P1.0 ,P1.1 ,P1.2,p1.3输出
           while(1)   //动态扫描
           {
        //--------------------第1位LED-----------//
                   wei=0x10;      //可更改
                duan=seg[first];    //可更改
                for(i=0;i<8;i++)

                {
                        if((wei&0x80)==0x80)

                        P1OUT |=BIT1;
                        else
                                P1OUT &=~(BIT1);
                        wei<<=1;
                        if((duan&0x80)==0x80)
                                P1OUT |=BIT2;
                        else
                                P1OUT &=~(BIT2);
                        duan<<=1;
                        P1OUT |=BIT0;
                        P1OUT &=~(BIT0);
                        P1OUT &= ~(BIT3);
                        P1OUT |= BIT3;
                        P1OUT &= ~(BIT3);
                        //duan=0xff;
                }
                delay();
                //----------------第2位LED ----------------//
                           wei=0x20;      //可更改
                        duan=seg[second];    //可更改

                        for(i=0;i<8;i++)

                        {
                                if((wei&0x80)==0x80)

                                P1OUT |=BIT1;
                                else
                                        P1OUT &=~(BIT1);
                                wei<<=1;
                                if((duan&0x80)==0x80)
                                        P1OUT |=BIT2;
                                else
                                        P1OUT &=~(BIT2);
                                duan<<=1;
                                P1OUT |=BIT0;
                                P1OUT &=~(BIT0);
                                P1OUT &= ~(BIT3);
                                P1OUT |= BIT3;
                                P1OUT &= ~(BIT3);
                                //duan=0xff;


                        }
                        delay();
                        //----------------第3位LED ----------------//
                                   wei=0x40;      //可更改
                                duan=seg[third];    //可更改

                                for(i=0;i<8;i++)

                                {
                                        if((wei&0x80)==0x80)

                                        P1OUT |=BIT1;
                                        else
                                                P1OUT &=~(BIT1);
                                        wei<<=1;
                                        if((duan&0x80)==0x80)
                                                P1OUT |=BIT2;
                                        else
                                                P1OUT &=~(BIT2);
                                        duan<<=1;
                                        P1OUT |=BIT0;
                                        P1OUT &=~(BIT0);
                                        P1OUT &= ~(BIT3);
                                        P1OUT |= BIT3;
                                        P1OUT &= ~(BIT3);
                                        //duan=0xff;

                                }
                                delay();
                                //----------------第4位LED ----------------//
                                           wei=0x80;      //可更改
                                        duan=seg[fourth];    //可更改

                                        for(i=0;i<8;i++)

                                        {
                                                if((wei&0x80)==0x80)
                                                P1OUT |=BIT1;
                                                else
                                                        P1OUT &=~(BIT1);
                                                wei<<=1;
                                                if((duan&0x80)==0x80)
                                                        P1OUT |=BIT2;
                                                else
                                                P1OUT &=~(BIT2);
                                                duan<<=1;
                                                P1OUT |=BIT0;
                                                P1OUT &=~(BIT0);
                                                P1OUT &= ~(BIT3);
                                                P1OUT |= BIT3;
                                                P1OUT &= ~(BIT3);
                                                //duan=0xff;


                                        }
                                        delay();


        }
}

        


void  main()
        {
//-----------------------I/O口中断-----------------------------//
                WDTCTL = WDTPW+WDTHOLD;           
                P1DIR &= ~(BIT4+BIT5+BIT6+BIT7);
                P1IES |= BIT4+BIT5+BIT6+BIT7;
                P1IE |= BIT4+BIT5+BIT6+BIT7;
                _EINT();
                P1IFG=0;
                        return;
                //while(1);
        //PORT1_ISR();
        }
#pragma vector = PORT1_VECTOR   
__interrupt void PORT1_ISR(void)
{
        unsigned int i;
        unsigned char PushKey;
        PushKey=P1IFG & (BIT4+BIT5+BIT6+BIT7);
        for(i=0;i<1000;i++){};
        while(1)
        {
        if((P1IN & PushKey) == PushKey)
        {
                P1IFG=0;return;
        }       else
      {
        if(PushKey & BIT4)
                {
                display(10,10,10,10);
                }
        if(PushKey & BIT5)
                {
                display(0,1,7,8);
                }
        if(PushKey & BIT6)
                {
                display(5,6,0,0);
                }
        if(PushKey & BIT7)
                {
                display(1,4,7,8);
                }
        P1IFG=0;
        return;
        }
}
}


最新回复

你在中断里放个无限死循环,还想不死? 这样 1 声明 first, second, third, forth 为 volatile 全局变量 2 中断中只判断按键并给这四个变量赋值 3 主循环中定时轮流点亮四个数码管 程序问题多多,功力尚浅啊  详情 回复 发表于 2014-2-25 04:43
 
点赞 关注

回复
举报

154

帖子

3

TA的资源

一粒金砂(中级)

沙发
 
把显示程序拿到中断外面试试啊,中断中不要调用子函数,这样试试
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
淘料吧123 发表于 2014-2-20 12:28
我们 是专 门做 配 套 电子的,有什么不 懂或 者 需 要什么 请 联 系 我  们

你能帮我解决这个问题吗??
 
 
 

回复

5276

帖子

5

TA的资源

裸片初长成(中级)

4
 
把 display放到主程序中去呀,中断只赋键值
 
个人签名没工作,没女人老婆,没宽带 ,  没钱
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

5
 
wangfuchong 发表于 2014-2-20 21:05
把 display放到主程序中去呀,中断只赋键值

将中断中的display放到主函数中也别不行,只要显示display有死循环就不行了
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(中级)

6
 
你在中断里放个无限死循环,还想不死?
这样
1 声明 first, second, third, forth 为 volatile 全局变量
2 中断中只判断按键并给这四个变量赋值
3 主循环中定时轮流点亮四个数码管

程序问题多多,功力尚浅啊
 
 
 

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

开源项目 更多>>
    随便看看
    查找数据手册?

    EEWorld Datasheet 技术支持

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

     
    EEWorld订阅号

     
    EEWorld服务号

     
    汽车开发圈

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

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

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

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