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

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--);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
阿尔法粒子
1楼-- · 2019-07-15 21:36
求问啊!这个问题困扰我好久了==!
依然落叶飘零
2楼-- · 2019-07-16 02:41
具体什么情况我也没弄懂,不过有两点问题,一你输出扫描代码是要延时一段时间等电平稳定了才读输入情况。二抖动延时要5~10ms,你只延时了2ms左右,延时不够。
BBOYBL
3楼-- · 2019-07-16 06:02
while(temp!=0xf0)用IF会不会好点?

评分

参与人数 1积分 +10 收起 理由 zhou2sheng + 10 感谢您的参与,您的支持是我们最大的动力.

查看全部评分

吊兰,毛尖
4楼-- · 2019-07-16 11:33
你先把接线换一下,看看第一排的按键是不是好的。先排除硬件的因素。
youzizhile
5楼-- · 2019-07-16 11:37
 精彩回答 2  元偷偷看……
sdwflzg
6楼-- · 2019-07-16 13:59
你用的是usb下载线吧?把usb下载线拔下来就正常了,use转串口下载线芯片占用了部分端口,实验板反面有说明。

评分

参与人数 1积分 +10 收起 理由 zhou2sheng + 10 感谢您的参与,您的支持是我们最大的动力.

查看全部评分

一周热门 更多>