【大赛原创经验贴】正确理解PxIN输入寄存器,很重要!
这几天一直在学习msp430g2553的片子,学习到今天我发现了一个很严重的问题。我写了一个程序,其功能是通过按键点亮发光二极管,用查询的方式(中断方式是一样的,也得注意这个问题)。
四个独立按键,分别接的是P1.0~P1.3,作为输入端口。输出是P2.0~P2.3。假如按下P1.0端口接的按键,那么P2.0端口接的发光二极管就应该点亮。
好了,问题出来了。当写完程序以后,我发现不论怎么按下键盘,发光二极管都不会点亮。然后就是一步步调试(调试到很晚………………累死我了),我发现P1IN这个寄存器在我每次调试的时候都显示不一样的数值,有时候是0x06有时候又是0x1E。然后我翻出datasheet来查看这个寄存器复位以后的值,我看到的是……它写的是“-”这个东西,那就应该是随机的数值咯。
好了,问题简单了,那就是说,咱们给P1IN一个确定的数值就行咯。解决的办法就是,加一个上拉或者下拉电阻,让这个寄存器在复位以后保持一个确定的数值(哼,我看你再变……)。这样一来,程序就不会出错咯。其实用中断的方式是一样的,因为输入寄存器的数值不确定,你输入电平的时候,你也不知道是上升沿还是下降沿对吧,所以PxIFG的置位就是乱七八糟的。下面附上程序,写的不好,多多指教哈~~~
记住,把P1.0和P1.6的跳线帽拔下来哦!
上拉或者下拉电阻的阻值为10K,每个口都接一个(要用于输入的口就接,其他的就不用了)。//独立按键控制发光二极管的亮灭
// |----------------|
// | |
// - \-->|P1.0 P2.0|-->LED1
// - \-->|P1.1 P2.1|-->LED2
// - \-->|P1.2 P2.2|-->LED3
// - \-->|P1.3 P2.3|-->LED4
// | |
#include<msp430g2553.h>
void delay(void)
{
int z;
for(z=12000;z>0;z--);
}
int key_scan()
{
int keyin;
int temp;
keyin=P1IN&0x0f;//屏蔽高四位
if(keyin!=0x0f)
{
delay();
if(keyin!=0x0f)
{
switch(keyin)
{
case 0x0e:temp=1;break;
case 0x0d:temp=2;break;
case 0x0b:temp=3;break;
case 0x07:temp=4;break;
default:temp=0;break;
}
}
}
return temp;
}
void main()
{
WDTCTL=WDTPW+WDTHOLD;
int a;
BCSCTL2=SELM_3;//设置时钟为MCLK,外接32768Hz晶振
P2DIR|=0Xff;//设置P2为输出方向
P1DIR=0x00;
P2OUT|=0xff;//P2.0~P2.3输出高电平
while(1)
{
a=key_scan();
switch(a)
{
case 1: P2OUT^=BIT0;break;
case 2: P2OUT^=BIT1;break;
case 3: P2OUT^=BIT2;break;
case 4: P2OUT^=BIT3;break;
case 0: P2OUT=0x0f;break;
}
}
}
页:
[1]