用stc89c52的单片机编写c语言的键盘扫描程序,为什么键盘扫描不成功呢??有没有哪位帮我看看?好的追加分

系统板上是4*4的矩阵键盘,行连接的是p2^0~p2^3,列连接的是p2^4~p2^7;数码管是四个,D1,D2,D3,D4分别接P1^0到P1^3,显示接P0口。这个程... 系统板上是4*4的矩阵键盘,行连接的是p2^0~p2^3,列连接的是p2^4~p2^7;
数码管是四个,D1,D2,D3,D4分别接P1^0到P1^3,显示接P0口。
这个程序运行后有led有显示,表示数码管D1被选中,但是按键无任何反应,需要继续改。那个case里我设了一个键的情况。
程序如下
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit p=P2;

uchar temp;

void delay(uchar t)//延时t ms
{
int a,b,c;
for(a=0;a<t;a--)
for(b=0;b<3;b--)
for(c=0;c<220;c--);
}

void main()
{
while(1)
{
P1=0xf7;//选中D1
p=0xff;
temp=p;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=p;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=p;
switch(temp)
{case 0xee:P0=0xf9;break; //数码管显示1
default: P0=0xc0;//数码管显示0
}
while(temp!=0xf0);
delay(5);
while(temp!=0xf0);
}
}

}
} //

在线等待。。。
展开
 我来答
miniapp1pwgfsq1ptknk
2011-08-03 · 超过19用户采纳过TA的回答
知道答主
回答量:48
采纳率:0%
帮助的人:43.5万
展开全部
sbit p=P2;这个能这样定义吗!!应该改为 define p P2。sbit是定义一个可寻址位的,P2不是一个位地址,而是一个字节地址,不能那样定义的,虽然编译通过,但是是错的,你先试试看,我这没硬件电路
查到一处了 "case 0xee" 这个应该改为 "case 0xe0",因为前面temp=temp&0xf0;已经将temp的低4位变为0了,后面的temp只能为0x*0,case 0xee 这个情况永远都无法实现的,所以说你按键了也没用,因为temp的值都是0x*0。
追问
恩 ,我把sbit p=P2去掉了,然后把p全改为P2了,编译还是不行。
不过那个 在switch语句前我又重新给temp赋值了呢,这样它返回值不应该是P2口的全部值么??不过我改了下0xe0 再编译,还是没反应啊。。。。
追答
我知道你错在哪里了
#include
#define uchar unsigned char
#define uint unsigned int
#define p P2 //这里改掉
void delay(uchar t)//延时t ms
{
int a,b,c;
for(a=0;a<t;a--)
for(b=0;b<3;b--)
for(c=0;c<220;c--);
}

void main()
{
uchar temp;
while(1)
{
P1=0xf7;//选中D1
p=0xfe; //这里原来是0xff,这里是关键!!!!
//二进制码为11111110,即置一行(或列)
//为底电平,这样按下键的时候,才能有反应啊
temp=p;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=p;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=p;
switch(temp)
{
case 0xee:P0=0xf9;break; //数码管显示1,
//这里不要改 default:P0=0xc0;//数码管显示0
}
while(temp!=0xf0);
delay(5);
while(temp!=0xf0);
}
}

}
} //
wuym519387718
2011-08-03 · TA获得超过110个赞
知道答主
回答量:109
采纳率:0%
帮助的人:63.9万
展开全部
P1=0xf7;//选中D1
p=0xff;
temp=p;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=p;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=p;
switch(temp)
{case 0xee:P0=0xf9;break; //数码管显示1
default: P0=0xc0;//数码管显示0
}
while(temp!=0xf0);
{
temp=P1;
temp=temp&0xf0;
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chenzhenlang
2011-08-03
知道答主
回答量:15
采纳率:0%
帮助的人:13.6万
展开全部
P=0xff;////按键无状态变化
//////
while(temp!=0xf0);
delay(5);
while(temp!=0xf0);
若检测到有按键按下,,将会死循环
追问
这个是参照郭天祥讲的,延时消抖,在按键松开的最后几毫秒里检测。
你是说这个时间里再有键按下??
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hongfeiqq
2011-08-03
知道答主
回答量:34
采纳率:0%
帮助的人:19.1万
展开全部
sbit p=P2; //sbit是用于位定义的,可以这样 #defind p P2
p=0xff; //高低位都是高电平可以检测到是那个键按下吗,应该 p=0xf0
追问
不是先送全高才能返回它的变化么??
追答
你的是4*4的矩阵键盘,如果为全高,那按下一个键后,哪个位会有变化呢!

while(temp!=0xf0) ; // 这条不是在检测P2口的高四位是否有变化吗!

如果P2的高四位为F,低四位为0,那么按下一个键后,高四位IO口才会因为检测到低电平而变化,不是吗!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
御天弟
2011-08-03 · 贡献了超过135个回答
知道答主
回答量:135
采纳率:0%
帮助的人:59.8万
展开全部
giout bsiture
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式