5403|17

36

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

MPS430g2553用开关控制LED灯闪烁 [复制链接]

#include

int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  P1DIR |= BIT6+BIT0;         //P1。6,P1.0为输出
  P1OUT &=~ BIT3;
  while(1);
  {
    P1OUT |=BIT6+BIT0;          //P1.6,P1.0为高电位
    if(BIT3)
    {
      P1DIR ^= BIT6+BIT0;
    }
  }
}

这个程序运行时,开始时两个灯同时亮的,按下开关后两个灯同时灭,然后开关就不能再控制了,初学者求各位大神指教

最新回复

学学习习,  详情 回复 发表于 2015-7-10 06:09
 
点赞 关注

回复
举报

35

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
开关控制有两种办法,一是把开关设为中断,每次按下开关,产生中断,在中断程序中翻转电平。
而是轮询开关键位引脚,一旦按下开关产生电平变化时,翻转电平。你只询问BIT3是无法实现的,这里可以改为:
if (P1IN & BIT3),此句意思为,p1的3号引脚电平为高是有效。
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
谢谢谢谢分享
 
 
 

回复

1800

帖子

0

TA的资源

五彩晶圆(初级)

4
 
问题还是处在延时上,你这样写很有可能会导致led快速不断的反转,这样的速度肉眼是看不到的
 
 
 

回复

36

帖子

0

TA的资源

一粒金砂(初级)

5
 
msp430_now 发表于 2015-7-9 03:48
开关控制有两种办法,一是把开关设为中断,每次按下开关,产生中断,在中断程序中翻转电平。
而是轮询开关 ...

但是改过之后还是只能控制一次,并没有起到用开关控制LED灯的闪烁
 
 
 

回复

36

帖子

0

TA的资源

一粒金砂(初级)

6
 
sint27 发表于 2015-7-9 08:10
问题还是处在延时上,你这样写很有可能会导致led快速不断的反转,这样的速度肉眼是看不到的

不是不断翻转,而是只能控制一次,请教大神怎么搞?

点评

你有没有想过假如BIT3一直是高电平,会怎样? 虽然一直在翻转,但是那个频率肉眼是观察不到的,可能会变成半亮不亮的样子 我觉得你要是有例程还是先从例程上学起,很多单片机控制的基本思维和原理要先有个大概了解  详情 回复 发表于 2015-7-9 09:03
 
 
 

回复

36

帖子

0

TA的资源

一粒金砂(初级)

7
 

不不不,这个程序还有问题,并不成熟
 
 
 

回复

1800

帖子

0

TA的资源

五彩晶圆(初级)

8
 
曲尽,莫分離 发表于 2015-7-9 08:47
不是不断翻转,而是只能控制一次,请教大神怎么搞?

你有没有想过假如BIT3一直是高电平,会怎样?
虽然一直在翻转,但是那个频率肉眼是观察不到的,可能会变成半亮不亮的样子
我觉得你要是有例程还是先从例程上学起,很多单片机控制的基本思维和原理要先有个大概了解。
 
 
 

回复

36

帖子

0

TA的资源

一粒金砂(初级)

9
 
sint27 发表于 2015-7-9 09:03
你有没有想过假如BIT3一直是高电平,会怎样?
虽然一直在翻转,但是那个频率肉眼是观察不到的,可能会变 ...

你那里有例程没有?

点评

https://download.eeworld.com.cn/eewsearcher?ch=0&subch=0&rest=0&credits=0&kw=MSP430G2553 我只能帮你到这了,下载中心很多  详情 回复 发表于 2015-7-9 09:55
 
 
 

回复

1800

帖子

0

TA的资源

五彩晶圆(初级)

10
 

https://download.eeworld.com.cn/ ... ts=0&kw=MSP430G2553
我只能帮你到这了,下载中心很多
 
 
 

回复

36

帖子

0

TA的资源

一粒金砂(初级)

11
 
sint27 发表于 2015-7-9 09:55
https://download.eeworld.com.cn/eewsearcher?ch=0&subch=0&rest=0&credits=0&kw=MSP430G2553
我只能帮 ...

恩恩,谢谢
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

12
 
按下按键你修改IO方向干嘛?应该修改IO输出才是呀!
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

13
 
#include

int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  P1DIR |= BIT6+BIT0;         //P1。6,P1.0为输出
  P1OUT &=~ BIT3;
  while(1);
  {
    P1OUT |=BIT6+BIT0;          //P1.6,P1.0为高电位每个循环都将输出置高
    if(BIT3)//当按键按住的时候
    {
      P1DIR ^= BIT6+BIT0;//改变输入/输出方向
    }
  }
}
 
 
 

回复

36

帖子

0

TA的资源

一粒金砂(初级)

14
 
qiushenghua 发表于 2015-7-9 13:12
#include

int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDT ...

怎么改?
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

15
 
#include

int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  P1DIR |= BIT6+BIT0;         //P1。6,P1.0为输出
  P1OUT &=~ BIT3;  
P1OUT |=BIT6+BIT0;          //P1.6,P1.0为高电位每个循环都将输出置高

unsigned char Key=P1IN&BIT3;//存起上一次的键值
  while(1);
  {


    if((Key^(P1IN&BIT3))&(P1IN&BIT3))//上次与本次键值不同,且本次键值为按下的时候(即按键按下的时候)

    {
      P1OUT ^= BIT6+BIT0;//改变输入/输出电平
    }

     Key=P1IN&BIT3;//将本次按键键值存起来
  }
}
 
 
 

回复

35

帖子

0

TA的资源

一粒金砂(中级)

16
 
我一般喜欢用中断来实现

#include

unsigned int blink = 0;

int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  P1DIR |= (BIT0 + BIT6);         //P1.6,P1.0为输出
  P1OUT &=~ (BIT0 + BIT6);         //P1.6,P1.0输出低电平

  P1REN |= BIT3;                   //内部拉高电阻使能
  P1OUT |= BIT3;                  //输出高电平
  P1IES |= BIT3;                   //按下按钮为启动
   P1IE |= BIT3;                   //按钮设为中断

__enable_interrupt();           //中断使能
  while(1);
  {
   if ( blink > 0 )
{
P1OUT ^= (BIT0 + BIT1);

__delay_cycles(100000);
}
  }

// Port 1 interrupt service routine
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
blink ^= 0x01;
P1IFG &= ~BIT3;  // P1.3 中断标志清除
P1OUT&= ~(BIT0 + BIT1); // 输出低电平
}

根据这个例子你可以写出很多延伸,还能对中断有初步了解
 
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

17
 
学学习习,
 
 
 

回复

36

帖子

0

TA的资源

一粒金砂(初级)

18
 
msp430_now 发表于 2015-7-10 03:14
我一般喜欢用中断来实现

#include

unsigned int blink = 0;

int main( void )
{
  // Stop wat ...

谢谢你
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表