智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1381|回复: 2
打印 上一主题 下一主题

关于xs128矩阵键盘的问题

[复制链接]

15

主题

223

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1451
威望
737
贡献
426
兑换币
424
注册时间
2013-9-25
在线时间
144 小时
跳转到指定楼层
1#
发表于 2014-5-11 21:11:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
感觉逻辑没问题,可是有时会显示错误,比如12会显现成13,请大家指教一下,还有,现在想改成中断方式,没成功,xs128,请大神们指教,谢谢,随后附上源程序
回复

使用道具 举报

15

主题

223

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1451
威望
737
贡献
426
兑换币
424
注册时间
2013-9-25
在线时间
144 小时
2#
 楼主| 发表于 2014-5-11 21:17:15 | 只看该作者
#include <hidef.h>
#include  <MC9S12XS128.h>
#include "OLED.h"
#include "PWM.h"
#include "math.h"

#define TESTPORT PORTA
uchar temp=0;
uchar key=0xff;
uchar key_1,key_2;
byte f[3];
byte ff[2];

void delay_0(uchar i)
{     uchar j=100;   
      while(i--)   
      while(j--);         
}
uchar keyscan(void)
{
  delay_0(15);
  DDRA=0xff;
  TESTPORT=0xF0;//行扫描
  DDRA=0x00;
  
  delay_0(5);
  
          temp=TESTPORT;
         
          temp=temp&0xF0;
         
          temp=~((temp>>4)|0xF0);//读取列值
         
          switch(temp)
          {
            case 1:key=0;break;
            case 2:key=1;break;
            case 4:key=2;break;
            case 8:key=3;break;
            default:key=0xff;break;
          }
           
           DDRA=0xff;
           
           TESTPORT=0x0F;//列扫描
           DDRA=0x00;
           
           delay_0(5);
           
           temp=TESTPORT;
           temp=temp&0x0F;
           temp=~(temp|0xF0);//读取行值
           
           switch(temp)
           {
              case 1:key=key+0;break;
              case 2:key=key+4;break;
              case 4:key=key+8;break;
              case 8:key=key+12;break;
              default:key=0xff;break;
           }
           
            while(TESTPORT!=0xF0)//判断按键是否释放
            {
              delay_0(5);
              DDRA=0xff;
              TESTPORT=0xF0;
              DDRA=0x00;               
            }

    return key;
}
uchar key_judge()
{
    DDRA=0xf0;
    TESTPORT=0xF0;
    DDRA=0x00;
    delay(1);
    if(TESTPORT!=0xF0)
    delay(1);
   
    if(TESTPORT!=0xF0)
    {//是否有键按下
        return 1;
    }
    else
    {
        return 0;
    }//如果按键释放则返回键值
}
uchar i;
uchar j,kk[]={49,50,51,65,52,53,54,66,55,56,57,67,42,48,35,68};

void main(void)
{
   set_80Mhz();
   
   LCD_Init();       //LCD初始化
   
   EnableInterrupts;
  while(1)
  {
       key_flag=0;
      key_1=keyscan();
      j=kk[key_1];
      key_2=key_1+1;         
      
      i=key_judge();  //i 可用作指示是否有键按下
     
      f[0]=key_2/10+'0';
      f[1]=key_2%10+'0';
      f[2]='\0'; //'\0'表示结束,'0'表示48,0的ascii码值
      
      LCD_P8x16Str(0,0,"i:");
      LCD_P8x16Str(40,0,f);
      
      ff[0]=j;
      ff[1]='\0'; //'\0'表示结束,'0'表示48,0的ascii码值
      
      LCD_P8x16Str(0,2,"j:");
      LCD_P8x16Str(40,2,ff);
    }
   
  }
}

   
   
回复 支持 反对

使用道具 举报

15

主题

446

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6597

论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章

威望
4213
贡献
1314
兑换币
883
注册时间
2012-3-6
在线时间
535 小时
3#
发表于 2014-5-12 14:55:03 | 只看该作者
本帖最后由 tearedice 于 2014-5-12 14:58 编辑

按键检测 放到定制器中断中也行 每0.2秒 检测一次,按住按键 变量值可以一直加 或者减 很爽的
端口的上下拉电阻很重要的,实在不知道怎么设置,你就外接个上下拉电阻。
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-10-3 07:26 , Processed in 0.042058 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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