求问为何矩阵键盘中第一行无法正常使用~

2019-07-15 21:00发布

而同样的程序复制给了后三行,全能正常使用呢。。。。

程序如下
#include<reg52.h>
sbit d1=P0^0;
sbit key1=P3^4;
sbit dula=P2^6;
sbit wela=P2^7;
unsigned char temp,x,y,num;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void display(unsigned char x,unsigned char y);
void delay(unsigned int z);
void main()
{
        while(1)
        {
                P3=0xfe;//0xfe=11111110
                temp=P3;
                temp=temp&0xf0;//0xf0=11110000做“与”的操作
                while(temp!=0xf0)
                {
                        delay(5);
                        temp=P3;
                        temp=temp&0xf0;
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                switch(temp)
                                {
                                        case 0xee: //第一个键按下去则为11101110(由P3^7读到P3^0)
                                                num=1;
                                                break;
                                        case 0xde:
                                                num=2;
                                                break;
                                        case 0xbe:
                                                num=3;
                                                break;
                                        case 0x7e:
                                                num=4;
                                                break;
                                }
                                while(temp!=0xf0)//松手检测
                                {
                                        temp=P3;
                                        temp=temp&0xf0;
                                }
                        }
                }

//检测第二行
                P3=0xfd;//11111101
                temp=P3;
                temp=temp&0xf0;
                while(temp!=0xf0)
                {
                        delay(5);
                        temp=P3;
                        temp=temp&0xf0;
                        while(temp!=0xf0)
                        {
                                temp=P3;//跳出检测和防颤抖的循环
                                switch(temp)
                                {
                                        case 0xed: //第一个键按下去则为11101110(由P3^7读到P3^0)
                                                num=5;
                                                break;
                                        case 0xdd:
                                                num=6;
                                                break;
                                        case 0xbd:
                                                num=7;
                                                break;
                                        case 0x7d:
                                                num=8;
                                                break;
                                }
                                while(temp!=0xf0)//松手检测
                                {
                                        temp=P3;
                                        temp=temp&0xf0;
                                }
                        }
                }

  //检测第三行
                P3=0xfb;
                temp=P3;
                temp=temp&0xf0;//0xf0=11110000做“与”的操作
                while(temp!=0xf0)
                {
                        delay(5);
                        temp=P3;
                        temp=temp&0xf0;
                        while(temp!=0xf0)
                        {
                                temp=P3;//跳出检测和防颤抖的循环
                                switch(temp)
                                {
                                        case 0xeb:
                                                num=9;
                                                break;
                                        case 0xdb:
                                                num=10;
                                                break;
                                        case 0xbb:
                                                num=11;
                                                break;
                                        case 0x7b:
                                                num=12;
                                                break;
                                }
                                while(temp!=0xf0)//松手检测
                                {
                                        temp=P3;
                                        temp=temp&0xf0;
                                }
                        }
                }

                P3=0xf7;
                temp=P3;
                temp=temp&0xf0;//0xf0=11110000做“与”的操作
                while(temp!=0xf0)
                {
                        delay(5);
                        temp=P3;
                        temp=temp&0xf0;
                        while(temp!=0xf0)
                        {
                                temp=P3;//跳出检测和防颤抖的循环
                                switch(temp)
                                {
                                        case 0xe7:
                                                num=13;
                                                break;
                                        case 0xd7:
                                                num=14;
                                                break;
                                        case 0xb7:
                                                num=15;
                                                break;
                                        case 0x77:
                                                num=16;
                                                break;
                                }
                                while(temp!=0xf0)//松手检测
                                {
                                        temp=P3;
                                        temp=temp&0xf0;
                                }
                        }
                }  
                        x=num/10;
                        y=num%10;
                        display(x,y);
        }
}
void display(unsigned char x,unsigned char y)
{
        wela=1;
        P0=0xfe;
        wela=0;
        dula=1;
        P0=table[x];
        dula=0;
        delay(5);
        wela=1;
        P0=0xfd;
        wela=0;
        dula=1;
        P0=table[y];
        dula=0;
        delay(5);
}
void delay(unsigned int z)
{
        unsigned int xx,yy;
        for(xx=z;xx>0;xx--)
                for(yy=50;yy>0;yy--);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。