搜索
bottom↓
回复: 9

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

[复制链接]

出0入0汤圆

发表于 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[row*4+col+1];
        }
          temp2>>=1;
      }      
    }
    else
      key_vol=key_map[0];
  }
  return(key_vol);
}

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2013-3-29 23:23:31 来自手机 | 显示全部楼层
看你程序是线翻转法检测按键,但是你这样貌似仅能得到按键所在的列并不能得到按键所在的行。不过你程序中还有两句没看懂,我再推敲一下啊

出0入0汤圆

 楼主| 发表于 2013-3-29 23:40:11 | 显示全部楼层
longwu537 发表于 2013-3-29 23:23
看你程序是线翻转法检测按键,但是你这样貌似仅能得到按键所在的列并不能得到按键所在的行。不过你程序中还 ...

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

出0入0汤圆

发表于 2013-3-29 23:48:14 来自手机 | 显示全部楼层
那你问题出在哪啊?还有没看明白P1OUT-=0x0f;
    P1OUT-=temp1;这两句也没看到消抖

出0入0汤圆

 楼主| 发表于 2013-3-30 00:26:37 | 显示全部楼层
longwu537 发表于 2013-3-29 23:48
那你问题出在哪啊?还有没看明白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[row*4+col+1];
                  }
                 temp2>>=1;
               }      
          }
          temp1>>=1;
       }
//   else
//     key_vol=key_map[0];
  }
    else
      key_vol=key_map[0];
  return(key_vol);
}

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

出0入0汤圆

 楼主| 发表于 2013-3-30 00:46:02 | 显示全部楼层
longwu537 发表于 2013-3-29 23:48
那你问题出在哪啊?还有没看明白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[row*4+col+1];
                  }
                 temp2>>=1;
               }
           }
          }
          temp1>>=1;
       }
//   else
//     key_vol=key_map[0];
  }
  }
    else
      key_vol=key_map[0];
  return(key_vol);
}

#endif

出0入0汤圆

发表于 2013-3-30 08:17:15 来自手机 | 显示全部楼层
慢慢懂 发表于 2013-3-30 00:46
你再看看这这个程序#ifndef HL_KEY
#define HL_KEY
#include "msp430f5525.h"

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

出0入0汤圆

 楼主| 发表于 2013-3-30 08:33:03 | 显示全部楼层
按键没反应

出0入0汤圆

发表于 2013-3-30 08:40:08 来自手机 | 显示全部楼层
线翻转法是先高四位输出低四位输入,扫描一遍后交换,再扫描一次,然后综合两次结果得出按键号。你只做了一半,看你的程序你按第四行第四列的按键可能会有反应

出0入0汤圆

 楼主| 发表于 2013-3-30 20:05:19 | 显示全部楼层
那我还是分两步来写按键吧
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 21:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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