打印

求教51单片机学习板3*4矩阵键盘检测问题

[复制链接]
2236|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
J-pcy|  楼主 | 2012-4-6 08:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
P1^0空,用的是P1^1-7口。这是我写的程序,我先给一行送低电平,检测列。结果第一列0,4,8。显示不了,其他列都正常显示,而且按下第一列的键第一次没有反应,再去按其他键先显示那个刚刚按下的第一列的数,之后再按又显示自己的键值。
我换个先给列送低电平的,又完全好了。求教。。                                                
本人第一次发帖,如有不当,请多包涵。
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint z);
void display(uchar);
sbit LE = P1^0;
uchar code table[] = {
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
uchar num,temp,key;
void main()
{

P0=0xc0;

while(1)

{

P3=0xfd;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(10);


temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{


temp=P3;

switch(temp)

{

case 0xed:key=0;break;

case 0xdd:key=1;break;

case 0xbd:key=2;break;

case 0x7d:key=3;break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

display(key);

}



}



P3=0xfb;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(10);


temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{


temp=P3;

switch(temp)

{

case 0xeb:key=4;break;

case 0xdb:key=5;break;

case 0xbb:key=6;break;

case 0x7b:key=7;break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

display(key);

}



}



P3=0xf7;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(10);


temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{


temp=P3;

switch(temp)

{

case 0xe7:key=8;break;

case 0xd7:key=9;break;

case 0xb7:key=10;break;

case 0x77:key=11;break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

display(key);

}



}

}

}

void display(uchar num)
{

P0=table[num%16];
}


void delay(uint z)
{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);
}

相关帖子

沙发
coody| | 2012-4-6 09:24 | 只看该作者
这么复杂。。。
行列扫描的键,如果只考虑单键按下,最简单的是分别扫描行列1次,就可以的到按下的键。

使用特权

评论回复
板凳
小S| | 2012-4-6 09:58 | 只看该作者
看看我写的,有问题的话还请指教!!!

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
/*uchar code wei[]={
0xe3,0xe7,0xeb,0xef,
0xf3,0xf7,0xfb,0xff};*/
uchar code shuzi[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0,
0x76,0x79,0x38,0x3f};
uchar aa,bb,cc;
uchar keyscan();
void delay (uint c);
void display(uchar cc);
void main()
{       
        bb=17;
        P2=0xf7;
        P0=0;
       
        while(1)
                {       
                        display(keyscan());
                       
                }
}



uchar keyscan()
{
                        P1=0xfd;
                        aa=P1;
                        aa=aa&0xf0;
                        while(aa!=0xf0)
                                {       
                                        delay(5);
                                        aa=P1;
                                        aa=aa&0xf0;
                                        while(aa!=0xf0)
                                                {       
                                                        aa=P1;
                                                        switch(aa)
                                                                        {
                                                                                case 0xed:bb=1;
                                                                                        break;
                                                                                case 0xdd:bb=2;
                                                                                        break;
                                                                                case 0xbd:bb=3;
                                                                                        break;
                                                                                case 0x7d:bb=4;
                                                                                        break;       
                                                                        }
                                                        aa=0xf0;
                                                }
                                }
                        P1=0xfb;
                        aa=P1;
                        aa=aa&0xf1;
                        while(aa!=0xf0)
                                {       
                                        delay(5);
                                        aa=P1;
                                        aa=aa&0xf0;
                                        while(aa!=0xf0)
                                                {       
                                                        aa=P1;
                                                        switch(aa)
                                                                        {
                                                                                case 0xeb:bb=5;
                                                                                        break;
                                                                                case 0xdb:bb=6;
                                                                                        break;
                                                                                case 0xbb:bb=7;
                                                                                        break;
                                                                                case 0x7b:bb=8;
                                                                                        break;       
                                                                        }
                                                        aa=0xf0;
                                                }
                                }

                        P1=0xf7;
                        aa=P1;
                        aa=aa&0xf1;
                        while(aa!=0xf0)
                                {       
                                        delay(5);
                                        aa=P1;
                                        aa=aa&0xf0;
                                        while(aa!=0xf0)
                                                {       
                                                        aa=P1;
                                                        switch(aa)
                                                                        {
                                                                                case 0xe7:bb=9;
                                                                                        break;
                                                                                case 0xd7:bb=10;
                                                                                        break;
                                                                                case 0xb7:bb=11;
                                                                                        break;
                                                                                case 0x77:bb=12;
                                                                                        break;       
                                                                        }
                                                        aa=0xf0;
                                                }
                                }
return bb;
}




void delay (uint c)//子函数:延时函数
{
        uint a,b;
        for (a=100;a>1;a--)
                for (b=c;b>1;b--);
}               

void display(uchar cc)
{
        P0=shuzi[cc-1];       
}

使用特权

评论回复
地板
zd420325| | 2012-4-6 11:38 | 只看该作者
亲,你能标注下吗?还有亲,你是扫描的不正确还是显示的不正确呢?

使用特权

评论回复
5
J-pcy|  楼主 | 2012-4-6 11:48 | 只看该作者
对啊,是这样的呀,给一行送低电平,然后检测列确定具体哪一个。。。

使用特权

评论回复
6
J-pcy|  楼主 | 2012-4-6 11:51 | 只看该作者
4楼,不好意思,没有养成标注的好习惯,以后会注意多谢提醒。具体我也不清楚。。放到学习板上就出问题了。

使用特权

评论回复
7
J-pcy|  楼主 | 2012-4-6 11:55 | 只看该作者
。。。其实我们写的是一样的额。只是变量不同。。

使用特权

评论回复
8
小S| | 2012-4-7 00:35 | 只看该作者
我的可以工作  没问题的啊   不过抽时间 我要再加个松手检测

使用特权

评论回复
9
550705198| | 2012-5-25 15:18 | 只看该作者
这个程序不对吧,为什么我运行不出来

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

7

帖子

0

粉丝