Randy 发表于 2012-7-18 09:27:22

【大赛原创经验贴】正确理解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]
查看完整版本: 【大赛原创经验贴】正确理解PxIN输入寄存器,很重要!