慢慢懂 发表于 2013-3-29 22:49:18

帮忙看下这个矩阵键盘程序错在那里!

#ifndef HL_KEY
#define HL_KEY
#include "msp430f5525.h"
#define uchar unsigned char
uchar key_vol;
uchar key_map[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
uchar check_KEY()          //检查是否有键按下
{
P1DIR=0Xf0;               //定义PI.0~3为输入,P1.4~7为输出模式
uchar row,col,temp1,temp2;
temp1=0x80;
for(row=0;row<4;row++)
{
    P1OUT-=0x0f;
    P1OUT-=temp1;
    temp1>>=1;
    if(P1IN&0X0f<0X0f)
    {
      temp2=0x08;
      for(col=0;col<4;col++)
      {
      if((P1IN&temp2)==0x00)
      {
          key_vol=key_map;
      }
          temp2>>=1;
      }      
    }
    else
      key_vol=key_map;
}
return(key_vol);
}

void DelayMs(uchar a)          //1ms延时函数
{
        int i;
        for(i = a;i>0;i--)
                __delay_cycles(1000);
}
#endif

longwu537 发表于 2013-3-29 23:23:31

看你程序是线翻转法检测按键,但是你这样貌似仅能得到按键所在的列并不能得到按键所在的行。不过你程序中还有两句没看懂,我再推敲一下啊

慢慢懂 发表于 2013-3-29 23:40:11

longwu537 发表于 2013-3-29 23:23 static/image/common/back.gif
看你程序是线翻转法检测按键,但是你这样貌似仅能得到按键所在的列并不能得到按键所在的行。不过你程序中还 ...

我写的是能检测出每个按键的

longwu537 发表于 2013-3-29 23:48:14

那你问题出在哪啊?还有没看明白P1OUT-=0x0f;
    P1OUT-=temp1;这两句也没看到消抖

慢慢懂 发表于 2013-3-30 00:26:37

longwu537 发表于 2013-3-29 23:48 static/image/common/back.gif
那你问题出在哪啊?还有没看明白P1OUT-=0x0f;
    P1OUT-=temp1;这两句也没看到消抖 ...

这里写错了,现在改成这样了,但还是有问题#ifndef HL_KEY
#define HL_KEY
#include "msp430f5525.h"
#define uchar unsigned char
uchar key_vol;
uchar key_map[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
uchar check_KEY()          //检查是否有键按下
{
P1DIR=0Xf0; //定义PI.0~3为输入,P1.4~7为输出模式
//P1OUT=0X00;
uchar row,col,temp1,temp2;
P1OUT-=0x0f;
if(P1OUT||0X00)
{
      temp1=0x80;
      for(row=0;row<4;row++)
      {
//    P1OUT-=0x0f;
      if(P1OUT&temp1!=0)
         {
//         P1OUT&=temp1;
//         temp1>>=1;
         if(P1IN&0X0f<0X0f)
         
            temp2=0x08;
             for(col=0;col<4;col++)
            {
                if((P1IN&temp2)==0x00)
               {
                  key_vol=key_map;
                  }
               temp2>>=1;
               }      
          }
          temp1>>=1;
       }
//   else
//   key_vol=key_map;
}
    else
      key_vol=key_map;
return(key_vol);
}

void DelayMs(uchar a)          //1ms延时函数
{
        int i;
        for(i = a;i>0;i--)
                __delay_cycles(1000);
}
#endif

慢慢懂 发表于 2013-3-30 00:46:02

longwu537 发表于 2013-3-29 23:48 static/image/common/back.gif
那你问题出在哪啊?还有没看明白P1OUT-=0x0f;
    P1OUT-=temp1;这两句也没看到消抖 ...

你再看看这这个程序#ifndef HL_KEY
#define HL_KEY
#include "msp430f5525.h"
#define uchar unsigned char
uchar key_vol;
uchar key_map[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

void DelayMs(uchar a)          //1ms延时函数
{
        int i;
        for(i = a;i>0;i--)
                __delay_cycles(1000);
}

uchar check_KEY()          //检查是否有键按下
{
P1DIR=0Xf0; //定义PI.0~3为输入,P1.4~7为输出模式
//P1OUT=0X00;
uchar row,col,temp1,temp2;
P1OUT-=0x0f;
if(P1OUT||0X00)
{
      DelayMs(20);
    if(P1OUT||0X00)
    {
      temp1=0x80;
      for(row=0;row<4;row++)
      {
//    P1OUT-=0x0f;
      if(P1OUT&temp1!=0)
         {
//         P1OUT&=temp1;
//         temp1>>=1;
         if(P1IN&0X0f<0X0f)
         {
            temp2=0x08;
             for(col=0;col<4;col++)
            {
                if((P1IN&temp2)==0x00)
               {
                  key_vol=key_map;
                  }
               temp2>>=1;
               }
         }
          }
          temp1>>=1;
       }
//   else
//   key_vol=key_map;
}
}
    else
      key_vol=key_map;
return(key_vol);
}

#endif

longwu537 发表于 2013-3-30 08:17:15

慢慢懂 发表于 2013-3-30 00:46
你再看看这这个程序#ifndef HL_KEY
#define HL_KEY
#include "msp430f5525.h"


感觉程序写的离谱了。完全不知道你想表达什么意思了,你说有错是什么形式的错误?具体表现是什么?你描述清楚了,才更方便找到问题。

慢慢懂 发表于 2013-3-30 08:33:03

按键没反应

longwu537 发表于 2013-3-30 08:40:08

线翻转法是先高四位输出低四位输入,扫描一遍后交换,再扫描一次,然后综合两次结果得出按键号。你只做了一半,看你的程序你按第四行第四列的按键可能会有反应

慢慢懂 发表于 2013-3-30 20:05:19

那我还是分两步来写按键吧
页: [1]
查看完整版本: 帮忙看下这个矩阵键盘程序错在那里!