极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10924|回复: 0

【大赛原创经验贴】正确理解PxIN输入寄存器,很重要!

[复制链接]
发表于 2012-7-18 09:27:22 | 显示全部楼层 |阅读模式
这几天一直在学习msp430g2553的片子,学习到今天我发现了一个很严重的问题。
我写了一个程序,其功能是通过按键点亮发光二极管,用查询的方式(中断方式是一样的,也得注意这个问题)。
四个独立按键,分别接的是P1.0~P1.3,作为输入端口。输出是P2.0~P2.3。假如按下P1.0端口接的按键,那么P2.0端口接的发光二极管就应该点亮。
好了,问题出来了。当写完程序以后,我发现不论怎么按下键盘,发光二极管都不会点亮。然后就是一步步调试(调试到很晚………………累死我了),我发现P1IN这个寄存器在我每次调试的时候都显示不一样的数值,有时候是0x06有时候又是0x1E。然后我翻出datasheet来查看这个寄存器复位以后的值,我看到的是……它写的是“-”这个东西,那就应该是随机的数值咯。
好了,问题简单了,那就是说,咱们给P1IN一个确定的数值就行咯。解决的办法就是,加一个上拉或者下拉电阻,让这个寄存器在复位以后保持一个确定的数值(哼,我看你再变……)。这样一来,程序就不会出错咯。其实用中断的方式是一样的,因为输入寄存器的数值不确定,你输入电平的时候,你也不知道是上升沿还是下降沿对吧,所以PxIFG的置位就是乱七八糟的。下面附上程序,写的不好,多多指教哈~~~
记住,把P1.0和P1.6的跳线帽拔下来哦!

上拉或者下拉电阻的阻值为10K,每个口都接一个(要用于输入的口就接,其他的就不用了)。
  1. //独立按键控制发光二极管的亮灭
  2. //           |----------------|
  3. //           |                   |
  4. //   - \-->|P1.0      P2.0|-->LED1
  5. //   - \-->|P1.1      P2.1|-->LED2
  6. //   - \-->|P1.2      P2.2|-->LED3
  7. //   - \-->|P1.3      P2.3|-->LED4
  8. //           |                   |
  9. #include<msp430g2553.h>
  10. void delay(void)
  11. {
  12.   int z;
  13.   for(z=12000;z>0;z--);
  14. }
  15. int key_scan()
  16. {
  17.   int keyin;
  18.   int temp;
  19.   keyin=P1IN&0x0f;//屏蔽高四位
  20.   if(keyin!=0x0f)
  21.   {
  22.     delay();
  23.     if(keyin!=0x0f)
  24.     {
  25.       switch(keyin)
  26.       {
  27.       case 0x0e:temp=1;break;
  28.       case 0x0d:temp=2;break;
  29.       case 0x0b:temp=3;break;
  30.       case 0x07:temp=4;break;
  31.       default:temp=0;break;
  32.       }
  33.     }
  34.   }
  35.   return temp;
  36. }
  37. void main()
  38. {
  39.   
  40.   WDTCTL=WDTPW+WDTHOLD;
  41.   int a;
  42.   BCSCTL2=SELM_3;//设置时钟为MCLK,外接32768Hz晶振
  43.   P2DIR|=0Xff;//设置P2为输出方向
  44.   P1DIR=0x00;
  45.   P2OUT|=0xff;//P2.0~P2.3输出高电平
  46.   while(1)
  47.   {
  48.     a=key_scan();
  49.     switch(a)
  50.     {
  51.     case 1: P2OUT^=BIT0;break;
  52.     case 2: P2OUT^=BIT1;break;
  53.     case 3: P2OUT^=BIT2;break;
  54.     case 4: P2OUT^=BIT3;break;
  55.     case 0: P2OUT=0x0f;break;
  56.     }
  57.   }
  58. }

复制代码
回复

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-5 21:26 , Processed in 0.058312 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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