微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求问为何矩阵键盘中第一行无法正常使用~

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

时间:10-02 整理:3721RD 点击:
而同样的程序复制给了后三行,全能正常使用呢。
程序如下
#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--);
}

求问啊!这个问题困扰我好久了==!

具体什么情况我也没弄懂,不过有两点问题,一你输出扫描代码是要延时一段时间等电平稳定了才读输入情况。二抖动延时要5~10ms,你只延时了2ms左右,延时不够。

while(temp!=0xf0)用IF会不会好点?

你先把接线换一下,看看第一排的按键是不是好的。先排除硬件的因素。

不知道你的电路图是怎么连接的?如果其他语句没有问题,那就是第一行的检测或者数值错误,在检查下

你用的是usb下载线吧?把usb下载线拔下来就正常了,use转串口下载线芯片占用了部分端口,实验板反面有说明。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top