大连创客空间

 找回密码
 立即注册吧!

QQ登录

只需一步,快速开始

一键登录:

搜索
查看: 4829|回复: 24
收起左侧

【大赛原创经验贴】P1口中断控制P2口LED灯点亮

[复制链接]
发表于 2012-7-11 19:15:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多交流,硬件的世界向你敞开大门!

您需要 登录 才可以下载或查看,没有帐号?立即注册吧!

x
本人想用P1口的中断控制P2口的LED灯
#include <msp430x24x.h>
#define uchar unsigned char
#define uint unsigned int
uchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar key;

void delay(int v)   //延时
{
  while(v!=0)
    v--;
}
void main()
{
  WDTCTL=WDTPW+WDTHOLD;
  P1DIR=0X00;
  P2DIR=0XFF;
  P1IFG=0X00;
  P1IES=0XFF;
  P1IE=0XFF;
  P2OUT=0XFF;
  _EINT();
  while(1)
  {
    P2OUT=table[key];
  }
}
#pragma vector=PORT1_VECTOR
__interrupt void timer()
{
  uchar temp;
  delay(2666);
  if((P1IN&0XFF)==0XFF)//判断是否有中断
  {
    temp=P1IFG;
    switch(temp)
    {
    case 1  :key=0 ;break;
    case 2  :key=1 ;break;
    case 4  :key=2 ;break;
    case 8  :key=3 ;break;
    case 16 :key=4 ;break;
    case 32 :key=5 ;break;
    case 64 :key=6 ;break;
    case 128:key=7 ;break;
    }
  }
  P1IFG=0X00;
}
通过单片机和protues仿真,按键按下没反应,一直是这种状态,求高手指教
图像 1.png


回复

使用道具 举报

发表于 2012-7-11 20:09:19 手机频道 | 显示全部楼层
中断进入了吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-12 07:36:13 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2012-7-12 07:59:34 | 显示全部楼层
把P1IFG换成P1IN试试

点评

为什么 你开始就会想到 把P1IFG换成P1IN ?  详情 回复 发表于 2012-7-21 11:18
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-12 08:03:36 | 显示全部楼层
Friday 发表于 2012-7-12 07:59
把P1IFG换成P1IN试试

还是不行啊,我之前这样弄过
回复 支持 反对

使用道具 举报

发表于 2012-7-12 08:12:35 | 显示全部楼层
522592505 发表于 2012-7-12 08:03
还是不行啊,我之前这样弄过

我自己亲自试试吧,功力不行,只是看,还真没看出什么。
回复 支持 反对

使用道具 举报

发表于 2012-7-12 08:19:23 | 显示全部楼层
522592505 发表于 2012-7-12 08:03
还是不行啊,我之前这样弄过

if判断错了,是“不等于”
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-12 08:36:28 | 显示全部楼层
Friday 发表于 2012-7-12 08:19
if判断错了,是“不等于”

是这样的吗?我的怎么还是不行啊,能把你的程序给我看看吗?真是十分感谢你的解答啊
#include <msp430x14x.h>
#define uchar unsigned char
#define uint  unsigned int

uchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar key;


void delay(int v)
{
  while(v!=0)
    v--;
}

void main()
{
  WDTCTL=WDTPW+WDTHOLD;
  P1DIR=0X00;
  P2DIR=0XFF;
  P1IFG=0X00;
  P1IES=0XFF;
  P1SEL=0XFF;
  P1IE=0XFF;
  P2OUT=0XFF;
  _EINT();
  while(1)
  {
    P2OUT=table[key];
  }
}

#pragma vector=PORT1_VECTOR
__interrupt void timer()
{
  uchar temp;
  delay(2666);
  if((P1IN&0XFF)!=0XFF)
  {
    temp=P1IFG;
    switch(temp)
    {
    case 1  :key=0 ;break;
    case 2  :key=1 ;break;
    case 4  :key=2 ;break;
    case 8  :key=3 ;break;
    case 16 :key=4 ;break;
    case 32 :key=5 ;break;
    case 64 :key=6 ;break;
    case 128:key=7 ;break;
    }
  }
  P1IFG=0X00;
}
回复 支持 反对

使用道具 举报

发表于 2012-7-12 08:47:18 | 显示全部楼层
#include <msp430x14x.h>
#define uchar unsigned char
#define uint  unsigned int

uchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar key=0;


void delay(int v)
{
  while(v!=0)
    v--;
}

void main()
{
  WDTCTL=WDTPW+WDTHOLD;
  P1DIR=0X00;
  P2DIR=0XFF;
  P1IFG=0X00;
  P1IES=0XFF;
  P1IE=0XFF;
  P2OUT=0XFF;
  _EINT();
  while(1)
  {
    P2OUT=table[key];
  }
}

