在给Launchpad写程序的时候发现一个比较有意思的问题。如下图
P1.3为一个
按键
P1.0 P1.6分别是两个
LED
参照一下官方给出的
原理图
然后......我就撸出了这么一段代码:
- #include "msp430g2553.h"
- void main(void)
- {
- WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
- P1DIR|= BIT0+BIT6;
- P1DIR&=~BIT3;
- P1REN=BIT3;
- while(1)
- {
- if(P1IN&BIT3)
- P1OUT=BIT0;
- else
- P1OUT=BIT6;
- }
- }
复制代码然而不管我怎么按都没变化。
然后我就在网上找找别人的程序看看了,我发现有一点不同,就是我看到某位同学,他把
P1OUT的BIT3也给置为1了。
然后,我就加上这个
BIT3:
- #include "msp430g2553.h"
- void main(void)
- {
- WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
- P1DIR|= BIT0+BIT6;
- P1DIR&=~BIT3;
- P1REN=BIT3;
- while(1)
- {
- if(P1IN&BIT3)
- P1OUT=BIT0+BIT3;
- else
- P1OUT=BIT6+BIT3;
- }
- }
复制代码说来神奇,竟然就这么好了,这下可以按下键另外的LED亮了,松开就又回来了。
那么...问题来了,明明给P1.3的I/O模式设置为输入了,按我的理解来说,P1OUT中的BIT3应该对结果无影响才对,但是事实上又不是如此,
难道说写按键程序的时候,I/O设置成输入,管脚悬空默认高阻态的情况下,P1IN会向P1OUT读取相应的值吗?
求各位替我解答下心中疑惑!
好像设置完内部电阻使能后,PxOUT =1是上拉,=0是下拉电阻
而且楼主操作其中一位时,不要改变其他位,置1则用或,置0则用与
时钟没配置,按默认的MCLK,SMCLK 1M,ACLK 32768
嗯,道理是这个道理,我就想着我只需要BIT3的上拉,就没有用| ,下面的控制LED如果要用上|的话,还得先把另一位给置0,所以我也没用,直接就=了,当然,在以后的编程中肯定还是少这样用的好, 毕竟是不好的习惯。
一周热门 更多>