求解这个矩阵键盘程序哪里有问题?为什么运行不起来?(新手,求教,谢谢)
void delay(unsigned int i)
{
unsigned char j,k;
for(j=0;j<i;j++)
for(k=0;k<255;k++);
}
void main()
{
unsigned int h,l;
P2=0X00;
P3=0X00;
while(1)
{
P1=0XF0;
h=P1;
if(h!=0xf0)
{
delay(1000);
h=P1;
if(h!=0xf0)
{
h=h&0xf0; /*1110 0000*/
P1=0X0F; /*11101111*/
delay(1);
l=P1;
l=P1;
if(l!=0x0f)
{
delay(1000);
if(l!=0x0f)
{
l=l&0x0f;
h=h+l;
}
}
}
}
if(h==0x11)
{
P2=0XC0;
P3=0XFF;
delay(255);
}
}
}
亲,你好,共同学习下。给你发个程序,你试下,看行不?
void main()
{
unsigned int h,a;
P2=0X00;
P3=0X00;
while(1)
{
P1=0xf0;
h=P1;
h=h&0xf0;
if(h!=0xf0)
{
delay(5);//按键按下去抖
h=P1;
h=h&0xf0;
if(h!=0xf0)
{ h=P1;//若是第一个键按下h=1110 0000
P1=0X0F;
delay(5);
a=P1;
//a=P1;
a=a&0x0f;//若是第一个键按下a=00001110
if(a!=0x0f)
{
delay(5);
a=P1;
a=a&0x0f;
if(a!=0x0f)
{
a=P1;//a=00001110
h=h+a;//h+a=11101110
}
}
while(h!=0xf0)//松手检测
{
h=P1;
h=h&0xf0;
}
}
}
if(h==0xee)
{
P2=0XC0;//共阳极0
P3=0XFF;
delay(255);
}
}
}
跟我那个一样,P1端口有出现高低电平变化,而其他端口电平均不改变····
P2 P3你就一直没有改变他的值,就不会有高低变化哦,应该通过扫描哪个按键按下,来改变P2的值,才会有不同的数显示
//共阴数码管用P0口控制,P2口控制16个按键,当有键按下的时候数码管显示按键是第几个
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code SMG_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //共阴数码管的编码表
uint num;
void delay(uint z) //延时函数
{
uint x,y;
for(x=1;x<z;x++)
for(y=1;y<110;y++);
}
void dispiay(void)
{
uint temp;
// num=16;
P2=0xfe; //赋值,为了检测第一行
{
temp=P2; //读取数值
if(temp!=0xfe) //检测有按键按下
{
delay(10); //消抖
temp=P2; //读取数值
if(temp!=0xfe) //消抖后确定有按键按下
switch(temp)
{
case 0xee:num=0;break; //说明s1按下时
case 0xde:num=1;break; //说明s2按下时
case 0xbe:num=2;break; //说明s3按下时
case 0x7e:num=3;break; //说明s4按下时
}
while(P2!=0xfe); //松手检测
}
}
P2=0xfd; //赋值,为了检测第二行
{
temp=P2; //读取数值
if(temp!=0xfd) //检测有按键按下
{
delay(10); //消抖
temp=P2; //读取数值
if(temp!=0xfd) //消抖后确定有按键按下
switch(temp)
{
case 0xed:num=4;break; //说明s5按下时
case 0xdd:num=5;break; //说明s6按下时
case 0xbd:num=6;break; //说明s7按下时
case 0x7d:num=7;break; //说明s8按下时
}
while(P2!=0xfd); //松手检测
}
}
P2=0xfb; //赋值,为了检测第三行
{
temp=P2; //读取数值
if(temp!=0xfb) //检测有按键按下
{
delay(10); //消抖
temp=P2; //读取数值
if(temp!=0xfb) //消抖后确定有按键按下
switch(temp)
{
case 0xeb:num=8;break; //说明s9按下时
case 0xdb:num=9;break; //说明s10按下时
case 0xbb:num=10;break; //说明s11按下时
case 0x7b:num=11;break; //说明s12按下时
}
while(P2!=0xfb); //松手检测
}
}
P2=0xf7; //赋值,为了检测第四行
{
temp=P2; //读取数值
if(temp!=0xf7) //检测有按键按下
{
delay(10); //消抖
temp=P2; //读取数值
if(temp!=0xf7) //消抖后确定有按键按下
switch(temp)
{
case 0xe7:num=12;break; //说明s13按下时
case 0xd7:num=13;break; //说明s14按下时
case 0xb7:num=14;break; //说明s15按下时
case 0x77:num=15;break; //说明s16按下时
}
while(P2!=0xf7); //松手检测
}
}
}
void main (void)
{
num=16;
P0=SMG_Tab[num];
while(1)
{
dispiay();
P0=~SMG_Tab[num];
}
}
现在电脑有点问题不能给图,不好意思
矩阵键盘用扫描法,还有你那消斗时间也太长了吧?一般5~10ms