[求助] 新手求教~、~

plan041   2012-6-22 21:36 楼主
购置了一个MSP430F149、
本来想自己制作一个电容触控板的……
结果没做出来、不太看得明白TI提供的库文件、有时间再慢慢参悟。
所以改做了一个电容触控输出高低电平的、按下按键输出高电平。
外设做好了、单片机编程不知道什么地方出问题了、功能依然没实现……
请各位高手指点一下

第一段代码是随机子附赠的学习资料测试代码:

//测试说明:按动S1~S4三个按键,观察LED显示
#include

#define keyin    (P1IN & 0x0f)      //这个地方不太明白PxIN &0xXX的功能。


void delay(void);

/********************主函数********************/
void main( void )
{
    unsigned char temp;
   
    WDTCTL = WDTPW + WDTHOLD;   //关闭看门狗
    //P1REN=0XFF;
   
    P1DIR = 0xf0;               //设置P1.0~P1.4为输入状态   
    P2DIR = 0xff;
    P2OUT = 0xff;
    while(1)
    {
        if(keyin != 0x0f)       //键值有改变
        {
            delay();            //延时消抖
            if(keyin != 0x0f)   //再次检测按键状态
            {   
                temp=keyin;
               
                while(keyin != 0x0f);   //等待按键被放开
                switch(temp)    //转换键值   
                {
                case 0x0e:
                            P2OUT = 0xfe;break;
                case 0x0d:
                            P2OUT = 0xfd;break;
                case 0x0b:
                            P2OUT = 0xfb;break;
                case 0x07:
                            P2OUT = 0xf7;break;
                default:
                            P2OUT = 0xff;break;
                }
                delay();delay();delay();delay();delay();delay();delay();delay();
            }
        }
    }
}
void delay(void)
{
    unsigned int tmp;
   
    for(tmp = 12000;tmp > 0;tmp--);
}
测试代码所测试的是I/O口低电平检测并输出,进行小改动后试图使其具备检测搞定平并输出的功能
几处注释小不明白的地方可能是导致程序失误的地方、望指明

#include

#define keyin    (P1IN & 0x00)    //个人理解改动表示后为初始状态为低电平后进行检测、望指正

void delay(void);

/********************主函数********************/
void main( void )
{
    unsigned char temp;
   
    WDTCTL = WDTPW + WDTHOLD;   //关闭看门狗
    //P1REN=0XFF;
   
     P1DIR = 0xf0;               //设置P1.0~P1.4为输入状态
   //不明白为什么设置成这样后 P1.5 P1.7测得电压为3.27V P1.6 P1.8测得电压为0.01V 不是应该都为高电平3.3V输出么?   
    P2DIR = 0xff;
    P2OUT = 0xff;
    while(1)
    {
        if(keyin != 0x00)       //键值有改变
        {
            delay();            //延时消抖
            if(keyin != 0x00)   //再次检测按键状态
            {   
                temp=keyin;
               
                while(keyin != 0x00);   //等待按键被放开
                switch(temp)    //转换键值   
                {
                case 0x01:
                            P2OUT = 0xfe;break;
                case 0x02:
                            P2OUT = 0xfd;break;
                case 0x04:
                            P2OUT = 0xfb;break;
                case 0x08:
                            P2OUT = 0xf7;break;
                default:
                            P2OUT = 0xff;break;
                }
                delay();delay();delay();delay();delay();delay();delay();delay();
            }
        }
    }
}

void delay(void)
{
    unsigned int tmp;
   
    for(tmp = 12000;tmp > 0;tmp--);
}

回复评论 (4)

1、#define keyin (P1IN & 0x0f) //这个地方不太明白PxIN &0xXX的功能。
     答:取得P1口低四位的电平。你修改后恒为0.是错的
2、P1DIR = 0xf0; //设置P1.0~P1.4为输入状态
//不明白为什么设置成这样后 P1.5 P1.7测得电压为3.27V P1.6 P1.8测得电压为0.01V 不是应该都为高电平3.3V输出么?
     答,没有明确输出高低电平时为初始或随机状态。
3、你想要指示高电平状态即按键高电平时对应灯亮可以把while(1)里面改成这样
if(keyin != 0x0f) //键值有改变
{
  delay(); //延时消抖
  if(keyin != 0x0f) //再次检测按键状态
  { 
    temp=keyin; 
    P2OUT|=temp;
  }
 }
else 
  P2OUT&=0xF0;

点赞  2012-6-22 22:34

回复 沙发 shower.xu 的帖子

不好意思、 之前考试一直没回复。
1.2的回答明白了、
可是3的情况  就是换成
    temp=keyin;
    P2OUT|=temp;
也是没有接受到信号、进而改变的。
虽然后来用中断完成了按键、可是还是不太明白这样为什么不行。
还是说、MSP430与C51是一样的、只能接受低电平变化的信号呢?
点赞  2012-6-25 10:28
引用: 原帖由 plan041 于 2012-6-25 10:28 发表 不好意思、 之前考试一直没回复。 1.2的回答明白了、 可是3的情况 就是换成 temp=keyin; P2OUT|=temp; 也是没有接受到信号、进而改变的。 虽然后来用中断完成了按键、可是还是不太明白这样为什么不行 ...

普通IO口可以接受高低电平是肯定的,51都可以啊,你又不是用中断要选择上升或下降沿。
你可以设个断点在这里P2OUT|=temp;  看看temp的值。
还有啊,你要把你#define keyin (P1IN & 0x00) 这个修复过来才试啊。
点赞  2012-6-25 11:58

回复 4楼 shower.xu 的帖子

51是可以接收高低电平、但是只能在高电平转低电平变化的时候才能接受作用吧……
理论上既然低电平可以、高电平也是可以的、但是却是不明白为什么不行。
#define keyin (P1IN & 0x00) 已经修复回#define keyin (P1IN & 0x0F) 了的。
我按下键时候、 接口的电平实测是已经变化成高电平了。
可是temp值因为没有仿真不知道是否已经改变,但根据灯的亮灭知道应该是没有接受到信号的吧……。
中断用上升沿后来可以实现。
点赞  2012-6-25 12:31
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复