OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5742|回复: 7

求解,关于矩阵键盘

[复制链接]

19

主题

76

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2013-7-23
在线时间
0 小时
发表于 2013-7-23 10:54:32 | 显示全部楼层 |阅读模式
程序下载到单片机上,第一行(0,1,2,3)不能显示,其余都正常,,但是其他行的我是按第一行的复制过去的,为什么其他的都行,第一行的却不行呢?求大神打救啊!!
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int   
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
sbit dula=P2^6;
sbit wela=P2^7;
void delay(uint i)
{
uint x,y;
for(x=i;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar x)
{
dula=1;
P0=table[x];
dula=0;
P0=0xff;
wela=1;
P0=0x00;
wela=0;
delay(10);
}
void keyscan()
{
uchar key,temp;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
break;
case 0xde:
key=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
key=3;
break;
}
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
    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=4;
break;
case 0xdd:
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
key=7;
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=8;
break;
case 0xdb:
key=9;
break;
case 0xbb:
key=10;
break;
case 0x7b:
key=11;
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=12;
break;
case 0xd7:
key=13;
break;
case 0xb7:
key=14;
break;
case 0x77:
key=15;
break;
}
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
void main()
{
while(1)
{
keyscan();
}
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2013-7-23 14:52:16 | 显示全部楼层
晕 这不是郭天祥的范例么。看他的书啊。
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

11

主题

125

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2012-6-21
在线时间
8 小时
发表于 2013-7-23 18:24:52 | 显示全部楼层
楼主细心一点看看是不是 哪个代码抄错了!
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
//sbit dula=P2^6;
//sbit wela=P2^7;
//sbit key1=P3^4;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0};
uchar num,temp,num1;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar keyscan();
void display(uchar aa);
void main()
{
num=17;
P2=0;
P0=0;
P0=0xc0;

while(1)
{
display(keyscan());
}
}
void display(uchar aa)
{
P2=0;
P0=table[aa-1];
}
uchar keyscan()
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:num=1;
break;
case 0xde:num=2;
break;
case 0xbe:num=3;
break;
case 0x7e:num=4;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}

P1=0xfd;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:num=5;
break;
case 0xdd:num=6;
break;
case 0xbd:num=7;
break;
case 0x7d:num=8;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}


P1=0xfb;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
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=P1;
temp=temp&0xf0;
}
}
}


P1=0xf7;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
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=P1;
temp=temp&0xf0;
}
}
}
return num;

}
我用的是while来判断的,数码管显示键值,P1口是键盘扫描,P0口和P2口是数码管扫描。
回复 支持 反对

使用道具 举报

11

主题

125

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2012-6-21
在线时间
8 小时
发表于 2013-7-23 18:29:35 | 显示全部楼层
while判断的缺点是按键按下的时候数码管不亮了!
回复 支持 反对

使用道具 举报

19

主题

76

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2013-7-23
在线时间
0 小时
 楼主| 发表于 2013-7-24 09:34:17 | 显示全部楼层
回复【4楼】yubanbisheng:
---------------------------------
嗯嗯,谢谢
回复 支持 反对

使用道具 举报

5

主题

9

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-6-13
在线时间
0 小时
发表于 2013-7-26 10:11:57 | 显示全部楼层
回复【楼主位】chun_001:
---------------------------------
程序有点多给你一个简单点的程序练练,希望对你有用
/*-----------------------------------------------
       名称:矩阵键盘
       内容:通过反转法循环扫描矩阵键盘,并通过数码管显示数据
------------------------------------------------*/
#include<reg52.h> 

#define uchar unsigned char
#define uint  unsigned int

uchar const EL[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F

/*-----------------------------------------------
       延时程序
------------------------------------------------*/
void delay(uint j)
{
while(j--);
}
/*-----------------------------------------------
       键盘扫描程序
------------------------------------------------*/
uchar keyscan()
{
uchar cord_h,cord_l;
P0=0X00;
P2=3;
P3=0X0F;
cord_h=P3&0X0F;
if(cord_h!=0x0f)
{
delay(200);
if(cord_h!=0x0f)
{
cord_h=P3&0X0F;
P3=cord_h|0xf0;
cord_l=P3&0xf0;
return(cord_h+cord_l);
}
}return(0xff);
}
/*-----------------------------------------------
        主程序
------------------------------------------------*/
void main ()
{

 uchar key;
 2=0;        
 0=0X00;
 while(1)
{
 key=keyscan();  //调用键盘扫描,
 switch(key)
 {
  

case 0xee0=EL[0];break;//0按下相应的键显示相对应的码值
case 0xde0=EL[1];break;//1 按下相应的键显示相对应的码值 
case 0xbe0=EL[2];break;//2
case 0x7e0=EL[3];break;//3
case 0xed0=EL[4];break;//4
case 0xdd0=EL[5];break;//5
case 0xbd0=EL[6];break;//6
case 0x7d0=EL[7];break;//7
case 0xeb0=EL[8];break;//8
case 0xdb0=EL[9];break;//9
case 0xbb:P0=EL[10];break; 
case 0x7b:P0=EL[11];break; 
case 0xe7:P0=EL[12];break;
case 0xd7:P0=EL[13];break;
case 0xb7:P0=EL[14];break; 
case 0x77:P0=EL[15];break; 
  
 }
 }
}
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2013-7-29
在线时间
0 小时
发表于 2013-7-29 21:04:32 | 显示全部楼层
呵呵,你把插在电脑上的USB下载线拔了,就一切正常了.没骗你.因为第一行是TX还是RX,只要连在电脑上,你就肯定失效.这是硬件问题
回复 支持 反对

使用道具 举报

19

主题

76

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2013-7-23
在线时间
0 小时
 楼主| 发表于 2013-8-12 22:44:12 | 显示全部楼层
回复【7楼】疯子:
---------------------------------
真的耶 ==   高手,膜拜呀!!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表