两种键盘,取键值一个正常,一个不正常?


用分离开关组成键盘矩阵,正常仿真;

用现成的4*4计算器键盘,不能读出正确键值.

为什么??????????

两种键盘功能不同.rar
(2008-07-14 22:23:09, Size: 15.8 KB, Downloads: 5)


我也来说两句 查看全部回复

最新回复

  • ybzjllj (2008-7-14 22:27:03)

    请高手分析一下,下面是截图与程序.

    CODE:


    #include <REGX51.H>
    void delay(unsigned int i){
    while(--i);
    }
    unsigned char getKeyNmu1(void){
    unsigned char a;
    P3=0x0f;
    if(P3!=0x0f){
      delay(200);
      if(P3!=0x0f){
       a=P3;
       P3=0xf0;
       a=~(P3^a);
       while(P3!=0xf0);
       P3=0xFF;
       return a;
      }
    }
    return 0xFF;
    }
    void displayKeyNum(unsigned char k){
      //P1=(P1&0xF0)|(k&0x0F);
      P1= k;
    }
    main(){      
      unsigned char a;
      while(1){
       a=getKeyNmu1();
      if(a!=0xFF)displayKeyNum(a);
      delay(5000);
      }
    }


    两种键盘不一样.JPG

  • tssing (2008-7-14 23:51:58)

    用中断做会更简单用中断做会更简单用中断做会更简单用中断做会更简单用中断做会更简单用中断做会更简单用中断做会更简单用中断做会更简单用中断做会更简单用中断做会更简单用中断做会更简单用中断做会更简单用中断做会更简单用中断做会更简单用中断做会更简单用中断做会更简单
  • ybzjllj (2008-7-15 06:38:50)

    我不喜欢中断键盘,因为它需要中断定义,还要占用一个中断源,要考虑中断函数与主函数参数传递问题.除非按键动作必须马上处理...............哎,话说远了..................

    我上面的问题,原因是什么?是代码不合理?
  • yubo2007 (2008-7-15 11:49:28)

    楼主,是你的程序不对!!

    #include<reg51.h>
    #define uchar unsigned char
    #define uint unsigned int;
    unsigned char i,j,k,l,n;
    unsigned int e;
    unsigned char lie,hang,m;
    unsigned char code a[]={0xF7,0xFB,0xFD,0xFE};
    unsigned char code table[16]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
    sbit p37=P3^7;
    sbit p36=P3^6;
    void delay(uchar n)
    {
    while(n--){
    for(i=125;i>0;i--);}//1ms
    }
    unsigned char scan(void)
    {
    P1=0xF0;
    if((P1&0xF0)!=0xF0)
    {
      delay(1);
      if((P1&0xF0)!=0xF0)
      lie=~(P1|0x0F);
      j=0;
      P1=a[j];
       while(j<=3)
       {
       if((P1&0xF0)!=0xF0){
          hang=~a[j];break;}
        else {j++1=a[j];}

       }
      m=hang+lie;
      return(m);
        }
    else return(0);

    }
    unsigned char zhi()
    {
    switch(m){
    case (0x08+0x80): k=0;break;
    case (0x08+0x40): k=1;break;
    case (0x08+0x20): k=2;break;
    case (0x08+0x10): k=3;break;
    case (0x04+0x80): k=4;break;
    case (0x04+0x40): k=5;break;
    case (0x04+0x20): k=6;break;
    case (0x04+0x10): k=7;break;
    case (0x02+0x80): k=8;break;
    case (0x02+0x40): k=9;break;
    case (0x02+0x20): k=10;break;
    case (0x02+0x10): k=11;break;
    case (0x01+0x80): k=12;break;
    case (0x01+0x40): k=13;break;
    case (0x01+0x20): k=14;break;
    case (0x01+0x10): k=15;break;
    }
    return(k);
    }
    void main(void)
    {

    while(1)
    {
    scan();

    zhi();

    l=2;

    if(k>9)
            {while(l--)
                    {P3=0x7F;
                    P2=table[k%10];
                    delay(15);
                    P3=0xBF;
                    P2=table[k/10];
                    delay(15);
                   
                    }
            }
    else
            {
            P3=0x7F;
            P2=table[k];
    }
    }
    //for(e=60000;e>0;e--);
    }
  • yubo2007 (2008-7-15 11:50:58)

  • yubo2007 (2008-7-15 11:51:33)

    你参考一下这个!!!
  • ybzjllj (2008-7-15 15:23:54)

    QUOTE:

    原帖由 yubo2007 于 2008-7-15 11:49 发表
    楼主,是你的程序不对!!
    ...
    我的程序只是没有把 "扫描码" 转成 "键值" ,

    当按 "分离元件" 的按键时,扫描码显示是正确的,

    按"组件键盘"时,扫描码就不正正确.
  • ybzjllj (2008-7-15 16:07:57)

    QUOTE:

    原帖由 yubo2007 于 2008-7-15 11:51 发表
    你参考一下这个!!!
    首先感谢你提供的程序,我用你的程序修改成我的试验目标.成功!

    CODE:


    #include<reg51.h>
    #define uchar unsigned char
    #define uint unsigned int;
    uchar code a[]={0xF7,0xFB,0xFD,0xFE};
    void delay(uint n){
    while(n--);
    }
    unsigned char scan(void){
    uchar m,j,lie,hang;
    P3=0xF0;
    if((P3&0xF0)!=0xF0){
      delay(200);
      if((P3&0xF0)!=0xF0) lie=~(P3|0x0F);
      j=0;
      P3=a[j];
      while(j<=3){
       if((P3&0xF0)!=0xF0){
        hang=~a[j];break;
       }else{
        j++;P3=a[j];
       }
      }
      m=hang+lie;
      return(m);
        }else return(0xFF);
    }

    void main(void){
    unsigned char a;
      while(1){
       a=scan();   //我只想显示键码,没转换成键值.
      if(a!=0xFF)P1=a;
      //delay(5000);
      }
    }
    你用的是"键扫描"方式,我用的是"键反转"方式.而且我的代码用分离键是成功的,怪事....................
    既然用你的代码能成功,也说明我的代码有瑕疵!!!!!!!
    努力找一找............