c51单片机矩形键盘检测问题 急急!!! 100
#include<reg51.h>#defineuintunsignedint#defineucharunsignedchar#defineduanP0uchartemp...
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define duan P0
uchar temp,num;
uchar code duanma[]={0x02,0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,
0x00,0x08};
void delayms(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
duan=0x02;
while(1)
{
P1=0x7f;
temp=P1;
temp=temp&0x0f;
while(temp!=0x0f)
{
delayms(5);
temp=P1;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0x77: num=1;
break;
case 0x7b: num=2;
break;
case 0x7d: num=3;
break;
case 0x7e: num=4;
break;
}
P0=duanma[num];
}
}
}
}
我折程序哪里有问题啊 找了2天了都没找到 显示的是一个数码管 可是怎么按第一排键数码管动都不动 展开
#define uint unsigned int
#define uchar unsigned char
#define duan P0
uchar temp,num;
uchar code duanma[]={0x02,0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,
0x00,0x08};
void delayms(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
duan=0x02;
while(1)
{
P1=0x7f;
temp=P1;
temp=temp&0x0f;
while(temp!=0x0f)
{
delayms(5);
temp=P1;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0x77: num=1;
break;
case 0x7b: num=2;
break;
case 0x7d: num=3;
break;
case 0x7e: num=4;
break;
}
P0=duanma[num];
}
}
}
}
我折程序哪里有问题啊 找了2天了都没找到 显示的是一个数码管 可是怎么按第一排键数码管动都不动 展开
3个回答
展开全部
因为我也刚好学到矩阵键盘扫描,但是我的代码成功了,所以和你一起探讨一下你的问题吧,
首先第一个问题应该是段选写了0x02..其实前面已经写了数组了直接引用不就好了嘛。
然后是矩阵键盘扫描的部分,你写的是0x7f,矩阵键盘扫描的原理应该是从底四位轮流输入低电平,然后再从高四位进行读取数据,检测到低电平时,说明该按键被按下。
那么在你的
P1=0x7f;
temp=P1;
temp=temp&0x0f;
后面应该用一个if判断语句,而不是直接进入while循环然后消抖,
你试试这样写
P1=0x7f;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delayms(5);
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0x77: num=1;
break;
case 0x7b: num=2;
break;
case 0x7d: num=3;
break;
case 0x7e: num=4;
break;
}
我也是初学 还不能判断是不是这个问题,你的写法和我学的有比较大的出入,你先试试看!
首先第一个问题应该是段选写了0x02..其实前面已经写了数组了直接引用不就好了嘛。
然后是矩阵键盘扫描的部分,你写的是0x7f,矩阵键盘扫描的原理应该是从底四位轮流输入低电平,然后再从高四位进行读取数据,检测到低电平时,说明该按键被按下。
那么在你的
P1=0x7f;
temp=P1;
temp=temp&0x0f;
后面应该用一个if判断语句,而不是直接进入while循环然后消抖,
你试试这样写
P1=0x7f;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delayms(5);
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0x77: num=1;
break;
case 0x7b: num=2;
break;
case 0x7d: num=3;
break;
case 0x7e: num=4;
break;
}
我也是初学 还不能判断是不是这个问题,你的写法和我学的有比较大的出入,你先试试看!
更多追问追答
追问
嗯,按逻辑推下去不该有问题啊,就算有问题那起码数码管该有变化啊,可是一点动静都没有,怀疑原理图或者板子接线有问题
你的代码我看看怎么写的
展开全部
最大的可能是P1口到键盘那根排线插反了,把某一头上下颠倒试试看?这样的话,应该那16个键的某些键有反应。
也可能那根排线有断线,可以换一根试试看。
也可能那根排线有断线,可以换一根试试看。
追问
正反都试过,十六个键盘一个都没反应,搞得我头都大了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2015-01-19
展开全部
恕本人拙见,毕业好几年了,突然有点回忆了,程序什么的都不会了呢:主程序的驱动数码管的P0是显示0吧,再看下面循环检测的程序,我好像看到从上到下没什么意义呢,temp还是0x7f,而且下面case程序无7f的值,不妨改一个值为7f,看看显示会不会有变化。哈哈,不对的地方指教哈
更多追问追答
追问
0X7f&0x0f是检测是否有键盘按下的,如果确实按下才会进入while循环
追答
你吧P1=0x7f放到while(1)上面,不要放到循环里面
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询