#pragma vector=PORT1_VECTOR
__interrupt void timer()
{
  uchar temp;
  delay(2666);
  if((P1IFG&0XFF)!=0XFF)
  {
    temp=P1IFG;
    switch(temp)
    {
    case 1  :key=0 ;break;
    case 2  :key=1 ;break;
    case 4  :key=2 ;break;
    case 8  :key=3 ;break;
    case 16 :key=4 ;break;
    case 32 :key=5 ;break;
    case 64 :key=6 ;break;
    case 128:key=7 ;break;
    }
  }
  P1IFG=0X00;
}
回复 支持 反对

使用道具 举报

发表于 2012-7-12 08:48:22 | 显示全部楼层
Friday 发表于 2012-7-12 08:47
#include
#define uchar unsigned char
#define uint  unsigned int

你发着发着就多了一句P1SEL了,最开始应该就只有if的问题吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-12 08:53:24 | 显示全部楼层
非常感谢!感动啊,非常感谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-12 08:58:30 | 显示全部楼层
Friday 发表于 2012-7-12 08:48
你发着发着就多了一句P1SEL了,最开始应该就只有if的问题吧。

非常感谢!感动啊,非常感谢!不过我还有一个问题啊,为什么程序开始没有任何键按下,P2.0口的灯就是亮的?

点评

你也可以在数组里加个0xff 然后把key的值赋值为8 就可以解决  详情 回复 发表于 2012-7-21 21:58
回复 支持 反对

使用道具 举报

发表于 2012-7-12 09:02:05 | 显示全部楼层
522592505 发表于 2012-7-12 08:58
非常感谢!感动啊,非常感谢!不过我还有一个问题啊,为什么程序开始没有任何键按下,P2.0口的灯就是亮的 ...

P2OUT=table【key】,key=0,自然你最初就把第一个灯点亮了!
自己好好理解消化。
回复 支持 反对

使用道具 举报

发表于 2012-7-12 09:02:21 | 显示全部楼层
522592505 发表于 2012-7-12 08:58
非常感谢!感动啊,非常感谢!不过我还有一个问题啊,为什么程序开始没有任何键按下,P2.0口的灯就是亮的 ...

P2OUT=table【key】,key=0,自然你最初就把第一个灯点亮了!
自己好好理解消化。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-12 09:09:20 | 显示全部楼层
Friday 发表于 2012-7-12 09:02
P2OUT=table【key】,key=0,自然你最初就把第一个灯点亮了!
自己好好理解消化。 ...

哦哦!知道了,key不应该赋值的,非常感谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-12 09:27:57 | 显示全部楼层
522592505 发表于 2012-7-12 09:09
哦哦!知道了,key不应该赋值的,非常感谢

key不赋初值也是一开始P2.0的灯就亮,我想变量没赋初值默认的key也等于0吧,所以我就一开始就把key赋
为9,循环里面改为这样
  while(1)
  {     while(key==0|key==1|key==2|key==3)//只有4个按键,呵呵
    P2OUT=table[key];
  }
}

回复 支持 反对

使用道具 举报

发表于 2012-7-12 09:32:50 | 显示全部楼层
522592505 发表于 2012-7-12 09:27
key不赋初值也是一开始P2.0的灯就亮,我想变量没赋初值默认的key也等于0吧,所以我就一开始就把key赋
为9 ...

大部分初始值都默认为零的,我碰到过特殊的情况,所以就算明知道默认为零,我也会加个0为了程序更稳定。当然默认为零,我并不意外!
回复 支持 反对

使用道具 举报

发表于 2012-7-20 22:59:07 | 显示全部楼层
楼主怎么将程序放到PROTUS里面的啊??IAR 没.HEX文件啊!!求指导??

点评

有啊 http://group.ednchina.com/GROUP_MES_14595_673_11084.HTM?jumpto=view_welcomead_1342839897995 你看看这个网址吧 上面很清楚  详情 回复 发表于 2012-7-21 11:06
回复 支持 反对

使用道具 举报

发表于 2012-7-21 11:06:17 | 显示全部楼层
星空行风 发表于 2012-7-20 22:59
楼主怎么将程序放到PROTUS里面的啊??IAR 没.HEX文件啊!!求指导??

有啊   http://group.ednchina.com/GROUP_ ... omead_1342839897995   你看看这个网址吧 上面很清楚
回复 支持 反对

使用道具 举报

发表于 2012-7-21 11:18:00 | 显示全部楼层
Friday 发表于 2012-7-12 07:59
把P1IFG换成P1IN试试

为什么 你开始就会想到 把P1IFG换成P1IN  ?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册吧!

本版积分规则

单片机开发者1群:235808606;会员QQ 6群:254085994; 1群:12835691(满); 2群:121061287(满); 3群:237320668(满);4群:249652919(满);5群:253578883(满);大赛1群:187926790(满),2群:231577758(满),3群:249652919(满)。 TI杯4群:58129202(满)。
载入中

QQ|手机版|小黑屋|Archiver|大连创客空间 ( 辽ICP备15004617号-2  

GMT+8, 2017-3-1 00:47 , Processed in 0.251163 second(s), 29 queries .

地址:辽宁省大连市高新园区火炬路7号17层 QQ:2401085253

Copyright © 2010-2015 创客空间(大连)科技有限公司 All Rights Reserved.

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