智能车制作

标题: 关于xs128矩阵键盘的问题 [打印本页]

作者: 奔逸绝尘子不语    时间: 2014-5-11 21:11
标题: 关于xs128矩阵键盘的问题
感觉逻辑没问题,可是有时会显示错误,比如12会显现成13,请大家指教一下,还有,现在想改成中断方式,没成功,xs128,请大神们指教,谢谢,随后附上源程序
作者: 奔逸绝尘子不语    时间: 2014-5-11 21:17
#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);
    }
   
  }
}

   
   
作者: tearedice    时间: 2014-5-12 14:55
本帖最后由 tearedice 于 2014-5-12 14:58 编辑

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




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2